Compare commits

...
71 Commits
Author SHA1 Message Date
Github Actions 8475130a22 [CI Skip] release/stable 6.2.1
skip-checks: true
2021-10-04 08:33:37 +00:00
Jaco a7e824ff09 6.2.1 (#4016)
* 6.2.1

* CHANGELOG

* Bump static metadata

* CHANGELOG
2021-10-04 11:17:55 +03:00
Alexander Popiak 9d5fb2bf72 Add asset id in signing (#4009)
* add assetId to SignerOptions

* pull assetId into extrinsic signing

* set assetId to optional AnyNumber throughout

* add logging of extrinsic options

* add assetId to _injectSignature & add getters

* re-add import

* longer doc comments
2021-10-04 10:02:28 +03:00
Github Actions 2cf0e306dd [CI Skip] release/beta 6.1.3-3
skip-checks: true
2021-10-01 10:17:38 +00:00
Jaco 72d5330727 Use lookup types in derives (#4012)
* Use lookup types in derives

* additional

* society
2021-10-01 13:02:24 +03:00
Github Actions 1c3bdda08f [CI Skip] release/beta 6.1.3-2
skip-checks: true
2021-10-01 08:51:17 +00:00
Jaco 668ad3dfe5 Handle plain multi queries diguised as map-form (#4011) 2021-10-01 11:29:12 +03:00
Github Actions 651afaeb9a [CI Skip] release/beta 6.1.3-1
skip-checks: true
2021-09-30 06:54:52 +00:00
Jaco 5036aa9ef4 Better error messages for misformed queries (#4007)
* Better error messages for misformed queries

* Cater for raw function (no meta)
2021-09-30 09:39:13 +03:00
Github Actions 3598cc25f4 [CI Skip] release/beta 6.1.3-0
skip-checks: true
2021-09-29 12:28:47 +00:00
Jaco 987a2ec2df Adjust multi to infer return types (#4002)
* Adjust multi to infer return types

* some linting

* Additional

* Dedupe
2021-09-29 14:07:29 +02:00
Github Actions 389c4c5255 [CI Skip] release/stable 6.1.2
skip-checks: true
2021-09-29 08:08:58 +00:00
Jaco 493287cedf 6.1.2 (#4001) 2021-09-29 09:50:25 +02:00
Github Actions fe52dc8006 [CI Skip] release/beta 6.1.2-3
skip-checks: true
2021-09-29 06:08:50 +00:00
Jaco f26008ab95 Fix .at queries/decoration for pre-V13 metadata (#4000)
* Fix `.at` queries/decoration for pre-V13 metadata

* fields fix (or rather... protection against upcoming change)
2021-09-29 07:46:13 +02:00
Github Actions 0952720237 [CI Skip] release/beta 6.1.2-2
skip-checks: true
2021-09-27 11:20:10 +00:00
Jaco 04058fe95e Bump metadata (#3996)
* Bump metadata

* Ensure WrapperOquaque is applied

* Use field for mapping

* Handle WrapperOpaque

* Adjust
2021-09-27 13:02:18 +02:00
Github Actions eb96371e59 [CI Skip] release/beta 6.1.2-1
skip-checks: true
2021-09-27 09:20:29 +00:00
Jaco a313fe13e7 Add support for WrapperOpaque (#3997)
* Add support for WrapperOpaque

* Dedupe dual params

* Adjust case

* Re-adjust to Vec
2021-09-27 11:02:37 +02:00
Github Actions 243c263485 [CI Skip] release/beta 6.1.2-0
skip-checks: true
2021-09-27 06:31:40 +00:00
Jaco 311d8b792c Additional types for bridges (#3995) 2021-09-27 08:08:42 +02:00
Github Actions 878f631745 [CI Skip] release/stable 6.1.1
skip-checks: true
2021-09-27 05:54:41 +00:00
Jaco d7753839a2 6.1.1 (#3994)
* 6.1.1

* bumps
2021-09-27 07:36:47 +02:00
Github Actions fc74d88bbb [CI Skip] release/beta 6.0.6-4
skip-checks: true
2021-09-24 08:24:35 +00:00
HackFisher 47bbeee14b fix OutboundLaneData types (#3992) 2021-09-24 10:05:56 +02:00
Github Actions ba01620ba1 [CI Skip] release/beta 6.0.6-3
skip-checks: true
2021-09-23 09:30:55 +00:00
Jaco 6e66387a8d CHANGELOG (#3986) 2021-09-23 11:10:10 +02:00
Github Actions c58687b3c6 [CI Skip] release/beta 6.0.6-2
skip-checks: true
2021-09-22 09:22:01 +00:00
Jaco 2801088b0a Scale-info v0 -> v1 conversion (as needed by contracts) (#3987)
* Scale-info v0 -> v1 conversion (as needed by contracts)

* Renames

* V1 types same as v0 where applicable
2021-09-22 11:01:39 +02:00
Github Actions fc5af92a03 [CI Skip] release/beta 6.0.6-1
skip-checks: true
2021-09-22 04:07:20 +00:00
Furqan A 8f8bb2aa23 fix: fixed 404 to the docs from the api readme (#3985) 2021-09-22 06:48:18 +03:00
Github Actions 3f69b3fc73 [CI Skip] release/beta 6.0.6-0
skip-checks: true
2021-09-20 18:48:01 +00:00
Jaco 4ea170a83a Add childstate_getStorageEntries RPC (#3980)
* Add `childstate_getStorageEntries` RPC

* Remove extra ,
2021-09-20 20:33:30 +02:00
Github Actions 26649c429a [CI Skip] release/stable 6.0.5
skip-checks: true
2021-09-20 13:57:16 +00:00
Jaco 7c57778389 6.0.5 (#3977) 2021-09-20 15:38:54 +02:00
Github Actions dbb5d66de3 [CI Skip] release/stable 6.0.4
skip-checks: true
2021-09-20 09:10:12 +00:00
Jaco 6bc92a6d31 6.0.4 (#3975)
* 6.0.4

* Update CHANGELOG.md
2021-09-20 10:53:34 +02:00
Github Actions 6462327ea5 [CI Skip] release/beta 6.0.4-1
skip-checks: true
2021-09-20 06:17:50 +00:00
Jaco 3b4c2ac323 Extract getSiName conversion (#3974) 2021-09-20 07:56:33 +02:00
Github Actions d0ecfdafc1 [CI Skip] release/beta 6.0.4-0
skip-checks: true
2021-09-20 05:19:55 +00:00
Jaco 870bb8d3cb User api.at for all .at queries (#3973) 2021-09-20 06:59:35 +02:00
Github Actions 2fdb68d3bc [CI Skip] release/stable 6.0.3
skip-checks: true
2021-09-19 19:47:24 +00:00
Jaco 6ef410e375 Share TypeSpec between registry instances (#3972)
* Share TypeSpec between registry instances

* 6.0.3
2021-09-19 21:29:11 +02:00
Github Actions 962c741139 [CI Skip] release/beta 6.0.3-0
skip-checks: true
2021-09-19 06:38:13 +00:00
Jaco 598e69002a Formatting for metadata documentation (#3969)
* Formatting for metadata documentation

* unwrap
2021-09-19 08:18:13 +02:00
Github Actions f6e50f14b5 [CI Skip] release/stable 6.0.2
skip-checks: true
2021-09-18 09:12:35 +00:00
Jaco caec49a8dc Fix Substrate key generation (#3968)
* Fix Substrate key generation

* 6.0.2
2021-09-18 10:56:35 +02:00
Github Actions 0865b91f88 [CI Skip] release/stable 6.0.1
skip-checks: true
2021-09-18 05:26:37 +00:00
Jaco 6b45d5606d 6.0.1 (#3966) 2021-09-18 08:08:57 +03:00
Github Actions a22f66f044 [CI Skip] release/beta 5.9.2-10
skip-checks: true
2021-09-17 14:58:58 +00:00
Jaco 41fd67c24e Bump deps (#3965) 2021-09-17 16:40:46 +02:00
Github Actions 19e7d6dbdb [CI Skip] release/beta 5.9.2-9
skip-checks: true
2021-09-17 05:02:17 +00:00
Jaco 8fea8872fc Additional augmentation fixes (#3964)
* Additional augmentation fixes

* Update packages/api/src/checkTypes.manual.ts
2021-09-17 06:44:49 +02:00
Github Actions d17fc3b63b [CI Skip] release/beta 5.9.2-8
skip-checks: true
2021-09-17 04:18:28 +00:00
Jaco f8e012cf87 Ensure lookup augmentation is exported (#3963) 2021-09-17 05:59:59 +02:00
Github Actions 830af4a928 [CI Skip] release/beta 5.9.2-7
skip-checks: true
2021-09-16 05:14:13 +00:00
Jaco 345c536380 Fix v13 toCallsOnly path (#3957) 2021-09-16 06:57:13 +02:00
Github Actions d527a02d2f [CI Skip] release/beta 5.9.2-6
skip-checks: true
2021-09-15 17:05:19 +00:00
Jaco 22aafbdd4c Parsing for metadata v14 (#3759)
* Adjust

* Better, need a BoundedVec solution...

* Composites

* Storage optional types

* Better... not perfect

* v14 tests passing

* Always perform asLatest

* Keep portable registry seperate

* Cleanup derived types

* Cleanups

* Adjust

* Cleanups

* Pass wraps

* Rename types (PortableRegistry) -> lookup

* Back on-track...

* SiLookup strings

* Allow building

* unsafe create on registry

* createTypeUnsafe typing

* Adjust

* Fix bool check

* Remove WrappedConstructor

* Additional

* Additional cleanups

* On-demand even type creation

* Rework

* Adjust

* Revert createClass to master (with adjustments)

* Running through v14

* Registry from master

* Run against v14

* Adjust

* Adjust

* Adjust generation (non-complete)

* Adjust

* Definition from metadata (round 1)

* Some linting fixes

* v13

* Adjust

* Dedupe

* Some linting

* Additional linting (md generation, not all)

* md additional

* calls update

* Additional linting

* Cleanups

* Remove extra arg

* Remove unneeded assert

* Revert < 12 index adjustments

* Cleanups

* v13 compat types

* Some tests

* Registry revert

* Additional test fixes

* Adjust sorting

* Adjust tests with lookups

* CodeClimate cleanups

* Additional tests

* Compat with prev-generation args

* Error & events compat args

* Fix Error/Event metadata creation

* Fix lookup circular

* Registry types

* Adjust

* Adjust lookup generation

* Short-circuit full type (with lookupIndex)

* Defaults for type expansion

* Tuple with extra spaces removed

* Fill in generated types

* Checks

* Adjust generation

* Adjust tests

* Adjust

* Adjust type encoding

* Adjust

* Use registry for name generation

* Update v13 lookup generation

* Adjust looup with typeDef (optional)

* Format lookup definitions

* Start with TS interface generation

* Adjust

* Adjust

* Adjust

* Don't short-cisrcuit type evaluation

* Adjust

* Correct plain imports

* Adjust

* Don't remove already-set lookupName

* Bytes

* Cleanups

* Adjust with unused

* Embed non-named structs

* Enum without name throws error

* Case-sensitivity on path duplication

* s/lookupNameOrig/lookupNameRoot/

* Don't export Lookup* type interfaces

* Shortcut lookup

* Adjust

* Revert api/Decorate

* Adjust import name generation

* Don't clobber root lookups

* Root exports

* Remove duplicated fields creation

* Adjust less-important name parts

* Cleanups & imports

* Adjust with correct imports

* Storage optionality

* Rebuild, fix (some) tests

* Extract identity BitFlags

* Additional cleanups

* Adjust

* No IdentityFields override

* v13 for extrinsic test

* Dedupe getUniqTypes

* Simplify?

* Adjust

* Update sorting

* Adjust expansion

* Dedupe

* Strip generics, sub-part * matching

* Name matching

* Align

* Adjust set matching

* hex/json split

* naming

* v13 for extrinsic injection test

* Adjust test signature

* Dedupe tests

* Adjust

* Update import

* augment @polkadot/types/lookup

* Sort import names

* Handle BitSequence in PortableRegistry

* Use Kusama-dev v14 metadata

* Merge bitSequence support

* Polkadot/Substrate split

* Template formatting

* Hobbling along

* Adjust

* Recode subs

* Fix circular in dual fashion

* Adjust

* Also generate Substrate

* Exclude Substrate types from Polkadot

* Remove duplicate phantoms

* Cleanup lookup typegen

* Additional

* Extract names with params (as applicable)

* Ensure path is always available

* renames

* Metadata v14 only has combined Map

* v14 Map conversion de-duped

* Substrate Map conversion

* v13 tests

* Apply suggestions from code review

* Housekeeping

* v14 bump

* NMap -> Map (& others removed)

* Adjust generation

* Decorate linting

* Tuple & non-tuple types

* hashers check

* Condense

* Additional asTuple check

* Consistent pre-v14 Map handling

* Fix metadata tests

* Fix (some) tests

* Fix test expectations

* Fail create early

* Additional fixes

* Additional

* Movement

* Remove CodecArg

* Dump it

* Apply param expansion

* Remove only

* Allow no-args to StorageKey

* linting

* multi fixes

* Map adjustments

* Rebuild

* Rebuild

* Rebuild

* Latest

* Bump metadata

* Rewrite

* Fix lookup formatting

* Rebuild after merge

* Latest substrate v14

* Rebuild

* Rebuild (+ no enum trailing ,)

* trigger

* Fix JSON checks

* Remove unneeded check

* Bump Kusama/Polkadot

* Dedupe testUtil

* Metadata v14
2021-09-15 19:46:48 +03:00
Github Actions 88e5b26532 [CI Skip] release/beta 5.9.2-5
skip-checks: true
2021-09-15 09:46:16 +00:00
Jaco a203168126 Add RuntimeEnvironmentUpdated to Digest (#3955)
* Add RuntimeEnvironmentUpdated to Digest

* CHANGELOG
2021-09-15 11:34:13 +02:00
Github Actions 538544be84 [CI Skip] release/beta 5.9.2-4
skip-checks: true
2021-09-15 08:58:54 +00:00
Jaco 264bbf12c9 Bump static metadata (#3954) 2021-09-15 10:49:18 +02:00
Github Actions 5c144a8ae7 [CI Skip] release/beta 5.9.2-3
skip-checks: true
2021-09-15 03:43:12 +00:00
Ian He f28d648fac HttpProvider support clone() (#3949)
* HttpProvider support clone()

* fix lint
2021-09-15 06:31:35 +03:00
Github Actions f695cd0835 [CI Skip] release/beta 5.9.2-2
skip-checks: true
2021-09-14 12:00:39 +00:00
Jaco 44fdbdffd5 Bump deps (#3952) 2021-09-14 13:48:53 +02:00
Github Actions ee5ae49df7 [CI Skip] release/beta 5.9.2-1
skip-checks: true
2021-09-14 06:53:58 +00:00
Jaco febcabe109 Allow null values in bundles min/max (#3950)
* Allow null values in bundles min/max

* Adjust bundle type definition

* Backwards compat

* Lenient types
2021-09-14 08:43:56 +02:00
Github Actions 367efda128 [CI Skip] release/beta 5.9.2-0
skip-checks: true
2021-09-13 11:58:27 +00:00
Jaco 3583e758cd IdentityInfo <= Substrate 198 (#3947) 2021-09-13 13:46:49 +02:00
224 changed files with 34728 additions and 13270 deletions
+8 -2
View File
@@ -1,4 +1,4 @@
32 33
1.4.2 1.4.2
1.6.2 1.6.2
1.11.2 1.11.2
@@ -28,4 +28,10 @@
5.3.2 5.3.2
5.5.2 5.5.2
5.8.2 5.8.2
5.8.3 5.8.3
6.0.2
6.0.3
6.0.4
6.0.5
6.1.2
+104 -1
View File
@@ -1,8 +1,111 @@
# CHANGELOG # CHANGELOG
## 6.2.1 Oct 4, 2021
Upgrade priority: Low. Maintenance updates.
Contributed:
- Cater for new asset fee payment extension (Thanks to https://github.com/apopiak)
Changes:
- Extend error messages for malformed `queryMulti` inputs
- Correctly handle non-map queries passed to `queryMulti` in map form
- Use new metadata v14 lookup type in derive results
- Adjust definitions to infer TS types in `.multi` queries
- Fix TS lookup enum generation with nested Option & Tuple
- Bump static metadata for latest Substrate, Polkadot & Kusama
## 6.1.2 Sep 29, 2021
Upgrade priority: Low. Recommended for 6.x users using historic queries.
Changes:
- Fix `.at` queries/decoration for pre-V13 metadata
- Added `BridgeMessageId` & `SpecVersion` types for bridges
- Added `WrapperOpaque` encoding/decoding (as per latest Substrate)
- Bump static metadata for latest Substrate, Polkadot & Kusama
## 6.1.1 Sep 27, 2021
Upgrade priority: Low. Minor maintenance changes from the 6.0.x versions.
Contributed:
- Adjust bridges `OutboundLaneData` type (Thanks to https://github.com/HackFisher)
- Fix README 404 (Thanks to https://github.com/nblogist)
Changes:
- Add `childstate_getStorageEntries` RPC
- Allow for scale-info v0 -> v1 conversion
## 6.0.5 Sep 20, 2021
Upgrade priority: Low. Recommended for all users on 6.0.4 using `api.query.*.*.at` calls
Changes:
- Revert cross-registry (now-inactive) change introduced in 6.0.3
- Ensure `Option` is correctly imported for TS query generation
## 6.0.4 Sep 20, 2021
Upgrade priority: Low. Recommended for all users on 6.0.3 using `api.query.*.*.at` calls
Changes:
- `api.query.<module>.<method>.at` will now use `at.at(<hash>)`
- Use and expose `metadata/util/getSiName` to get human type names
## 6.0.3 Sep 19, 2021
Upgrade priority: Low. Recommended for all users on 6.0.2 using `api.query.*.*.at` calls
Changes:
- Fix `api.query.<module>.<method>.at` queries
- Adjust typegen formatting for metadata documentation
## 6.0.2 Sep 18, 2021
Upgrade priority: Low. Recommended for all users on 6.0.1, especially those using `api.query.substrate.*` calls
Changes:
- Fix `api.query.substrate.*` key generation
## 6.0.1 Sep 18, 2021
Upgrade priority: Low. Recommended for users of the latest Substrate/Polkadot with Metadata v14.
- **Important** The Metadata v14 change allows the metadata to expose the chain types. This has been a major overhaul of the metadata handling, hence the major version bump.
Contributed:
- Allow for `.clone` on Http provider (Thanks to https://github.com/ianhe8x)
Changes:
- Allow for Metadata v14 parsing & usage
- Align `DigestItem` to latest Substrate
- Adjust Kusama `IdentityInfo` type for historic versions
- All `null` values in bundles min/max
- Bump static metadata for latest Substrate, Polkadot & Kusama
## 5.9.1 Sep 13, 2021 ## 5.9.1 Sep 13, 2021
Upgrade priority: Low. Recommended for chain using Xcm. Upgrade priority: Low. Recommended for chains using Xcm.
Contributed: Contributed:
+5 -5
View File
@@ -8,7 +8,7 @@
"packages/*" "packages/*"
], ],
"resolutions": { "resolutions": {
"typescript": "^4.4.2" "typescript": "^4.4.3"
}, },
"scripts": { "scripts": {
"build": "yarn build:interfaces && polkadot-dev-build-ts", "build": "yarn build:interfaces && polkadot-dev-build-ts",
@@ -29,12 +29,12 @@
"@babel/core": "^7.15.5", "@babel/core": "^7.15.5",
"@babel/register": "^7.15.3", "@babel/register": "^7.15.3",
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/dev": "^0.62.66", "@polkadot/dev": "^0.62.68",
"@polkadot/ts": "^0.4.7", "@polkadot/ts": "^0.4.8",
"@polkadot/typegen": "workspace:packages/typegen", "@polkadot/typegen": "workspace:packages/typegen",
"@types/jest": "^27.0.1", "@types/jest": "^27.0.2",
"copyfiles": "^2.4.1" "copyfiles": "^2.4.1"
}, },
"version": "5.9.1", "version": "6.2.1",
"packageManager": "yarn@3.0.1" "packageManager": "yarn@3.0.1"
} }
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/api-contract", "name": "@polkadot/api-contract",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Interfaces for interacting with contracts and contract ABIs", "description": "Interfaces for interacting with contracts and contract ABIs",
"main": "index.js", "main": "index.js",
@@ -20,9 +20,9 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-contract#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-contract#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/api": "5.9.1", "@polkadot/api": "6.2.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/util": "^7.3.1", "@polkadot/util": "^7.4.1",
"rxjs": "^7.3.0" "rxjs": "^7.3.0"
} }
} }
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/api-contract', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/api-contract', version: '6.2.1' };
+8 -8
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/api-derive", "name": "@polkadot/api-derive",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Common functions used across Polkadot, derived from RPC calls and storage queries.", "description": "Common functions used across Polkadot, derived from RPC calls and storage queries.",
"main": "index.js", "main": "index.js",
@@ -20,15 +20,15 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-derive#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-derive#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/api": "5.9.1", "@polkadot/api": "6.2.1",
"@polkadot/rpc-core": "5.9.1", "@polkadot/rpc-core": "6.2.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/util": "^7.3.1", "@polkadot/util": "^7.4.1",
"@polkadot/util-crypto": "^7.3.1", "@polkadot/util-crypto": "^7.4.1",
"rxjs": "^7.3.0" "rxjs": "^7.3.0"
}, },
"devDependencies": { "devDependencies": {
"@polkadot/keyring": "^7.3.1", "@polkadot/keyring": "^7.4.1",
"@polkadot/rpc-provider": "5.9.1" "@polkadot/rpc-provider": "6.2.1"
} }
} }
+11 -8
View File
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Data, Option } from '@polkadot/types'; import type { Data, Option } from '@polkadot/types';
import type { AccountId, IdentityInfoAdditional, Registration } from '@polkadot/types/interfaces'; import type { AccountId } from '@polkadot/types/interfaces';
import type { PalletIdentityIdentityInfo, PalletIdentityRegistration } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveAccountRegistration, DeriveHasIdentity } from '../types'; import type { DeriveAccountRegistration, DeriveHasIdentity } from '../types';
@@ -14,6 +15,8 @@ import { isHex, u8aToString } from '@polkadot/util';
import { memo } from '../util'; import { memo } from '../util';
type IdentityInfoAdditional = PalletIdentityIdentityInfo['additional'][0];
const UNDEF_HEX = { toHex: () => undefined }; const UNDEF_HEX = { toHex: () => undefined };
function dataAsString (data: Data): string | undefined { function dataAsString (data: Data): string | undefined {
@@ -37,7 +40,7 @@ function extractOther (additional: IdentityInfoAdditional[]): Record<string, str
}, {}); }, {});
} }
function extractIdentity (identityOfOpt?: Option<Registration>, superOf?: [AccountId, Data]): DeriveAccountRegistration { function extractIdentity (identityOfOpt?: Option<PalletIdentityRegistration>, superOf?: [AccountId, Data]): DeriveAccountRegistration {
if (!identityOfOpt?.isSome) { if (!identityOfOpt?.isSome) {
return { judgements: [] }; return { judgements: [] };
} }
@@ -61,7 +64,7 @@ function extractIdentity (identityOfOpt?: Option<Registration>, superOf?: [Accou
}; };
} }
function getParent (api: ApiInterfaceRx, identityOfOpt: Option<Registration> | undefined, superOfOpt: Option<ITuple<[AccountId, Data]>> | undefined): Observable<[Option<Registration> | undefined, [AccountId, Data] | undefined]> { function getParent (api: ApiInterfaceRx, identityOfOpt: Option<PalletIdentityRegistration> | undefined, superOfOpt: Option<ITuple<[AccountId, Data]>> | undefined): Observable<[Option<PalletIdentityRegistration> | undefined, [AccountId, Data] | undefined]> {
if (identityOfOpt?.isSome) { if (identityOfOpt?.isSome) {
// this identity has something set // this identity has something set
return of([identityOfOpt, undefined]); return of([identityOfOpt, undefined]);
@@ -70,7 +73,7 @@ function getParent (api: ApiInterfaceRx, identityOfOpt: Option<Registration> | u
// we have a super // we have a super
return combineLatest([ return combineLatest([
api.query.identity.identityOf<Option<Registration>>(superOf[0]), api.query.identity.identityOf(superOf[0]),
of(superOf) of(superOf)
]); ]);
} }
@@ -79,9 +82,9 @@ function getParent (api: ApiInterfaceRx, identityOfOpt: Option<Registration> | u
return of([undefined, undefined]); return of([undefined, undefined]);
} }
function getBase (api: ApiInterfaceRx, accountId?: AccountId | Uint8Array | string): Observable<[Option<Registration> | undefined, Option<ITuple<[AccountId, Data]>> | undefined]> { function getBase (api: ApiInterfaceRx, accountId?: AccountId | Uint8Array | string): Observable<[Option<PalletIdentityRegistration> | undefined, Option<ITuple<[AccountId, Data]>> | undefined]> {
return accountId && api.query.identity?.identityOf return accountId && api.query.identity?.identityOf
? api.queryMulti<[Option<Registration>, Option<ITuple<[AccountId, Data]>>]>([ ? api.queryMulti<[Option<PalletIdentityRegistration>, Option<ITuple<[AccountId, Data]>>]>([
[api.query.identity.identityOf, accountId], [api.query.identity.identityOf, accountId],
[api.query.identity.superOf, accountId] [api.query.identity.superOf, accountId]
]) ])
@@ -113,8 +116,8 @@ export function hasIdentityMulti (instanceId: string, api: ApiInterfaceRx): (acc
return memo(instanceId, (accountIds: (AccountId | Uint8Array | string)[]): Observable<DeriveHasIdentity[]> => return memo(instanceId, (accountIds: (AccountId | Uint8Array | string)[]): Observable<DeriveHasIdentity[]> =>
api.query.identity?.identityOf api.query.identity?.identityOf
? combineLatest([ ? combineLatest([
api.query.identity.identityOf.multi<Option<Registration>>(accountIds), api.query.identity.identityOf.multi(accountIds),
api.query.identity.superOf.multi<Option<ITuple<[AccountId, Data]>>>(accountIds) api.query.identity.superOf.multi(accountIds)
]).pipe( ]).pipe(
map(([identities, supers]) => map(([identities, supers]) =>
identities.map((identityOfOpt, index): DeriveHasIdentity => { identities.map((identityOfOpt, index): DeriveHasIdentity => {
+16 -15
View File
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx, QueryableStorageMultiArg } from '@polkadot/api/types'; import type { ApiInterfaceRx, QueryableStorageMultiArg } from '@polkadot/api/types';
import type { Option, Vec } from '@polkadot/types'; import type { Option, Vec } from '@polkadot/types';
import type { AccountId, AccountIndex, Address, Balance, BalanceLock, BalanceLockTo212, BlockNumber, VestingInfo, VestingSchedule } from '@polkadot/types/interfaces'; import type { AccountId, AccountIndex, Address, Balance, BalanceLockTo212, BlockNumber, VestingSchedule } from '@polkadot/types/interfaces';
import type { PalletBalancesBalanceLock, PalletVestingVestingInfo } from '@polkadot/types/lookup';
import type { DeriveBalancesAccount, DeriveBalancesAccountData, DeriveBalancesAll, DeriveBalancesAllAccountData } from '../types'; import type { DeriveBalancesAccount, DeriveBalancesAccountData, DeriveBalancesAll, DeriveBalancesAllAccountData } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
@@ -13,15 +14,15 @@ import { BN, bnMax, isFunction } from '@polkadot/util';
import { memo } from '../util'; import { memo } from '../util';
type BalanceLocksEntry = Vec<BalanceLock | BalanceLockTo212>; type BalanceLocksEntry = Vec<PalletBalancesBalanceLock | BalanceLockTo212>;
type BalanceLocks = BalanceLocksEntry[]; type BalanceLocks = BalanceLocksEntry[];
type ResultBalance = [VestingInfo | null, ((BalanceLock | BalanceLockTo212)[])[]]; type ResultBalance = [PalletVestingVestingInfo | null, ((PalletBalancesBalanceLock | BalanceLockTo212)[])[]];
type Result = [DeriveBalancesAccount, BlockNumber, ResultBalance]; type Result = [DeriveBalancesAccount, BlockNumber, ResultBalance];
interface AllLocked { interface AllLocked {
allLocked: boolean, allLocked: boolean,
lockedBalance: Balance, lockedBalance: Balance,
lockedBreakdown: (BalanceLock | BalanceLockTo212)[], lockedBreakdown: (PalletBalancesBalanceLock | BalanceLockTo212)[],
vestingLocked: Balance vestingLocked: Balance
} }
@@ -33,9 +34,9 @@ type DeriveCustomLocks = ApiInterfaceRx['derive'] & {
const VESTING_ID = '0x76657374696e6720'; const VESTING_ID = '0x76657374696e6720';
function calcLocked (api: ApiInterfaceRx, bestNumber: BlockNumber, locks: (BalanceLock | BalanceLockTo212)[]): AllLocked { function calcLocked (api: ApiInterfaceRx, bestNumber: BlockNumber, locks: (PalletBalancesBalanceLock | BalanceLockTo212)[]): AllLocked {
let lockedBalance = api.registry.createType('Balance'); let lockedBalance = api.registry.createType('Balance');
let lockedBreakdown: (BalanceLock | BalanceLockTo212)[] = []; let lockedBreakdown: (PalletBalancesBalanceLock | BalanceLockTo212)[] = [];
let vestingLocked = api.registry.createType('Balance'); let vestingLocked = api.registry.createType('Balance');
let allLocked = false; let allLocked = false;
@@ -56,7 +57,7 @@ function calcLocked (api: ApiInterfaceRx, bestNumber: BlockNumber, locks: (Balan
return { allLocked, lockedBalance, lockedBreakdown, vestingLocked }; return { allLocked, lockedBalance, lockedBreakdown, vestingLocked };
} }
function calcShared (api: ApiInterfaceRx, bestNumber: BlockNumber, data: DeriveBalancesAccountData, locks: (BalanceLock | BalanceLockTo212)[]): DeriveBalancesAllAccountData { function calcShared (api: ApiInterfaceRx, bestNumber: BlockNumber, data: DeriveBalancesAccountData, locks: (PalletBalancesBalanceLock | BalanceLockTo212)[]): DeriveBalancesAllAccountData {
const { allLocked, lockedBalance, lockedBreakdown, vestingLocked } = calcLocked(api, bestNumber, locks); const { allLocked, lockedBalance, lockedBreakdown, vestingLocked } = calcLocked(api, bestNumber, locks);
return { return {
@@ -73,7 +74,7 @@ function calcBalances (api: ApiInterfaceRx, [data, bestNumber, [vesting, allLock
// Calculate the vesting balances, // Calculate the vesting balances,
// - offset = balance locked at startingBlock // - offset = balance locked at startingBlock
// - perBlock is the unlock amount // - perBlock is the unlock amount
const emptyVest = api.registry.createType('VestingInfo'); const emptyVest = api.registry.createType<PalletVestingVestingInfo>('VestingInfo');
const { locked: vestingTotal, perBlock, startingBlock } = vesting || emptyVest; const { locked: vestingTotal, perBlock, startingBlock } = vesting || emptyVest;
const isStarted = bestNumber.gt(startingBlock); const isStarted = bestNumber.gt(startingBlock);
const vestedNow = isStarted ? perBlock.mul(bestNumber.sub(startingBlock)) : new BN(0); const vestedNow = isStarted ? perBlock.mul(bestNumber.sub(startingBlock)) : new BN(0);
@@ -96,7 +97,7 @@ function calcBalances (api: ApiInterfaceRx, [data, bestNumber, [vesting, allLock
// old // old
function queryOld (api: ApiInterfaceRx, accountId: AccountId): Observable<ResultBalance> { function queryOld (api: ApiInterfaceRx, accountId: AccountId): Observable<ResultBalance> {
return api.queryMulti<[Vec<BalanceLock>, Option<VestingSchedule>]>([ return api.queryMulti<[Vec<PalletBalancesBalanceLock>, Option<VestingSchedule>]>([
[api.query.balances.locks, accountId], [api.query.balances.locks, accountId],
[api.query.balances.vesting, accountId] [api.query.balances.vesting, accountId]
]).pipe( ]).pipe(
@@ -106,7 +107,7 @@ function queryOld (api: ApiInterfaceRx, accountId: AccountId): Observable<Result
if (optVesting.isSome) { if (optVesting.isSome) {
const { offset: locked, perBlock, startingBlock } = optVesting.unwrap(); const { offset: locked, perBlock, startingBlock } = optVesting.unwrap();
vestingNew = api.registry.createType('VestingInfo', { locked, perBlock, startingBlock }); vestingNew = api.registry.createType<PalletVestingVestingInfo>('VestingInfo', { locked, perBlock, startingBlock });
} }
return [vestingNew, [locks]]; return [vestingNew, [locks]];
@@ -126,20 +127,20 @@ function queryCurrent (api: ApiInterfaceRx, accountId: AccountId, balanceInstanc
return ( return (
api.query.vesting?.vesting api.query.vesting?.vesting
? api.queryMulti<[Option<VestingInfo>, ...BalanceLocks]>([[api.query.vesting.vesting, accountId], ...queries]) ? api.queryMulti<[Option<PalletVestingVestingInfo>, ...BalanceLocks]>([[api.query.vesting.vesting, accountId], ...queries])
// TODO We need to check module instances here as well, not only the balances module // TODO We need to check module instances here as well, not only the balances module
: queries.length : queries.length
? api.queryMulti<[...(Vec<BalanceLock>)[]]>(queries).pipe( ? api.queryMulti<[...(Vec<PalletBalancesBalanceLock>)[]]>(queries).pipe(
map((r): [Option<VestingInfo>, ...BalanceLocks] => [api.registry.createType('Option<VestingInfo>'), ...r]) map((r): [Option<PalletVestingVestingInfo>, ...BalanceLocks] => [api.registry.createType('Option<VestingInfo>'), ...r])
) )
: of([api.registry.createType('Option<VestingInfo>')] as [Option<VestingInfo>]) : of([api.registry.createType('Option<VestingInfo>')] as [Option<PalletVestingVestingInfo>])
).pipe( ).pipe(
map(([opt, ...locks]): ResultBalance => { map(([opt, ...locks]): ResultBalance => {
let offset = -1; let offset = -1;
return [ return [
opt.unwrapOr(null), opt.unwrapOr(null),
lockEmpty.map((e) => e ? api.registry.createType('Vec<BalanceLock>') : locks[++offset]) lockEmpty.map((e) => e ? api.registry.createType<Vec<PalletBalancesBalanceLock>>('Vec<BalanceLock>') : locks[++offset])
]; ];
}) })
); );
+38
View File
@@ -0,0 +1,38 @@
// Copyright 2017-2021 @polkadot/api-derive authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { AccountId, Balance, BalanceLockTo212, BlockNumber, Index } from '@polkadot/types/interfaces';
import type { PalletBalancesBalanceLock } from '@polkadot/types/lookup';
export interface DeriveBalancesAccountData {
freeBalance: Balance;
frozenFee: Balance;
frozenMisc: Balance;
reservedBalance: Balance;
votingBalance: Balance;
}
export interface DeriveBalancesAccount extends DeriveBalancesAccountData {
accountId: AccountId;
accountNonce: Index;
additional: DeriveBalancesAccountData[];
}
export interface DeriveBalancesAllAccountData extends DeriveBalancesAccountData {
availableBalance: Balance;
lockedBalance: Balance;
lockedBreakdown: (PalletBalancesBalanceLock | BalanceLockTo212)[];
vestingLocked: Balance;
}
export interface DeriveBalancesAll extends DeriveBalancesAccount, DeriveBalancesAllAccountData {
additional: DeriveBalancesAllAccountData[];
isVesting: boolean;
vestedBalance: Balance;
vestedClaimable: Balance;
vestingEndBlock: BlockNumber;
vestingPerBlock: Balance;
vestingTotal: Balance;
}
export type DeriveBalancesMap = Record<string, DeriveBalancesAll>;
+5 -4
View File
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Bytes, Option } from '@polkadot/types'; import type { Bytes, Option } from '@polkadot/types';
import type { Bounty, BountyIndex, ProposalIndex } from '@polkadot/types/interfaces'; import type { BountyIndex, ProposalIndex } from '@polkadot/types/interfaces';
import type { PalletBountiesBounty } from '@polkadot/types/lookup';
import type { DeriveBounties, DeriveCollectiveProposal } from '../types'; import type { DeriveBounties, DeriveCollectiveProposal } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
@@ -12,7 +13,7 @@ import { combineLatest, map, of, switchMap } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
import { filterBountiesProposals } from './helpers/filterBountyProposals'; import { filterBountiesProposals } from './helpers/filterBountyProposals';
type Result = [Option<Bounty>[], Option<Bytes>[], BountyIndex[], DeriveCollectiveProposal[]]; type Result = [Option<PalletBountiesBounty>[], Option<Bytes>[], BountyIndex[], DeriveCollectiveProposal[]];
function parseResult ([maybeBounties, maybeDescriptions, ids, bountyProposals]: Result): DeriveBounties { function parseResult ([maybeBounties, maybeDescriptions, ids, bountyProposals]: Result): DeriveBounties {
const bounties: DeriveBounties = []; const bounties: DeriveBounties = [];
@@ -53,8 +54,8 @@ export function bounties (instanceId: string, api: ApiInterfaceRx): () => Observ
const ids = keys.map(({ args: [id] }) => id); const ids = keys.map(({ args: [id] }) => id);
return combineLatest([ return combineLatest([
bountyBase.bounties.multi<Option<Bounty>>(ids), bountyBase.bounties.multi(ids),
bountyBase.bountyDescriptions.multi<Option<Bytes>>(ids), bountyBase.bountyDescriptions.multi(ids),
of(ids), of(ids),
of(filterBountiesProposals(api, proposals)) of(filterBountiesProposals(api, proposals))
]); ]);
@@ -40,9 +40,6 @@ function _proposalsFrom (instanceId: string, api: ApiInterfaceRx, section: strin
// however we have had cases on Edgeware where the indices have moved around after an // however we have had cases on Edgeware where the indices have moved around after an
// upgrade, which results in invalid on-chain data // upgrade, which results in invalid on-chain data
combineLatest(hashes.map((hash) => combineLatest(hashes.map((hash) =>
// this should simply be api.query[section].proposalOf.multi<Option<Proposal>>(hashes),
// however we have had cases on Edgeware where the indices have moved around after an
// upgrade, which results in invalid on-chain data
api.query[section].proposalOf<Option<Proposal>>(hash).pipe( api.query[section].proposalOf<Option<Proposal>>(hash).pipe(
catchError(() => of(null)) catchError(() => of(null))
) )
+4 -3
View File
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx, QueryableModuleStorage } from '@polkadot/api/types'; import type { ApiInterfaceRx, QueryableModuleStorage } from '@polkadot/api/types';
import type { Vec } from '@polkadot/types'; import type { Vec } from '@polkadot/types';
import type { AccountId, Balance, Voter } from '@polkadot/types/interfaces'; import type { AccountId, Balance } from '@polkadot/types/interfaces';
import type { PalletElectionsPhragmenVoter } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveCouncilVote, DeriveCouncilVotes } from '../types'; import type { DeriveCouncilVote, DeriveCouncilVotes } from '../types';
@@ -13,9 +14,9 @@ import { combineLatest, map, of } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
// Voter is current tuple is 2.x-era // Voter is current tuple is 2.x-era
type VoteEntry = Voter | ITuple<[Balance, Vec<AccountId>]>; type VoteEntry = PalletElectionsPhragmenVoter | ITuple<[Balance, Vec<AccountId>]>;
function isVoter (value: VoteEntry): value is Voter { function isVoter (value: VoteEntry): value is PalletElectionsPhragmenVoter {
return !Array.isArray(value); return !Array.isArray(value);
} }
@@ -3,8 +3,9 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option, u64, Vec } from '@polkadot/types'; import type { Option, Vec } from '@polkadot/types';
import type { BlockNumber, Hash, ReferendumIndex, Scheduled } from '@polkadot/types/interfaces'; import type { BlockNumber, Hash, ReferendumIndex } from '@polkadot/types/interfaces';
import type { PalletSchedulerScheduledV2 } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveDispatch, DeriveProposalImage } from '../types'; import type { DeriveDispatch, DeriveProposalImage } from '../types';
@@ -42,7 +43,7 @@ function queryQueue (api: ApiInterfaceRx): Observable<DeriveDispatch[]> {
); );
} }
function schedulerEntries (api: ApiInterfaceRx): Observable<[BlockNumber[], (Option<Scheduled>[] | null)[]]> { function schedulerEntries (api: ApiInterfaceRx): Observable<[BlockNumber[], (Option<PalletSchedulerScheduledV2>[] | null)[]]> {
// We don't get entries, but rather we get the keys (triggered via finished referendums) and // We don't get entries, but rather we get the keys (triggered via finished referendums) and
// the subscribe to those keys - this means we pickup when the schedulers actually executes // the subscribe to those keys - this means we pickup when the schedulers actually executes
// at a block, the entry for that block will become empty // at a block, the entry for that block will become empty
@@ -56,11 +57,11 @@ function schedulerEntries (api: ApiInterfaceRx): Observable<[BlockNumber[], (Opt
return blockNumbers.length return blockNumbers.length
? combineLatest([ ? combineLatest([
of(blockNumbers), of(blockNumbers),
// this should simply be api.query.scheduler.agenda.multi<Vec<Option<Scheduled>>>, // this should simply be api.query.scheduler.agenda.multi,
// however we have had cases on Darwinia where the indices have moved around after an // however we have had cases on Darwinia where the indices have moved around after an
// upgrade, which results in invalid on-chain data // upgrade, which results in invalid on-chain data
combineLatest(blockNumbers.map((blockNumber) => combineLatest(blockNumbers.map((blockNumber) =>
api.query.scheduler.agenda<Vec<Option<Scheduled>>>(blockNumber).pipe( api.query.scheduler.agenda(blockNumber).pipe(
// this does create an issue since it discards all at that block // this does create an issue since it discards all at that block
catchError(() => of(null)) catchError(() => of(null))
) )
@@ -86,7 +87,7 @@ function queryScheduler (api: ApiInterfaceRx): Observable<DeriveDispatch[]> {
const id = scheduled.maybeId.unwrap().toHex(); const id = scheduled.maybeId.unwrap().toHex();
if (id.startsWith(DEMOCRACY_ID)) { if (id.startsWith(DEMOCRACY_ID)) {
const [, index] = api.registry.createType<ITuple<[u64, ReferendumIndex]>>('(u64, ReferendumIndex)', id); const [, index] = api.registry.createType('(u64, ReferendumIndex)', id);
const imageHash = scheduled.call.args[0] as Hash; const imageHash = scheduled.call.args[0] as Hash;
result.push({ at, imageHash, index }); result.push({ at, imageHash, index });
+11 -6
View File
@@ -3,8 +3,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option } from '@polkadot/types'; import type { AccountId, ReferendumInfoTo239, Vote } from '@polkadot/types/interfaces';
import type { AccountId, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, Vote, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces'; import type { PalletDemocracyReferendumInfo, PalletDemocracyVoteVoting } from '@polkadot/types/lookup';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
import type { DeriveDemocracyLock } from '../types'; import type { DeriveDemocracyLock } from '../types';
@@ -14,6 +14,11 @@ import { BN_ZERO, isUndefined } from '@polkadot/util';
import { memo } from '../util'; import { memo } from '../util';
type ReferendumInfoFinished = PalletDemocracyReferendumInfo['asFinished'];
type VotingDelegating = PalletDemocracyVoteVoting['asDelegating'];
type VotingDirect = PalletDemocracyVoteVoting['asDirect'];
type VotingDirectVote = VotingDirect['votes'][0];
const LOCKUPS = [0, 1, 2, 4, 8, 16, 32]; const LOCKUPS = [0, 1, 2, 4, 8, 16, 32];
function parseEnd (api: ApiInterfaceRx, vote: Vote, { approved, end }: ReferendumInfoFinished): [BN, BN] { function parseEnd (api: ApiInterfaceRx, vote: Vote, { approved, end }: ReferendumInfoFinished): [BN, BN] {
@@ -25,7 +30,7 @@ function parseEnd (api: ApiInterfaceRx, vote: Vote, { approved, end }: Referendu
]; ];
} }
function parseLock (api: ApiInterfaceRx, [referendumId, accountVote]: VotingDirectVote, referendum: ReferendumInfo): DeriveDemocracyLock { function parseLock (api: ApiInterfaceRx, [referendumId, accountVote]: VotingDirectVote, referendum: PalletDemocracyReferendumInfo): DeriveDemocracyLock {
const { balance, vote } = accountVote.asStandard; const { balance, vote } = accountVote.asStandard;
const [referendumEnd, unlockAt] = referendum.isFinished const [referendumEnd, unlockAt] = referendum.isFinished
? parseEnd(api, vote, referendum.asFinished) ? parseEnd(api, vote, referendum.asFinished)
@@ -57,13 +62,13 @@ function directLocks (api: ApiInterfaceRx, { votes }: VotingDirect): Observable<
return of([]); return of([]);
} }
return api.query.democracy.referendumInfoOf.multi<Option<ReferendumInfo | ReferendumInfoTo239>>(votes.map(([referendumId]) => referendumId)).pipe( return api.query.democracy.referendumInfoOf.multi(votes.map(([referendumId]) => referendumId)).pipe(
map((referendums) => map((referendums) =>
votes votes
.map((vote, index): [VotingDirectVote, ReferendumInfo | ReferendumInfoTo239 | null] => .map((vote, index): [VotingDirectVote, PalletDemocracyReferendumInfo | ReferendumInfoTo239 | null] =>
[vote, referendums[index].unwrapOr(null)] [vote, referendums[index].unwrapOr(null)]
) )
.filter((item): item is [VotingDirectVote, ReferendumInfo] => .filter((item): item is [VotingDirectVote, PalletDemocracyReferendumInfo] =>
!!item[1] && isUndefined((item[1] as ReferendumInfoTo239).end) && item[0][1].isStandard !!item[1] && isUndefined((item[1] as ReferendumInfoTo239).end) && item[0][1].isStandard
) )
.map(([directVote, referendum]) => .map(([directVote, referendum]) =>
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option } from '@polkadot/types'; import type { Option } from '@polkadot/types';
import type { Hash, VoteThreshold } from '@polkadot/types/interfaces'; import type { H256 } from '@polkadot/types/interfaces';
import type { PalletDemocracyVoteThreshold } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveProposalExternal } from '../types'; import type { DeriveProposalExternal } from '../types';
@@ -12,7 +13,7 @@ import { map, of, switchMap } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
function withImage (api: ApiInterfaceRx, nextOpt: Option<ITuple<[Hash, VoteThreshold]>>): Observable<DeriveProposalExternal | null> { function withImage (api: ApiInterfaceRx, nextOpt: Option<ITuple<[H256, PalletDemocracyVoteThreshold]>>): Observable<DeriveProposalExternal | null> {
if (nextOpt.isNone) { if (nextOpt.isNone) {
return of(null); return of(null);
} }
@@ -31,7 +32,7 @@ function withImage (api: ApiInterfaceRx, nextOpt: Option<ITuple<[Hash, VoteThres
export function nextExternal (instanceId: string, api: ApiInterfaceRx): () => Observable<DeriveProposalExternal | null> { export function nextExternal (instanceId: string, api: ApiInterfaceRx): () => Observable<DeriveProposalExternal | null> {
return memo(instanceId, (): Observable<DeriveProposalExternal | null> => return memo(instanceId, (): Observable<DeriveProposalExternal | null> =>
api.query.democracy?.nextExternal api.query.democracy?.nextExternal
? api.query.democracy.nextExternal<Option<ITuple<[Hash, VoteThreshold]>>>().pipe( ? api.query.democracy.nextExternal().pipe(
switchMap((nextOpt) => withImage(api, nextOpt)) switchMap((nextOpt) => withImage(api, nextOpt))
) )
: of(null) : of(null)
@@ -3,9 +3,7 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Bytes, Option } from '@polkadot/types'; import type { Hash } from '@polkadot/types/interfaces';
import type { AccountId, Balance, BlockNumber, Hash } from '@polkadot/types/interfaces';
import type { ITuple } from '@polkadot/types/types';
import type { DeriveProposalImage } from '../types'; import type { DeriveProposalImage } from '../types';
import { map } from 'rxjs'; import { map } from 'rxjs';
@@ -13,11 +11,9 @@ import { map } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
import { parseImage } from './util'; import { parseImage } from './util';
type PreImage = Option<ITuple<[Bytes, AccountId, Balance, BlockNumber]>>;
export function preimage (instanceId: string, api: ApiInterfaceRx): (hash: Hash) => Observable<DeriveProposalImage | undefined> { export function preimage (instanceId: string, api: ApiInterfaceRx): (hash: Hash) => Observable<DeriveProposalImage | undefined> {
return memo(instanceId, (hash: Hash): Observable<DeriveProposalImage | undefined> => return memo(instanceId, (hash: Hash): Observable<DeriveProposalImage | undefined> =>
api.query.democracy.preimages<PreImage>(hash).pipe( api.query.democracy.preimages(hash).pipe(
map((imageOpt) => parseImage(api, imageOpt)) map((imageOpt) => parseImage(api, imageOpt))
) )
); );
@@ -3,9 +3,7 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Bytes, Option } from '@polkadot/types'; import type { Hash } from '@polkadot/types/interfaces';
import type { AccountId, Balance, BlockNumber, Hash } from '@polkadot/types/interfaces';
import type { ITuple } from '@polkadot/types/types';
import type { DeriveProposalImage } from '../types'; import type { DeriveProposalImage } from '../types';
import { map, of } from 'rxjs'; import { map, of } from 'rxjs';
@@ -13,12 +11,10 @@ import { map, of } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
import { parseImage } from './util'; import { parseImage } from './util';
type PreImage = Option<ITuple<[Bytes, AccountId, Balance, BlockNumber]>>;
export function preimages (instanceId: string, api: ApiInterfaceRx): (hashes: Hash[]) => Observable<(DeriveProposalImage | undefined)[]> { export function preimages (instanceId: string, api: ApiInterfaceRx): (hashes: Hash[]) => Observable<(DeriveProposalImage | undefined)[]> {
return memo(instanceId, (hashes: Hash[]): Observable<(DeriveProposalImage | undefined)[]> => return memo(instanceId, (hashes: Hash[]): Observable<(DeriveProposalImage | undefined)[]> =>
hashes.length hashes.length
? api.query.democracy.preimages.multi<PreImage>(hashes).pipe( ? api.query.democracy.preimages.multi(hashes).pipe(
map((images): (DeriveProposalImage | undefined)[] => map((images): (DeriveProposalImage | undefined)[] =>
images.map((imageOpt) => parseImage(api, imageOpt)) images.map((imageOpt) => parseImage(api, imageOpt))
) )
@@ -58,9 +58,9 @@ export function proposals (instanceId: string, api: ApiInterfaceRx): () => Obser
? combineLatest([ ? combineLatest([
of(proposals), of(proposals),
api.derive.democracy.preimages( api.derive.democracy.preimages(
proposals.map(([, hash]): Hash => hash)), proposals.map(([, hash]) => hash)),
api.query.democracy.depositOf.multi<Depositors>( api.query.democracy.depositOf.multi(
proposals.map(([index]): PropIndex => index)) proposals.map(([index]) => index))
]) ])
: of<Result>([[], [], []]) : of<Result>([[], [], []])
), ),
@@ -3,23 +3,24 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option } from '@polkadot/types'; import type { PalletDemocracyReferendumInfo } from '@polkadot/types/lookup';
import type { ReferendumInfo, ReferendumInfoFinished } from '@polkadot/types/interfaces';
import { map, switchMap } from 'rxjs'; import { map, switchMap } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
type ReferendumInfoFinished = PalletDemocracyReferendumInfo['asFinished'];
export function referendumsFinished (instanceId: string, api: ApiInterfaceRx): () => Observable<ReferendumInfoFinished[]> { export function referendumsFinished (instanceId: string, api: ApiInterfaceRx): () => Observable<ReferendumInfoFinished[]> {
return memo(instanceId, (): Observable<ReferendumInfoFinished[]> => return memo(instanceId, (): Observable<ReferendumInfoFinished[]> =>
api.derive.democracy.referendumIds().pipe( api.derive.democracy.referendumIds().pipe(
switchMap((ids) => switchMap((ids) =>
api.query.democracy.referendumInfoOf.multi<Option<ReferendumInfo>>(ids) api.query.democracy.referendumInfoOf.multi(ids)
), ),
map((infos): ReferendumInfoFinished[] => map((infos): ReferendumInfoFinished[] =>
infos infos
.map((optInfo) => optInfo.unwrapOr(null)) .map((optInfo) => optInfo.unwrapOr(null))
.filter((info): info is ReferendumInfo => !!info && info.isFinished) .filter((info): info is PalletDemocracyReferendumInfo => !!info && info.isFinished)
.map((info) => info.asFinished) .map((info) => info.asFinished)
) )
) )
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option, Vec } from '@polkadot/types'; import type { Option, Vec } from '@polkadot/types';
import type { AccountId, ReferendumInfo, ReferendumInfoTo239, Vote, Voting, VotingDelegating, VotingDirectVote } from '@polkadot/types/interfaces'; import type { AccountId, ReferendumInfoTo239, Vote } from '@polkadot/types/interfaces';
import type { PalletDemocracyReferendumInfo, PalletDemocracyVoteVoting } from '@polkadot/types/lookup';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
import type { DeriveBalancesAccount, DeriveReferendum, DeriveReferendumVote, DeriveReferendumVotes } from '../types'; import type { DeriveBalancesAccount, DeriveReferendum, DeriveReferendumVote, DeriveReferendumVotes } from '../types';
@@ -15,6 +16,10 @@ import { isFunction } from '@polkadot/util';
import { memo } from '../util'; import { memo } from '../util';
import { calcVotes, getStatus, parseImage } from './util'; import { calcVotes, getStatus, parseImage } from './util';
type VotingDelegating = PalletDemocracyVoteVoting['asDelegating'];
type VotingDirect = PalletDemocracyVoteVoting['asDirect'];
type VotingDirectVote = VotingDirect['votes'][0];
function votesPrev (api: ApiInterfaceRx, referendumId: BN): Observable<DeriveReferendumVote[]> { function votesPrev (api: ApiInterfaceRx, referendumId: BN): Observable<DeriveReferendumVote[]> {
return api.query.democracy.votersFor<Vec<AccountId>>(referendumId).pipe( return api.query.democracy.votersFor<Vec<AccountId>>(referendumId).pipe(
switchMap((votersFor): Observable<[Vec<AccountId>, Vote[], DeriveBalancesAccount[]]> => switchMap((votersFor): Observable<[Vec<AccountId>, Vote[], DeriveBalancesAccount[]]> =>
@@ -41,7 +46,7 @@ function votesPrev (api: ApiInterfaceRx, referendumId: BN): Observable<DeriveRef
); );
} }
function extractVotes (mapped: [AccountId, Voting][], referendumId: BN): DeriveReferendumVote[] { function extractVotes (mapped: [AccountId, PalletDemocracyVoteVoting][], referendumId: BN): DeriveReferendumVote[] {
return mapped return mapped
.filter(([, voting]) => voting.isDirect) .filter(([, voting]) => voting.isDirect)
.map(([accountId, voting]): [AccountId, VotingDirectVote[]] => [ .map(([accountId, voting]): [AccountId, VotingDirectVote[]] => [
@@ -66,9 +71,9 @@ function extractVotes (mapped: [AccountId, Voting][], referendumId: BN): DeriveR
} }
function votesCurr (api: ApiInterfaceRx, referendumId: BN): Observable<DeriveReferendumVote[]> { function votesCurr (api: ApiInterfaceRx, referendumId: BN): Observable<DeriveReferendumVote[]> {
return api.query.democracy.votingOf.entries<Voting, [AccountId]>().pipe( return api.query.democracy.votingOf.entries().pipe(
map((allVoting): DeriveReferendumVote[] => { map((allVoting): DeriveReferendumVote[] => {
const mapped = allVoting.map(([{ args: [accountId] }, voting]): [AccountId, Voting] => [accountId, voting]); const mapped = allVoting.map(([{ args: [accountId] }, voting]): [AccountId, PalletDemocracyVoteVoting] => [accountId, voting]);
const votes = extractVotes(mapped, referendumId); const votes = extractVotes(mapped, referendumId);
const delegations = mapped const delegations = mapped
.filter(([, voting]) => voting.isDelegating) .filter(([, voting]) => voting.isDelegating)
@@ -123,8 +128,8 @@ export function _referendumsVotes (instanceId: string, api: ApiInterfaceRx): (re
); );
} }
export function _referendumInfo (instanceId: string, api: ApiInterfaceRx): (index: BN, info: Option<ReferendumInfo | ReferendumInfoTo239>) => Observable<DeriveReferendum | null> { export function _referendumInfo (instanceId: string, api: ApiInterfaceRx): (index: BN, info: Option<PalletDemocracyReferendumInfo | ReferendumInfoTo239>) => Observable<DeriveReferendum | null> {
return memo(instanceId, (index: BN, info: Option<ReferendumInfo | ReferendumInfoTo239>): Observable<DeriveReferendum | null> => { return memo(instanceId, (index: BN, info: Option<PalletDemocracyReferendumInfo | ReferendumInfoTo239>): Observable<DeriveReferendum | null> => {
const status = getStatus(info); const status = getStatus(info);
return status return status
@@ -143,7 +148,7 @@ export function _referendumInfo (instanceId: string, api: ApiInterfaceRx): (inde
export function referendumsInfo (instanceId: string, api: ApiInterfaceRx): (ids: BN[]) => Observable<DeriveReferendum[]> { export function referendumsInfo (instanceId: string, api: ApiInterfaceRx): (ids: BN[]) => Observable<DeriveReferendum[]> {
return memo(instanceId, (ids: BN[]): Observable<DeriveReferendum[]> => return memo(instanceId, (ids: BN[]): Observable<DeriveReferendum[]> =>
ids.length ids.length
? api.query.democracy.referendumInfoOf.multi<Option<ReferendumInfo>>(ids).pipe( ? api.query.democracy.referendumInfoOf.multi(ids).pipe(
switchMap((infos): Observable<(DeriveReferendum | null)[]> => switchMap((infos): Observable<(DeriveReferendum | null)[]> =>
combineLatest( combineLatest(
ids.map((id, index): Observable<DeriveReferendum | null> => ids.map((id, index): Observable<DeriveReferendum | null> =>
+4 -3
View File
@@ -2,7 +2,8 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { Vec } from '@polkadot/types'; import type { Vec } from '@polkadot/types';
import type { AccountId, Balance, BlockNumber, Hash, PropIndex, Proposal, ReferendumIndex, ReferendumInfoTo239, ReferendumStatus, Vote, VoteThreshold } from '@polkadot/types/interfaces'; import type { AccountId, Balance, BlockNumber, Hash, PropIndex, Proposal, ReferendumIndex, ReferendumInfoTo239, Vote } from '@polkadot/types/interfaces';
import type { PalletDemocracyReferendumStatus, PalletDemocracyVoteThreshold } from '@polkadot/types/lookup';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
export interface DeriveDemocracyLock { export interface DeriveDemocracyLock {
@@ -41,14 +42,14 @@ export interface DeriveProposal {
export interface DeriveProposalExternal { export interface DeriveProposalExternal {
image?: DeriveProposalImage; image?: DeriveProposalImage;
imageHash: Hash; imageHash: Hash;
threshold: VoteThreshold; threshold: PalletDemocracyVoteThreshold;
} }
export interface DeriveReferendum { export interface DeriveReferendum {
index: ReferendumIndex; index: ReferendumIndex;
image?: DeriveProposalImage; image?: DeriveProposalImage;
imageHash: Hash; imageHash: Hash;
status: ReferendumStatus | ReferendumInfoTo239; status: PalletDemocracyReferendumStatus | ReferendumInfoTo239;
} }
export interface DeriveReferendumVote { export interface DeriveReferendumVote {
+10 -9
View File
@@ -3,7 +3,8 @@
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Bytes, Option } from '@polkadot/types'; import type { Bytes, Option } from '@polkadot/types';
import type { AccountId, Balance, BlockNumber, PreimageStatus, Proposal, ReferendumInfo, ReferendumInfoTo239, ReferendumStatus, Tally, VoteThreshold } from '@polkadot/types/interfaces'; import type { AccountId, Balance, BlockNumber, PreimageStatus, Proposal, ReferendumInfoTo239, Tally } from '@polkadot/types/interfaces';
import type { PalletDemocracyReferendumInfo, PalletDemocracyReferendumStatus, PalletDemocracyVoteThreshold } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveProposalImage, DeriveReferendum, DeriveReferendumVote, DeriveReferendumVotes, DeriveReferendumVoteState } from '../types'; import type { DeriveProposalImage, DeriveReferendum, DeriveReferendumVote, DeriveReferendumVotes, DeriveReferendumVoteState } from '../types';
@@ -18,12 +19,12 @@ interface ApproxState {
votedTotal: BN; votedTotal: BN;
} }
function isOldInfo (info: ReferendumInfo | ReferendumInfoTo239): info is ReferendumInfoTo239 { function isOldInfo (info: PalletDemocracyReferendumInfo | ReferendumInfoTo239): info is ReferendumInfoTo239 {
return !!(info as ReferendumInfoTo239).proposalHash; return !!(info as ReferendumInfoTo239).proposalHash;
} }
function isCurrentStatus (status: ReferendumStatus | ReferendumInfoTo239): status is ReferendumStatus { function isCurrentStatus (status: PalletDemocracyReferendumStatus | ReferendumInfoTo239): status is PalletDemocracyReferendumStatus {
return !!(status as ReferendumStatus).tally; return !!(status as PalletDemocracyReferendumStatus).tally;
} }
function isCurrentPreimage (api: ApiInterfaceRx, imageOpt: Option<OldPreimage> | Option<PreimageStatus>): imageOpt is Option<PreimageStatus> { function isCurrentPreimage (api: ApiInterfaceRx, imageOpt: Option<OldPreimage> | Option<PreimageStatus>): imageOpt is Option<PreimageStatus> {
@@ -57,18 +58,18 @@ export function compareRationals (n1: BN, d1: BN, n2: BN, d2: BN): boolean {
} }
} }
function calcPassingOther (threshold: VoteThreshold, sqrtElectorate: BN, { votedAye, votedNay, votedTotal }: ApproxState): boolean { function calcPassingOther (threshold: PalletDemocracyVoteThreshold, sqrtElectorate: BN, { votedAye, votedNay, votedTotal }: ApproxState): boolean {
const sqrtVoters = bnSqrt(votedTotal); const sqrtVoters = bnSqrt(votedTotal);
return sqrtVoters.isZero() return sqrtVoters.isZero()
? false ? false
: threshold.isSupermajorityapproval : threshold.isSuperMajorityApprove
? compareRationals(votedNay, sqrtVoters, votedAye, sqrtElectorate) ? compareRationals(votedNay, sqrtVoters, votedAye, sqrtElectorate)
: compareRationals(votedNay, sqrtElectorate, votedAye, sqrtVoters); : compareRationals(votedNay, sqrtElectorate, votedAye, sqrtVoters);
} }
export function calcPassing (threshold: VoteThreshold, sqrtElectorate: BN, state: ApproxState): boolean { export function calcPassing (threshold: PalletDemocracyVoteThreshold, sqrtElectorate: BN, state: ApproxState): boolean {
return threshold.isSimplemajority return threshold.isSimpleMajority
? state.votedAye.gt(state.votedNay) ? state.votedAye.gt(state.votedNay)
: calcPassingOther(threshold, sqrtElectorate, state); : calcPassingOther(threshold, sqrtElectorate, state);
} }
@@ -134,7 +135,7 @@ export function calcVotes (sqrtElectorate: BN, referendum: DeriveReferendum, vot
}; };
} }
export function getStatus (info: Option<ReferendumInfo | ReferendumInfoTo239>): ReferendumStatus | ReferendumInfoTo239 | null { export function getStatus (info: Option<PalletDemocracyReferendumInfo | ReferendumInfoTo239>): PalletDemocracyReferendumStatus | ReferendumInfoTo239 | null {
if (info.isNone) { if (info.isNone) {
return null; return null;
} }
@@ -3,8 +3,9 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Bytes, Option, u32 } from '@polkadot/types'; import type { Option, u32, WrapperOpaque } from '@polkadot/types';
import type { AccountId } from '@polkadot/types/interfaces'; import type { AccountId } from '@polkadot/types/interfaces';
import type { PalletImOnlineBoundedOpaqueNetworkState } from '@polkadot/types/lookup';
import type { DeriveHeartbeats } from '../types'; import type { DeriveHeartbeats } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
@@ -13,7 +14,9 @@ import { BN_ZERO } from '@polkadot/util';
import { memo } from '../util'; import { memo } from '../util';
function mapResult ([result, validators, heartbeats, numBlocks]: [DeriveHeartbeats, AccountId[], Option<Bytes>[], u32[]]): DeriveHeartbeats { type HeartbeatsOpt = Option<WrapperOpaque<PalletImOnlineBoundedOpaqueNetworkState>>;
function mapResult ([result, validators, heartbeats, numBlocks]: [DeriveHeartbeats, AccountId[], HeartbeatsOpt[], u32[]]): DeriveHeartbeats {
validators.forEach((validator, index): void => { validators.forEach((validator, index): void => {
const validatorId = validator.toString(); const validatorId = validator.toString();
const blockCount = numBlocks[index]; const blockCount = numBlocks[index];
@@ -39,13 +42,13 @@ export function receivedHeartbeats (instanceId: string, api: ApiInterfaceRx): ()
return memo(instanceId, (): Observable<DeriveHeartbeats> => return memo(instanceId, (): Observable<DeriveHeartbeats> =>
api.query.imOnline?.receivedHeartbeats api.query.imOnline?.receivedHeartbeats
? api.derive.staking.overview().pipe( ? api.derive.staking.overview().pipe(
switchMap(({ currentIndex, validators }): Observable<[DeriveHeartbeats, AccountId[], Option<Bytes>[], u32[]]> => switchMap(({ currentIndex, validators }): Observable<[DeriveHeartbeats, AccountId[], HeartbeatsOpt[], u32[]]> =>
combineLatest([ combineLatest([
of({}), of({}),
of(validators), of(validators),
api.query.imOnline.receivedHeartbeats.multi<Option<Bytes>>( api.query.imOnline.receivedHeartbeats.multi(
validators.map((_address, index) => [currentIndex, index])), validators.map((_address, index) => [currentIndex, index])),
api.query.imOnline.authoredBlocks.multi<u32>( api.query.imOnline.authoredBlocks.multi(
validators.map((address) => [currentIndex, address])) validators.map((address) => [currentIndex, address]))
]) ])
), ),
+2 -1
View File
@@ -78,7 +78,8 @@ describe('derive', (): void => {
} }
}, },
provider: new MockProvider(registry), provider: new MockProvider(registry),
registry registry,
throwOnConnect: true
}); });
beforeAll((done): void => { beforeAll((done): void => {
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/api-derive', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/api-derive', version: '6.2.1' };
+10 -8
View File
@@ -3,8 +3,9 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option, Vec } from '@polkadot/types'; import type { Option } from '@polkadot/types';
import type { AccountId, BalanceOf, Bid, BidKind } from '@polkadot/types/interfaces'; import type { BalanceOf } from '@polkadot/types/interfaces';
import type { PalletSocietyBid, PalletSocietyBidKind } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveSocietyCandidate } from '../types'; import type { DeriveSocietyCandidate } from '../types';
@@ -12,20 +13,21 @@ import { combineLatest, map, of, switchMap } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
type ResultSuspend = Option<ITuple<[BalanceOf, BidKind]>>; type ResultSuspend = Option<ITuple<[BalanceOf, PalletSocietyBidKind]>>;
type Result = [Bid[], ResultSuspend[]] type Result = [PalletSocietyBid[], ResultSuspend[]]
/** /**
* @description Get the candidate info for a society * @description Get the candidate info for a society
*/ */
export function candidates (instanceId: string, api: ApiInterfaceRx): () => Observable<DeriveSocietyCandidate[]> { export function candidates (instanceId: string, api: ApiInterfaceRx): () => Observable<DeriveSocietyCandidate[]> {
return memo(instanceId, (): Observable<DeriveSocietyCandidate[]> => return memo(instanceId, (): Observable<DeriveSocietyCandidate[]> =>
api.query.society.candidates<Vec<Bid>>().pipe( api.query.society.candidates().pipe(
switchMap((candidates: Vec<Bid>): Observable<Result> => switchMap((candidates): Observable<Result> =>
combineLatest([ combineLatest([
of(candidates), of(candidates),
api.query.society.suspendedCandidates.multi<ResultSuspend>( api.query.society.suspendedCandidates.multi(
candidates.map(({ who }): AccountId => who)) candidates.map(({ who }) => who)
)
]) ])
), ),
map(([candidates, suspended]: Result): DeriveSocietyCandidate[] => map(([candidates, suspended]: Result): DeriveSocietyCandidate[] =>
+3 -2
View File
@@ -4,14 +4,15 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option, u32, Vec } from '@polkadot/types'; import type { Option, u32, Vec } from '@polkadot/types';
import type { AccountId, BalanceOf, Bid } from '@polkadot/types/interfaces'; import type { AccountId, BalanceOf } from '@polkadot/types/interfaces';
import type { PalletSocietyBid } from '@polkadot/types/lookup';
import type { DeriveSociety } from '../types'; import type { DeriveSociety } from '../types';
import { map } from 'rxjs'; import { map } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
type Result = [Vec<Bid>, Option<AccountId>, Option<AccountId>, Option<AccountId>, u32, BalanceOf] type Result = [Vec<PalletSocietyBid>, Option<AccountId>, Option<AccountId>, Option<AccountId>, u32, BalanceOf]
/** /**
* @description Get the overall info for a society * @description Get the overall info for a society
+6 -8
View File
@@ -3,9 +3,7 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { bool, Option, Vec } from '@polkadot/types'; import type { AccountId } from '@polkadot/types/interfaces';
import type { AccountId, Balance, BlockNumber, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces';
import type { ITuple } from '@polkadot/types/types';
import type { DeriveSocietyMember } from '../types'; import type { DeriveSocietyMember } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
@@ -16,11 +14,11 @@ export function _members (instanceId: string, api: ApiInterfaceRx): (accountIds:
return memo(instanceId, (accountIds: AccountId[]): Observable<DeriveSocietyMember[]> => return memo(instanceId, (accountIds: AccountId[]): Observable<DeriveSocietyMember[]> =>
combineLatest([ combineLatest([
of(accountIds), of(accountIds),
api.query.society.payouts.multi<Vec<ITuple<[BlockNumber, Balance]>>>(accountIds), api.query.society.payouts.multi(accountIds),
api.query.society.strikes.multi<StrikeCount>(accountIds), api.query.society.strikes.multi(accountIds),
api.query.society.defenderVotes.multi<Option<SocietyVote>>(accountIds), api.query.society.defenderVotes.multi(accountIds),
api.query.society.suspendedMembers.multi<bool>(accountIds), api.query.society.suspendedMembers.multi(accountIds),
api.query.society.vouching.multi<Option<VouchingStatus>>(accountIds) api.query.society.vouching.multi(accountIds)
]).pipe( ]).pipe(
map(([accountIds, payouts, strikes, defenderVotes, suspended, vouching]) => map(([accountIds, payouts, strikes, defenderVotes, suspended, vouching]) =>
accountIds.map((accountId, index) => ({ accountIds.map((accountId, index) => ({
+33
View File
@@ -0,0 +1,33 @@
// Copyright 2017-2021 @polkadot/api-derive authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { u32 } from '@polkadot/types';
import type { AccountId, Balance, BalanceOf, BlockNumber, StrikeCount } from '@polkadot/types/interfaces';
import type { PalletSocietyBid, PalletSocietyBidKind, PalletSocietyVote, PalletSocietyVouchingStatus } from '@polkadot/types/lookup';
export interface DeriveSociety {
bids: PalletSocietyBid[];
defender?: AccountId;
hasDefender: boolean;
head?: AccountId;
founder?: AccountId;
maxMembers: u32;
pot: BalanceOf;
}
export interface DeriveSocietyCandidate {
accountId: AccountId;
kind: PalletSocietyBidKind;
value: Balance;
isSuspended: boolean;
}
export interface DeriveSocietyMember {
accountId: AccountId;
isDefenderVoter: boolean;
isSuspended: boolean;
payouts: [BlockNumber, Balance][];
strikes: StrikeCount;
vote?: PalletSocietyVote;
vouching?: PalletSocietyVouchingStatus;
}
+6 -5
View File
@@ -3,7 +3,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Balance, StakingLedger, UnlockChunk } from '@polkadot/types/interfaces'; import type { Balance } from '@polkadot/types/interfaces';
import type { PalletStakingStakingLedger, PalletStakingUnlockChunk } from '@polkadot/types/lookup';
import type { DeriveSessionInfo, DeriveStakingAccount, DeriveStakingKeys, DeriveStakingQuery, DeriveUnlocking } from '../types'; import type { DeriveSessionInfo, DeriveStakingAccount, DeriveStakingKeys, DeriveStakingQuery, DeriveUnlocking } from '../types';
import { combineLatest, map, switchMap } from 'rxjs'; import { combineLatest, map, switchMap } from 'rxjs';
@@ -19,7 +20,7 @@ const QUERY_OPTS = {
withPrefs: true withPrefs: true
}; };
function groupByEra (list: UnlockChunk[]): Record<string, BN> { function groupByEra (list: PalletStakingUnlockChunk[]): Record<string, BN> {
return list.reduce((map: Record<string, BN>, { era, value }): Record<string, BN> => { return list.reduce((map: Record<string, BN>, { era, value }): Record<string, BN> => {
const key = era.toString(); const key = era.toString();
@@ -29,7 +30,7 @@ function groupByEra (list: UnlockChunk[]): Record<string, BN> {
}, {}); }, {});
} }
function calculateUnlocking (api: ApiInterfaceRx, stakingLedger: StakingLedger | undefined, sessionInfo: DeriveSessionInfo): DeriveUnlocking[] | undefined { function calculateUnlocking (api: ApiInterfaceRx, stakingLedger: PalletStakingStakingLedger | undefined, sessionInfo: DeriveSessionInfo): DeriveUnlocking[] | undefined {
const results = Object const results = Object
.entries(groupByEra( .entries(groupByEra(
(stakingLedger?.unlocking || []).filter(({ era }) => era.unwrap().gt(sessionInfo.activeEra)) (stakingLedger?.unlocking || []).filter(({ era }) => era.unwrap().gt(sessionInfo.activeEra))
@@ -44,8 +45,8 @@ function calculateUnlocking (api: ApiInterfaceRx, stakingLedger: StakingLedger |
: undefined; : undefined;
} }
function redeemableSum (api: ApiInterfaceRx, stakingLedger: StakingLedger | undefined, sessionInfo: DeriveSessionInfo): Balance { function redeemableSum (api: ApiInterfaceRx, stakingLedger: PalletStakingStakingLedger | undefined, sessionInfo: DeriveSessionInfo): Balance {
return api.registry.createType('Balance', (stakingLedger?.unlocking || [] as UnlockChunk[]).reduce((total, { era, value }): BN => { return api.registry.createType('Balance', (stakingLedger?.unlocking || [] as PalletStakingUnlockChunk[]).reduce((total, { era, value }): BN => {
return sessionInfo.activeEra.gte(era.unwrap()) return sessionInfo.activeEra.gte(era.unwrap())
? total.iadd(value.unwrap()) ? total.iadd(value.unwrap())
: total; : total;
@@ -3,7 +3,7 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { EraRewardPoints } from '@polkadot/types/interfaces'; import type { PalletStakingEraRewardPoints } from '@polkadot/types/lookup';
import { switchMap } from 'rxjs'; import { switchMap } from 'rxjs';
@@ -12,11 +12,11 @@ import { memo } from '../util';
/** /**
* @description Retrieve the staking overview, including elected and points earned * @description Retrieve the staking overview, including elected and points earned
*/ */
export function currentPoints (instanceId: string, api: ApiInterfaceRx): () => Observable<EraRewardPoints> { export function currentPoints (instanceId: string, api: ApiInterfaceRx): () => Observable<PalletStakingEraRewardPoints> {
return memo(instanceId, (): Observable<EraRewardPoints> => return memo(instanceId, (): Observable<PalletStakingEraRewardPoints> =>
api.derive.session.indexes().pipe( api.derive.session.indexes().pipe(
switchMap(({ activeEra }) => switchMap(({ activeEra }) =>
api.query.staking.erasRewardPoints<EraRewardPoints>(activeEra) api.query.staking.erasRewardPoints<PalletStakingEraRewardPoints>(activeEra)
) )
)); ));
} }
@@ -4,14 +4,15 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { StorageKey } from '@polkadot/types'; import type { StorageKey } from '@polkadot/types';
import type { AccountId, EraIndex, Exposure } from '@polkadot/types/interfaces'; import type { AccountId, EraIndex } from '@polkadot/types/interfaces';
import type { PalletStakingExposure } from '@polkadot/types/lookup';
import type { DeriveEraExposure, DeriveEraNominatorExposure, DeriveEraValidatorExposure } from '../types'; import type { DeriveEraExposure, DeriveEraNominatorExposure, DeriveEraValidatorExposure } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
import { deriveCache, memo } from '../util'; import { deriveCache, memo } from '../util';
type KeysAndExposures = [StorageKey<[EraIndex, AccountId]>, Exposure][]; type KeysAndExposures = [StorageKey<[EraIndex, AccountId]>, PalletStakingExposure][];
const CACHE_KEY = 'eraExposure'; const CACHE_KEY = 'eraExposure';
@@ -3,7 +3,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { EraIndex, EraRewardPoints } from '@polkadot/types/interfaces'; import type { EraIndex } from '@polkadot/types/interfaces';
import type { PalletStakingEraRewardPoints } from '@polkadot/types/lookup';
import type { DeriveEraPoints, DeriveEraValPoints } from '../types'; import type { DeriveEraPoints, DeriveEraValPoints } from '../types';
import { map, of, switchMap } from 'rxjs'; import { map, of, switchMap } from 'rxjs';
@@ -15,7 +16,7 @@ import { filterEras } from './util';
const CACHE_KEY = 'eraPoints'; const CACHE_KEY = 'eraPoints';
function mapValidators ({ individual }: EraRewardPoints): DeriveEraValPoints { function mapValidators ({ individual }: PalletStakingEraRewardPoints): DeriveEraValPoints {
return [...individual.entries()] return [...individual.entries()]
.filter(([, points]) => points.gt(BN_ZERO)) .filter(([, points]) => points.gt(BN_ZERO))
.reduce((result: DeriveEraValPoints, [validatorId, points]): DeriveEraValPoints => { .reduce((result: DeriveEraValPoints, [validatorId, points]): DeriveEraValPoints => {
@@ -25,7 +26,7 @@ function mapValidators ({ individual }: EraRewardPoints): DeriveEraValPoints {
}, {}); }, {});
} }
function mapPoints (eras: EraIndex[], points: EraRewardPoints[]): DeriveEraPoints[] { function mapPoints (eras: EraIndex[], points: PalletStakingEraRewardPoints[]): DeriveEraPoints[] {
return eras.map((era, index): DeriveEraPoints => ({ return eras.map((era, index): DeriveEraPoints => ({
era, era,
eraPoints: points[index].total, eraPoints: points[index].total,
@@ -48,7 +49,7 @@ export function _erasPoints (instanceId: string, api: ApiInterfaceRx): (eras: Er
return !remaining.length return !remaining.length
? of(cached) ? of(cached)
: api.query.staking.erasRewardPoints.multi<EraRewardPoints>(remaining).pipe( : api.query.staking.erasRewardPoints.multi(remaining).pipe(
map((points): DeriveEraPoints[] => { map((points): DeriveEraPoints[] => {
const query = mapPoints(remaining, points); const query = mapPoints(remaining, points);
+3 -2
View File
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { StorageKey } from '@polkadot/types'; import type { StorageKey } from '@polkadot/types';
import type { EraIndex, ValidatorPrefs } from '@polkadot/types/interfaces'; import type { EraIndex } from '@polkadot/types/interfaces';
import type { PalletStakingValidatorPrefs } from '@polkadot/types/lookup';
import type { DeriveEraPrefs, DeriveEraValPrefs } from '../types'; import type { DeriveEraPrefs, DeriveEraValPrefs } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
@@ -13,7 +14,7 @@ import { deriveCache, memo } from '../util';
const CACHE_KEY = 'eraPrefs'; const CACHE_KEY = 'eraPrefs';
function mapPrefs (era: EraIndex, all: [StorageKey, ValidatorPrefs][]): DeriveEraPrefs { function mapPrefs (era: EraIndex, all: [StorageKey, PalletStakingValidatorPrefs][]): DeriveEraPrefs {
const validators: DeriveEraValPrefs = {}; const validators: DeriveEraValPrefs = {};
all.forEach(([key, prefs]): void => { all.forEach(([key, prefs]): void => {
@@ -38,7 +38,7 @@ export function _erasRewards (instanceId: string, api: ApiInterfaceRx): (eras: E
return of(cached); return of(cached);
} }
return api.query.staking.erasValidatorReward.multi<Option<Balance>>(remaining).pipe( return api.query.staking.erasValidatorReward.multi(remaining).pipe(
map((optRewards) => { map((optRewards) => {
const query = mapRewards(remaining, optRewards); const query = mapRewards(remaining, optRewards);
+13 -8
View File
@@ -4,7 +4,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option, Vec } from '@polkadot/types'; import type { Option, Vec } from '@polkadot/types';
import type { AccountId, Keys } from '@polkadot/types/interfaces'; import type { AccountId } from '@polkadot/types/interfaces';
import type { NodeRuntimeSessionKeys } from '@polkadot/types/lookup';
import type { ITuple } from '@polkadot/types/types'; import type { ITuple } from '@polkadot/types/types';
import type { DeriveStakingKeys } from './types'; import type { DeriveStakingKeys } from './types';
@@ -12,13 +13,17 @@ import { combineLatest, map, of, switchMap } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
function extractsIds (stashId: Uint8Array | string, queuedKeys: [AccountId, Keys][], nextKeys: Option<Keys>): DeriveStakingKeys { function extractsIds (stashId: Uint8Array | string, queuedKeys: [AccountId, NodeRuntimeSessionKeys | AccountId[]][], nextKeys: Option<NodeRuntimeSessionKeys>): DeriveStakingKeys {
const sessionIds = (queuedKeys.find(([currentId]) => currentId.eq(stashId)) || [undefined, [] as AccountId[]])[1]; const sessionIds = (queuedKeys.find(([currentId]) => currentId.eq(stashId)) || [undefined, [] as AccountId[]])[1];
const nextSessionIds = nextKeys.unwrapOr([] as AccountId[]); const nextSessionIds = nextKeys.unwrapOr([] as AccountId[]);
return { return {
nextSessionIds, nextSessionIds: Array.isArray(nextSessionIds)
sessionIds ? nextSessionIds
: [...nextSessionIds.values()] as AccountId[],
sessionIds: Array.isArray(sessionIds)
? sessionIds
: [...sessionIds.values()] as AccountId[]
}; };
} }
@@ -33,13 +38,13 @@ export function keys (instanceId: string, api: ApiInterfaceRx): (stashId: Uint8A
export function keysMulti (instanceId: string, api: ApiInterfaceRx): (stashIds: (Uint8Array | string)[]) => Observable<DeriveStakingKeys[]> { export function keysMulti (instanceId: string, api: ApiInterfaceRx): (stashIds: (Uint8Array | string)[]) => Observable<DeriveStakingKeys[]> {
return memo(instanceId, (stashIds: (Uint8Array | string)[]): Observable<DeriveStakingKeys[]> => return memo(instanceId, (stashIds: (Uint8Array | string)[]): Observable<DeriveStakingKeys[]> =>
stashIds.length stashIds.length
? api.query.session.queuedKeys<Vec<ITuple<[AccountId, Keys]>>>().pipe( ? api.query.session.queuedKeys().pipe(
switchMap((queuedKeys): Observable<[Vec<ITuple<[AccountId, Keys]>>, Option<Keys>[]]> => switchMap((queuedKeys): Observable<[Vec<ITuple<[AccountId, NodeRuntimeSessionKeys]>>, Option<NodeRuntimeSessionKeys>[]]> =>
combineLatest([ combineLatest([
of(queuedKeys), of(queuedKeys),
api.consts.session?.dedupKeyPrefix api.consts.session?.dedupKeyPrefix
? api.query.session.nextKeys.multi<Option<Keys>>(stashIds.map((stashId) => [api.consts.session.dedupKeyPrefix, stashId])) ? api.query.session.nextKeys.multi(stashIds.map((stashId) => [api.consts.session.dedupKeyPrefix, stashId]))
: api.query.session.nextKeys.multi<Option<Keys>>(stashIds) : api.query.session.nextKeys.multi(stashIds)
]) ])
), ),
map(([queuedKeys, nextKeys]) => map(([queuedKeys, nextKeys]) =>
@@ -3,7 +3,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx, QueryableStorageMultiArg } from '@polkadot/api/types'; import type { ApiInterfaceRx, QueryableStorageMultiArg } from '@polkadot/api/types';
import type { EraIndex, Exposure } from '@polkadot/types/interfaces'; import type { EraIndex } from '@polkadot/types/interfaces';
import type { PalletStakingExposure } from '@polkadot/types/lookup';
import type { DeriveOwnExposure } from '../types'; import type { DeriveOwnExposure } from '../types';
import { map, of, switchMap } from 'rxjs'; import { map, of, switchMap } from 'rxjs';
@@ -14,7 +15,7 @@ export function _ownExposures (instanceId: string, api: ApiInterfaceRx): (accoun
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
return memo(instanceId, (accountId: Uint8Array | string, eras: EraIndex[], _withActive: boolean): Observable<DeriveOwnExposure[]> => return memo(instanceId, (accountId: Uint8Array | string, eras: EraIndex[], _withActive: boolean): Observable<DeriveOwnExposure[]> =>
eras.length eras.length
? api.queryMulti<Exposure[]>([ ? api.queryMulti<PalletStakingExposure[]>([
...eras.map((era): QueryableStorageMultiArg<'rxjs'> => [api.query.staking.erasStakersClipped, [era, accountId]]), ...eras.map((era): QueryableStorageMultiArg<'rxjs'> => [api.query.staking.erasStakersClipped, [era, accountId]]),
...eras.map((era): QueryableStorageMultiArg<'rxjs'> => [api.query.staking.erasStakers, [era, accountId]]) ...eras.map((era): QueryableStorageMultiArg<'rxjs'> => [api.query.staking.erasStakers, [era, accountId]])
]).pipe( ]).pipe(
+18 -17
View File
@@ -4,14 +4,15 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { Option } from '@polkadot/types'; import type { Option } from '@polkadot/types';
import type { AccountId, EraIndex, Exposure, Nominations, RewardDestination, StakingLedger, ValidatorPrefs } from '@polkadot/types/interfaces'; import type { AccountId, EraIndex } from '@polkadot/types/interfaces';
import type { PalletStakingExposure, PalletStakingNominations, PalletStakingRewardDestination, PalletStakingStakingLedger, PalletStakingValidatorPrefs } from '@polkadot/types/lookup';
import type { DeriveStakingQuery, StakingQueryFlags } from '../types'; import type { DeriveStakingQuery, StakingQueryFlags } from '../types';
import { combineLatest, map, of, switchMap } from 'rxjs'; import { combineLatest, map, of, switchMap } from 'rxjs';
import { memo } from '../util'; import { memo } from '../util';
function parseDetails (stashId: AccountId, controllerIdOpt: Option<AccountId> | null, nominatorsOpt: Option<Nominations>, rewardDestination: RewardDestination, validatorPrefs: ValidatorPrefs, exposure: Exposure, stakingLedgerOpt: Option<StakingLedger>): DeriveStakingQuery { function parseDetails (stashId: AccountId, controllerIdOpt: Option<AccountId> | null, nominatorsOpt: Option<PalletStakingNominations>, rewardDestination: PalletStakingRewardDestination, validatorPrefs: PalletStakingValidatorPrefs, exposure: PalletStakingExposure, stakingLedgerOpt: Option<PalletStakingStakingLedger>): DeriveStakingQuery {
return { return {
accountId: stashId, accountId: stashId,
controllerId: controllerIdOpt && controllerIdOpt.unwrapOr(null), controllerId: controllerIdOpt && controllerIdOpt.unwrapOr(null),
@@ -26,21 +27,21 @@ function parseDetails (stashId: AccountId, controllerIdOpt: Option<AccountId> |
}; };
} }
function getLedgers (api: ApiInterfaceRx, optIds: (Option<AccountId> | null)[], { withLedger = false }: StakingQueryFlags): Observable<Option<StakingLedger>[]> { function getLedgers (api: ApiInterfaceRx, optIds: (Option<AccountId> | null)[], { withLedger = false }: StakingQueryFlags): Observable<Option<PalletStakingStakingLedger>[]> {
const ids = optIds const ids = optIds
.filter((opt): opt is Option<AccountId> => withLedger && !!opt && opt.isSome) .filter((opt): opt is Option<AccountId> => withLedger && !!opt && opt.isSome)
.map((opt) => opt.unwrap()); .map((opt) => opt.unwrap());
const emptyLed = api.registry.createType('Option<StakingLedger>'); const emptyLed = api.registry.createType<Option<PalletStakingStakingLedger>>('Option<StakingLedger>');
return ( return (
ids.length ids.length
? api.query.staking.ledger.multi<Option<StakingLedger>>(ids) ? api.query.staking.ledger.multi(ids)
: of([]) : of([])
).pipe( ).pipe(
map((optLedgers): Option<StakingLedger>[] => { map((optLedgers): Option<PalletStakingStakingLedger>[] => {
let offset = -1; let offset = -1;
return optIds.map((opt): Option<StakingLedger> => return optIds.map((opt): Option<PalletStakingStakingLedger> =>
opt && opt.isSome opt && opt.isSome
? optLedgers[++offset] || emptyLed ? optLedgers[++offset] || emptyLed
: emptyLed : emptyLed
@@ -49,27 +50,27 @@ function getLedgers (api: ApiInterfaceRx, optIds: (Option<AccountId> | null)[],
); );
} }
function getStashInfo (api: ApiInterfaceRx, stashIds: AccountId[], activeEra: EraIndex, { withController, withDestination, withExposure, withLedger, withNominations, withPrefs }: StakingQueryFlags): Observable<[(Option<AccountId> | null)[], Option<Nominations>[], RewardDestination[], ValidatorPrefs[], Exposure[]]> { function getStashInfo (api: ApiInterfaceRx, stashIds: AccountId[], activeEra: EraIndex, { withController, withDestination, withExposure, withLedger, withNominations, withPrefs }: StakingQueryFlags): Observable<[(Option<AccountId> | null)[], Option<PalletStakingNominations>[], PalletStakingRewardDestination[], PalletStakingValidatorPrefs[], PalletStakingExposure[]]> {
const emptyNoms = api.registry.createType('Option<Nominations>'); const emptyNoms = api.registry.createType<Option<PalletStakingNominations>>('Option<Nominations>');
const emptyRewa = api.registry.createType('RewardDestination'); const emptyRewa = api.registry.createType<PalletStakingRewardDestination>('RewardDestination');
const emptyExpo = api.registry.createType('Exposure'); const emptyExpo = api.registry.createType<PalletStakingExposure>('Exposure');
const emptyPrefs = api.registry.createType('ValidatorPrefs'); const emptyPrefs = api.registry.createType<PalletStakingValidatorPrefs>('ValidatorPrefs');
return combineLatest([ return combineLatest([
withController || withLedger withController || withLedger
? api.query.staking.bonded.multi<Option<AccountId>>(stashIds) ? api.query.staking.bonded.multi(stashIds)
: of(stashIds.map(() => null)), : of(stashIds.map(() => null)),
withNominations withNominations
? api.query.staking.nominators.multi<Option<Nominations>>(stashIds) ? api.query.staking.nominators.multi(stashIds)
: of(stashIds.map(() => emptyNoms)), : of(stashIds.map(() => emptyNoms)),
withDestination withDestination
? api.query.staking.payee.multi<RewardDestination>(stashIds) ? api.query.staking.payee.multi(stashIds)
: of(stashIds.map(() => emptyRewa)), : of(stashIds.map(() => emptyRewa)),
withPrefs withPrefs
? api.query.staking.validators.multi<ValidatorPrefs>(stashIds) ? api.query.staking.validators.multi(stashIds)
: of(stashIds.map(() => emptyPrefs)), : of(stashIds.map(() => emptyPrefs)),
withExposure withExposure
? api.query.staking.erasStakers.multi<Exposure>(stashIds.map((stashId) => [activeEra, stashId])) ? api.query.staking.erasStakers.multi(stashIds.map((stashId) => [activeEra, stashId]))
: of(stashIds.map(() => emptyExpo)) : of(stashIds.map(() => emptyExpo))
]); ]);
} }
@@ -3,7 +3,7 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { EraIndex, ValidatorPrefs } from '@polkadot/types/interfaces'; import type { EraIndex } from '@polkadot/types/interfaces';
import type { DeriveStakerPrefs } from '../types'; import type { DeriveStakerPrefs } from '../types';
import { map, switchMap } from 'rxjs'; import { map, switchMap } from 'rxjs';
@@ -13,7 +13,7 @@ import { memo } from '../util';
export function _stakerPrefs (instanceId: string, api: ApiInterfaceRx): (accountId: Uint8Array | string, eras: EraIndex[], withActive: boolean) => Observable<DeriveStakerPrefs[]> { export function _stakerPrefs (instanceId: string, api: ApiInterfaceRx): (accountId: Uint8Array | string, eras: EraIndex[], withActive: boolean) => Observable<DeriveStakerPrefs[]> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
return memo(instanceId, (accountId: Uint8Array | string, eras: EraIndex[], _withActive: boolean): Observable<DeriveStakerPrefs[]> => return memo(instanceId, (accountId: Uint8Array | string, eras: EraIndex[], _withActive: boolean): Observable<DeriveStakerPrefs[]> =>
api.query.staking.erasValidatorPrefs.multi<ValidatorPrefs>(eras.map((era) => [era, accountId])).pipe( api.query.staking.erasValidatorPrefs.multi(eras.map((era) => [era, accountId])).pipe(
map((all): DeriveStakerPrefs[] => map((all): DeriveStakerPrefs[] =>
all.map((validatorPrefs, index): DeriveStakerPrefs => ({ all.map((validatorPrefs, index): DeriveStakerPrefs => ({
era: eras[index], era: eras[index],
@@ -3,7 +3,8 @@
import type { Observable } from 'rxjs'; import type { Observable } from 'rxjs';
import type { ApiInterfaceRx } from '@polkadot/api/types'; import type { ApiInterfaceRx } from '@polkadot/api/types';
import type { AccountId, EraIndex, StakingLedger } from '@polkadot/types/interfaces'; import type { AccountId, EraIndex } from '@polkadot/types/interfaces';
import type { PalletStakingStakingLedger } from '@polkadot/types/lookup';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
import type { DeriveEraPoints, DeriveEraPrefs, DeriveEraRewards, DeriveEraValPrefs, DeriveStakerExposure, DeriveStakerReward, DeriveStakerRewardValidator } from '../types'; import type { DeriveEraPoints, DeriveEraPrefs, DeriveEraRewards, DeriveEraValPrefs, DeriveStakerExposure, DeriveStakerReward, DeriveStakerRewardValidator } from '../types';
import type { DeriveStakingQuery } from './types'; import type { DeriveStakingQuery } from './types';
@@ -108,7 +109,7 @@ function removeClaimed (validators: string[], queryValidators: DeriveStakingQuer
}); });
} }
function filterRewards (eras: EraIndex[], valInfo: [string, DeriveStakingQuery][], { rewards, stakingLedger }: { rewards: DeriveStakerReward[]; stakingLedger: StakingLedger }): DeriveStakerReward[] { function filterRewards (eras: EraIndex[], valInfo: [string, DeriveStakingQuery][], { rewards, stakingLedger }: { rewards: DeriveStakerReward[]; stakingLedger: PalletStakingStakingLedger }): DeriveStakerReward[] {
const filter = eras.filter((era) => !stakingLedger.claimedRewards.some((e) => e.eq(era))); const filter = eras.filter((era) => !stakingLedger.claimedRewards.some((e) => e.eq(era)));
const validators = valInfo.map(([v]) => v); const validators = valInfo.map(([v]) => v);
const queryValidators = valInfo.map(([, q]) => q); const queryValidators = valInfo.map(([, q]) => q);
+11 -10
View File
@@ -1,13 +1,14 @@
// Copyright 2017-2021 @polkadot/api-derive authors & contributors // Copyright 2017-2021 @polkadot/api-derive authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { AccountId, Balance, EraIndex, Exposure, RewardDestination, RewardPoint, StakingLedger, ValidatorPrefs } from '@polkadot/types/interfaces'; import type { AccountId, Balance, EraIndex, RewardPoint } from '@polkadot/types/interfaces';
import type { PalletStakingExposure, PalletStakingRewardDestination, PalletStakingStakingLedger, PalletStakingValidatorPrefs } from '@polkadot/types/lookup';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
import type { DeriveSessionIndexes } from '../session/types'; import type { DeriveSessionIndexes } from '../session/types';
export type DeriveEraValPoints = Record<string, RewardPoint>; export type DeriveEraValPoints = Record<string, RewardPoint>;
export type DeriveEraValPrefs = Record<string, ValidatorPrefs>; export type DeriveEraValPrefs = Record<string, PalletStakingValidatorPrefs>;
export type DeriveEraValSlash = Record<string, Balance>; export type DeriveEraValSlash = Record<string, Balance>;
@@ -40,9 +41,9 @@ export interface DeriveStakerPoints {
} }
export interface DeriveOwnExposure { export interface DeriveOwnExposure {
clipped: Exposure; clipped: PalletStakingExposure;
era: EraIndex; era: EraIndex;
exposure: Exposure; exposure: PalletStakingExposure;
} }
export interface DeriveEraExposureNominating { export interface DeriveEraExposureNominating {
@@ -52,7 +53,7 @@ export interface DeriveEraExposureNominating {
export type DeriveEraNominatorExposure = Record<string, DeriveEraExposureNominating[]>; export type DeriveEraNominatorExposure = Record<string, DeriveEraExposureNominating[]>;
export type DeriveEraValidatorExposure = Record<string, Exposure>; export type DeriveEraValidatorExposure = Record<string, PalletStakingExposure>;
export interface DeriveEraExposure { export interface DeriveEraExposure {
era: EraIndex; era: EraIndex;
@@ -70,7 +71,7 @@ export interface DeriveStakerExposure {
export interface DeriveStakerPrefs { export interface DeriveStakerPrefs {
era: EraIndex; era: EraIndex;
validatorPrefs: ValidatorPrefs; validatorPrefs: PalletStakingValidatorPrefs;
} }
export interface DeriveStakerRewardValidator { export interface DeriveStakerRewardValidator {
@@ -106,16 +107,16 @@ export interface DeriveStakingValidators {
export interface DeriveStakingStash { export interface DeriveStakingStash {
controllerId: AccountId | null; controllerId: AccountId | null;
exposure: Exposure; exposure: PalletStakingExposure;
nominators: AccountId[]; nominators: AccountId[];
rewardDestination: RewardDestination; rewardDestination: PalletStakingRewardDestination;
stashId: AccountId; stashId: AccountId;
validatorPrefs: ValidatorPrefs; validatorPrefs: PalletStakingValidatorPrefs;
} }
export interface DeriveStakingQuery extends DeriveStakingStash { export interface DeriveStakingQuery extends DeriveStakingStash {
accountId: AccountId; accountId: AccountId;
stakingLedger: StakingLedger; stakingLedger: PalletStakingStakingLedger;
} }
export interface DeriveStakingElected { export interface DeriveStakingElected {
@@ -59,7 +59,7 @@ function retrieveProposals (api: ApiInterfaceRx, proposalCount: ProposalIndex, a
const allIds = [...proposalIds, ...approvalIds]; const allIds = [...proposalIds, ...approvalIds];
return combineLatest([ return combineLatest([
api.query.treasury.proposals.multi<Option<TreasuryProposal>>(allIds), api.query.treasury.proposals.multi(allIds),
api.derive.council api.derive.council
? api.derive.council.proposals() ? api.derive.council.proposals()
: of([] as DeriveCollectiveProposal[]) : of([] as DeriveCollectiveProposal[])
+5 -62
View File
@@ -2,52 +2,22 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { u32 } from '@polkadot/types'; import type { u32 } from '@polkadot/types';
import type { AccountId, Balance, BalanceLock, BalanceLockTo212, BalanceOf, Bid, BidKind, BlockNumber, Bounty, BountyIndex, Hash, Index, Proposal, ProposalIndex, SetIndex, SocietyVote, StrikeCount, TreasuryProposal, Votes, VouchingStatus } from '@polkadot/types/interfaces'; import type { Balance, BlockNumber, BountyIndex, Hash, Proposal, ProposalIndex, SetIndex, TreasuryProposal, Votes } from '@polkadot/types/interfaces';
import type { PalletBountiesBounty } from '@polkadot/types/lookup';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
export * from './accounts/types'; export * from './accounts/types';
export * from './balances/types';
export * from './council/types'; export * from './council/types';
export * from './crowdloan/types'; export * from './crowdloan/types';
export * from './democracy/types'; export * from './democracy/types';
export * from './elections/types'; export * from './elections/types';
export * from './parachains/types'; export * from './parachains/types';
export * from './session/types'; export * from './session/types';
export * from './society/types';
export * from './staking/types'; export * from './staking/types';
export * from './type/types'; export * from './type/types';
export interface DeriveBalancesAccountData {
freeBalance: Balance;
frozenFee: Balance;
frozenMisc: Balance;
reservedBalance: Balance;
votingBalance: Balance;
}
export interface DeriveBalancesAccount extends DeriveBalancesAccountData {
accountId: AccountId;
accountNonce: Index;
additional: DeriveBalancesAccountData[];
}
export interface DeriveBalancesAllAccountData extends DeriveBalancesAccountData {
availableBalance: Balance;
lockedBalance: Balance;
lockedBreakdown: (BalanceLock | BalanceLockTo212)[];
vestingLocked: Balance;
}
export interface DeriveBalancesAll extends DeriveBalancesAccount, DeriveBalancesAllAccountData {
additional: DeriveBalancesAllAccountData[];
isVesting: boolean;
vestedBalance: Balance;
vestedClaimable: Balance;
vestingEndBlock: BlockNumber;
vestingPerBlock: Balance;
vestingTotal: Balance;
}
export type DeriveBalancesMap = Record<string, DeriveBalancesAll>;
export interface DeriveContractFees { export interface DeriveContractFees {
callBaseFee: BN; callBaseFee: BN;
contractFee: BN; contractFee: BN;
@@ -90,33 +60,6 @@ export interface RecentlyOffline {
export type DeriveRecentlyOffline = Record<string, RecentlyOffline[]>; export type DeriveRecentlyOffline = Record<string, RecentlyOffline[]>;
export interface DeriveSociety {
bids: Bid[];
defender?: AccountId;
hasDefender: boolean;
head?: AccountId;
founder?: AccountId;
maxMembers: u32;
pot: BalanceOf;
}
export interface DeriveSocietyCandidate {
accountId: AccountId;
kind: BidKind;
value: Balance;
isSuspended: boolean;
}
export interface DeriveSocietyMember {
accountId: AccountId;
isDefenderVoter: boolean;
isSuspended: boolean;
payouts: [BlockNumber, Balance][];
strikes: StrikeCount;
vote?: SocietyVote;
vouching?: VouchingStatus;
}
export interface DeriveTreasuryProposal { export interface DeriveTreasuryProposal {
council: DeriveCollectiveProposal[]; council: DeriveCollectiveProposal[];
id: ProposalIndex; id: ProposalIndex;
@@ -138,7 +81,7 @@ export interface VoterPosition {
export type DeriveVoterPositions = Record<string, VoterPosition>; export type DeriveVoterPositions = Record<string, VoterPosition>;
export interface DeriveBounty { export interface DeriveBounty {
bounty: Bounty; bounty: PalletBountiesBounty;
description: string; description: string;
index: BountyIndex; index: BountyIndex;
proposals: DeriveCollectiveProposal[]; proposals: DeriveCollectiveProposal[];
+4 -4
View File
@@ -7,13 +7,13 @@ The API wrappers provide a standard interface for use -
- A static `.create(<optional ApiOptions>)` that returns an API instance when connected, decorated and ready-to use. ApiOptions can include an optional WsProvider and optional custom type definitions `{ provider: <Optional WsProvider>, types: <Optional RegistryTypes> }`. - A static `.create(<optional ApiOptions>)` that returns an API instance when connected, decorated and ready-to use. ApiOptions can include an optional WsProvider and optional custom type definitions `{ provider: <Optional WsProvider>, types: <Optional RegistryTypes> }`.
- The above is just a wrapper for `new Api(<optional ApiOptions>) `, exposing the `isReady` getter - The above is just a wrapper for `new Api(<optional ApiOptions>) `, exposing the `isReady` getter
- `api.rpc.<section>.<method>` provides access to actual RPC calls, be it for queries, submission or retrieving chain information - `api.rpc.<section>.<method>` provides access to actual RPC calls, be it for queries, submission or retrieving chain information
- [RPC (node interface)](https://polkadot.js.org/docs/substrate/rpc.html) - [RPC (node interface)](https://polkadot.js.org/docs/substrate/rpc)
- `api.query.<section>.<method>` provides access to chain state queries. These are dynamically populated based on what the runtime provides - `api.query.<section>.<method>` provides access to chain state queries. These are dynamically populated based on what the runtime provides
- [Storage chain state (runtime node interface)](https://polkadot.js.org/docs/substrate/storage.html) - [Storage chain state (runtime node interface)](https://polkadot.js.org/docs/substrate/storage)
- `api.tx.<section>.<method>` provides the ability to create a transaction, like chain state, this list is populated from a runtime query - `api.tx.<section>.<method>` provides the ability to create a transaction, like chain state, this list is populated from a runtime query
- [Extrinsics (runtime node interface)](https://polkadot.js.org/docs/substrate/extrinsics.html) - [Extrinsics (runtime node interface)](https://polkadot.js.org/docs/substrate/extrinsics)
- `api.consts.<section>.<constant>` provides access to the module constants (parameter types). - `api.consts.<section>.<constant>` provides access to the module constants (parameter types).
- [Constants (runtime node interface)](https://polkadot.js.org/docs/substrate/constants.html) - [Constants (runtime node interface)](https://polkadot.js.org/docs/substrate/constants)
## API Selection ## API Selection
+9 -9
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/api", "name": "@polkadot/api",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Promise and RxJS wrappers around the Polkadot JS RPC", "description": "Promise and RxJS wrappers around the Polkadot JS RPC",
"main": "index.js", "main": "index.js",
@@ -20,14 +20,14 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/api-derive": "5.9.1", "@polkadot/api-derive": "6.2.1",
"@polkadot/keyring": "^7.3.1", "@polkadot/keyring": "^7.4.1",
"@polkadot/rpc-core": "5.9.1", "@polkadot/rpc-core": "6.2.1",
"@polkadot/rpc-provider": "5.9.1", "@polkadot/rpc-provider": "6.2.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/types-known": "5.9.1", "@polkadot/types-known": "6.2.1",
"@polkadot/util": "^7.3.1", "@polkadot/util": "^7.4.1",
"@polkadot/util-crypto": "^7.3.1", "@polkadot/util-crypto": "^7.4.1",
"eventemitter3": "^4.0.7", "eventemitter3": "^4.0.7",
"rxjs": "^7.3.0" "rxjs": "^7.3.0"
} }
+185 -160
View File
@@ -1,17 +1,11 @@
// Auto-generated via `yarn polkadot-types-from-chain`, do not edit // Auto-generated via `yarn polkadot-types-from-chain`, do not edit
/* eslint-disable */ /* eslint-disable */
import type { Vec, bool, u16, u32, u64 } from '@polkadot/types';
import type { Codec } from '@polkadot/types/types';
import type { Schedule } from '@polkadot/types/interfaces/contracts';
import type { Balance, BalanceOf, BlockNumber, LockIdentifier, Moment, PalletId, Perbill, Percent, Permill, RuntimeDbWeight, TransactionPriority, Weight } from '@polkadot/types/interfaces/runtime';
import type { SessionIndex } from '@polkadot/types/interfaces/session';
import type { EraIndex } from '@polkadot/types/interfaces/staking';
import type { RuntimeVersion } from '@polkadot/types/interfaces/state';
import type { WeightToFeeCoefficient } from '@polkadot/types/interfaces/support';
import type { BlockLength, BlockWeights } from '@polkadot/types/interfaces/system';
import type { DepositBalanceOf } from '@polkadot/types/interfaces/uniques';
import type { ApiTypes } from '@polkadot/api/types'; import type { ApiTypes } from '@polkadot/api/types';
import type { U8aFixed, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types';
import type { Perbill, Percent, Permill } from '@polkadot/types/interfaces/runtime';
import type { FrameSupportPalletId, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, PalletContractsSchedule, SpVersionRuntimeVersion } from '@polkadot/types/lookup';
import type { Codec } from '@polkadot/types/types';
declare module '@polkadot/api/types/consts' { declare module '@polkadot/api/types/consts' {
export interface AugmentedConsts<ApiType> { export interface AugmentedConsts<ApiType> {
@@ -19,20 +13,20 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The amount of funds that must be reserved when creating a new approval. * The amount of funds that must be reserved when creating a new approval.
**/ **/
approvalDeposit: DepositBalanceOf & AugmentedConst<ApiType>; approvalDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The basic amount of funds that must be reserved for an asset. * The basic amount of funds that must be reserved for an asset.
**/ **/
assetDeposit: DepositBalanceOf & AugmentedConst<ApiType>; assetDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The basic amount of funds that must be reserved when adding metadata to your asset. * The basic amount of funds that must be reserved when adding metadata to your asset.
**/ **/
metadataDepositBase: DepositBalanceOf & AugmentedConst<ApiType>; metadataDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The additional funds that must be reserved for the number of bytes you store in your * The additional funds that must be reserved for the number of bytes you store in your
* metadata. * metadata.
**/ **/
metadataDepositPerByte: DepositBalanceOf & AugmentedConst<ApiType>; metadataDepositPerByte: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum length of a name or symbol stored on-chain. * The maximum length of a name or symbol stored on-chain.
**/ **/
@@ -48,7 +42,7 @@ declare module '@polkadot/api/types/consts' {
* This means that we will deal with uncle-parents that are * This means that we will deal with uncle-parents that are
* `UncleGenerations + 1` before `now`. * `UncleGenerations + 1` before `now`.
**/ **/
uncleGenerations: BlockNumber & AugmentedConst<ApiType>; uncleGenerations: u32 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -68,7 +62,63 @@ declare module '@polkadot/api/types/consts' {
* duration and the security parameter `c` (where `1 - c` represents * duration and the security parameter `c` (where `1 - c` represents
* the probability of a slot being empty). * the probability of a slot being empty).
**/ **/
expectedBlockTime: Moment & AugmentedConst<ApiType>; expectedBlockTime: u64 & AugmentedConst<ApiType>;
/**
* Max number of authorities allowed
**/
maxAuthorities: u32 & AugmentedConst<ApiType>;
/**
* Generic const
**/
[key: string]: Codec;
};
bagsList: {
/**
* The list of thresholds separating the various bags.
*
* Ids are separated into unsorted bags according to their vote weight. This specifies the
* thresholds separating the bags. An id's bag is the largest bag for which the id's weight
* is less than or equal to its upper threshold.
*
* When ids are iterated, higher bags are iterated completely before lower bags. This means
* that iteration is _semi-sorted_: ids of higher weight tend to come before ids of lower
* weight, but peer ids within a particular bag are sorted in insertion order.
*
* # Expressing the constant
*
* This constant must be sorted in strictly increasing order. Duplicate items are not
* permitted.
*
* There is an implied upper limit of `VoteWeight::MAX`; that value does not need to be
* specified within the bag. For any two threshold lists, if one ends with
* `VoteWeight::MAX`, the other one does not, and they are otherwise equal, the two lists
* will behave identically.
*
* # Calculation
*
* It is recommended to generate the set of thresholds in a geometric series, such that
* there exists some constant ratio such that `threshold[k + 1] == (threshold[k] *
* constant_ratio).max(threshold[k] + 1)` for all `k`.
*
* The helpers in the `/utils/frame/generate-bags` module can simplify this calculation.
*
* # Examples
*
* - If `BagThresholds::get().is_empty()`, then all ids are put into the same bag, and
* iteration is strictly in insertion order.
* - If `BagThresholds::get().len() == 64`, and the thresholds are determined according to
* the procedure given above, then the constant ratio is equal to 2.
* - If `BagThresholds::get().len() == 200`, and the thresholds are determined according to
* the procedure given above, then the constant ratio is approximately equal to 1.248.
* - If the threshold list begins `[1, 2, 3, ...]`, then an id with weight 0 or 1 will fall
* into bag 0, an id with weight 2 will fall into bag 1, etc.
*
* # Migration
*
* In the event that this list ever changes, a copy of the old bags list must be retained.
* With that `List::migrate` can be called, which will perform the appropriate migration.
**/
bagThresholds: Vec<u64> & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -78,7 +128,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The minimum amount required to keep an account open. * The minimum amount required to keep an account open.
**/ **/
existentialDeposit: Balance & AugmentedConst<ApiType>; existentialDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum number of locks that should exist on an account. * The maximum number of locks that should exist on an account.
* Not strictly enforced, but used for weight estimation. * Not strictly enforced, but used for weight estimation.
@@ -95,29 +145,30 @@ declare module '@polkadot/api/types/consts' {
}; };
bounties: { bounties: {
/** /**
* Percentage of the curator fee that will be reserved upfront as deposit for bounty curator. * Percentage of the curator fee that will be reserved upfront as deposit for bounty
* curator.
**/ **/
bountyCuratorDeposit: Permill & AugmentedConst<ApiType>; bountyCuratorDeposit: Permill & AugmentedConst<ApiType>;
/** /**
* The amount held on deposit for placing a bounty proposal. * The amount held on deposit for placing a bounty proposal.
**/ **/
bountyDepositBase: BalanceOf & AugmentedConst<ApiType>; bountyDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The delay period for which a bounty beneficiary need to wait before claim the payout. * The delay period for which a bounty beneficiary need to wait before claim the payout.
**/ **/
bountyDepositPayoutDelay: BlockNumber & AugmentedConst<ApiType>; bountyDepositPayoutDelay: u32 & AugmentedConst<ApiType>;
/** /**
* Bounty duration in blocks. * Bounty duration in blocks.
**/ **/
bountyUpdatePeriod: BlockNumber & AugmentedConst<ApiType>; bountyUpdatePeriod: u32 & AugmentedConst<ApiType>;
/** /**
* Minimum value for a bounty. * Minimum value for a bounty.
**/ **/
bountyValueMinimum: BalanceOf & AugmentedConst<ApiType>; bountyValueMinimum: u128 & AugmentedConst<ApiType>;
/** /**
* The amount held on deposit per byte within bounty description. * The amount held on deposit per byte within the tip report reason or bounty description.
**/ **/
dataDepositPerByte: BalanceOf & AugmentedConst<ApiType>; dataDepositPerByte: u128 & AugmentedConst<ApiType>;
/** /**
* Maximum acceptable reason length. * Maximum acceptable reason length.
**/ **/
@@ -128,6 +179,13 @@ declare module '@polkadot/api/types/consts' {
[key: string]: Codec; [key: string]: Codec;
}; };
contracts: { contracts: {
/**
* The deposit that must be placed into the contract's account to instantiate it.
* This is in **addition** to the [`pallet_balances::Pallet::ExistenialDeposit`].
* The minimum balance for a contract's account can be queried using
* [`Pallet::subsistence_threshold`].
**/
contractDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum number of tries that can be queued for deletion. * The maximum number of tries that can be queued for deletion.
**/ **/
@@ -135,62 +193,11 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The maximum amount of weight that can be consumed per block for lazy trie removal. * The maximum amount of weight that can be consumed per block for lazy trie removal.
**/ **/
deletionWeightLimit: Weight & AugmentedConst<ApiType>; deletionWeightLimit: u64 & AugmentedConst<ApiType>;
/**
* The balance every contract needs to deposit to stay alive indefinitely.
*
* This is different from the [`Self::TombstoneDeposit`] because this only needs to be
* deposited while the contract is alive. Costs for additional storage are added to
* this base cost.
*
* This is a simple way to ensure that contracts with empty storage eventually get deleted
* by making them pay rent. This creates an incentive to remove them early in order to save
* rent.
**/
depositPerContract: BalanceOf & AugmentedConst<ApiType>;
/**
* The balance a contract needs to deposit per storage byte to stay alive indefinitely.
*
* Let's suppose the deposit is 1,000 BU (balance units)/byte and the rent is 1
* BU/byte/day, then a contract with 1,000,000 BU that uses 1,000 bytes of storage would
* pay no rent. But if the balance reduced to 500,000 BU and the storage stayed the same at
* 1,000, then it would pay 500 BU/day.
**/
depositPerStorageByte: BalanceOf & AugmentedConst<ApiType>;
/**
* The balance a contract needs to deposit per storage item to stay alive indefinitely.
*
* It works the same as [`Self::DepositPerStorageByte`] but for storage items.
**/
depositPerStorageItem: BalanceOf & AugmentedConst<ApiType>;
/**
* The fraction of the deposit that should be used as rent per block.
*
* When a contract hasn't enough balance deposited to stay alive indefinitely it needs
* to pay per block for the storage it consumes that is not covered by the deposit.
* This determines how high this rent payment is per block as a fraction of the deposit.
**/
rentFraction: Perbill & AugmentedConst<ApiType>;
/** /**
* Cost schedule and limits. * Cost schedule and limits.
**/ **/
schedule: Schedule & AugmentedConst<ApiType>; schedule: PalletContractsSchedule & AugmentedConst<ApiType>;
/**
* Number of block delay an extrinsic claim surcharge has.
*
* When claim surcharge is called by an extrinsic the rent is checked
* for current_block - delay
**/
signedClaimHandicap: BlockNumber & AugmentedConst<ApiType>;
/**
* Reward that is received by the party whose touch has led
* to removal of a contract.
**/
surchargeReward: BalanceOf & AugmentedConst<ApiType>;
/**
* The minimum amount required to generate a tombstone.
**/
tombstoneDeposit: BalanceOf & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -200,7 +207,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Period in blocks where an external proposal may not be re-submitted after being vetoed. * Period in blocks where an external proposal may not be re-submitted after being vetoed.
**/ **/
cooloffPeriod: BlockNumber & AugmentedConst<ApiType>; cooloffPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* The period between a proposal being approved and enacted. * The period between a proposal being approved and enacted.
* *
@@ -208,11 +215,11 @@ declare module '@polkadot/api/types/consts' {
* voting stakers have an opportunity to remove themselves from the system in the case * voting stakers have an opportunity to remove themselves from the system in the case
* where they are on the losing side of a vote. * where they are on the losing side of a vote.
**/ **/
enactmentPeriod: BlockNumber & AugmentedConst<ApiType>; enactmentPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* Minimum voting period allowed for a fast-track referendum. * Minimum voting period allowed for a fast-track referendum.
**/ **/
fastTrackVotingPeriod: BlockNumber & AugmentedConst<ApiType>; fastTrackVotingPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* Indicator for whether an emergency origin is even allowed to happen. Some chains may * Indicator for whether an emergency origin is even allowed to happen. Some chains may
* want to set this permanently to `false`, others may want to condition it on things such * want to set this permanently to `false`, others may want to condition it on things such
@@ -222,7 +229,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* How often (in blocks) new public referenda are launched. * How often (in blocks) new public referenda are launched.
**/ **/
launchPeriod: BlockNumber & AugmentedConst<ApiType>; launchPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* The maximum number of public proposals that can exist at any time. * The maximum number of public proposals that can exist at any time.
**/ **/
@@ -237,33 +244,28 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The minimum amount to be used as a deposit for a public referendum proposal. * The minimum amount to be used as a deposit for a public referendum proposal.
**/ **/
minimumDeposit: BalanceOf & AugmentedConst<ApiType>; minimumDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The amount of balance that must be deposited per byte of preimage stored. * The amount of balance that must be deposited per byte of preimage stored.
**/ **/
preimageByteDeposit: BalanceOf & AugmentedConst<ApiType>; preimageByteDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The minimum period of vote locking. * The minimum period of vote locking.
* *
* It should be no shorter than enactment period to ensure that in the case of an approval, * It should be no shorter than enactment period to ensure that in the case of an approval,
* those successful voters are locked into the consequences that their votes entail. * those successful voters are locked into the consequences that their votes entail.
**/ **/
voteLockingPeriod: BlockNumber & AugmentedConst<ApiType>; voteLockingPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* How often (in blocks) to check for new votes. * How often (in blocks) to check for new votes.
**/ **/
votingPeriod: BlockNumber & AugmentedConst<ApiType>; votingPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
[key: string]: Codec; [key: string]: Codec;
}; };
electionProviderMultiPhase: { electionProviderMultiPhase: {
/**
* Maximum number of iteration of balancing that will be executed in the embedded miner of
* the pallet.
**/
minerMaxIterations: u32 & AugmentedConst<ApiType>;
/** /**
* Maximum length (bytes) that the mined solution should consume. * Maximum length (bytes) that the mined solution should consume.
* *
@@ -277,30 +279,30 @@ declare module '@polkadot/api/types/consts' {
* The miner will ensure that the total weight of the unsigned solution will not exceed * The miner will ensure that the total weight of the unsigned solution will not exceed
* this value, based on [`WeightInfo::submit_unsigned`]. * this value, based on [`WeightInfo::submit_unsigned`].
**/ **/
minerMaxWeight: Weight & AugmentedConst<ApiType>; minerMaxWeight: u64 & AugmentedConst<ApiType>;
/** /**
* The priority of the unsigned transaction submitted in the unsigned-phase * The priority of the unsigned transaction submitted in the unsigned-phase
**/ **/
minerTxPriority: TransactionPriority & AugmentedConst<ApiType>; minerTxPriority: u64 & AugmentedConst<ApiType>;
/** /**
* The repeat threshold of the offchain worker. * The repeat threshold of the offchain worker.
* *
* For example, if it is 5, that means that at least 5 blocks will elapse between attempts * For example, if it is 5, that means that at least 5 blocks will elapse between attempts
* to submit the worker's solution. * to submit the worker's solution.
**/ **/
offchainRepeat: BlockNumber & AugmentedConst<ApiType>; offchainRepeat: u32 & AugmentedConst<ApiType>;
/** /**
* Base deposit for a signed solution. * Base deposit for a signed solution.
**/ **/
signedDepositBase: BalanceOf & AugmentedConst<ApiType>; signedDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* Per-byte deposit for a signed solution. * Per-byte deposit for a signed solution.
**/ **/
signedDepositByte: BalanceOf & AugmentedConst<ApiType>; signedDepositByte: u128 & AugmentedConst<ApiType>;
/** /**
* Per-weight deposit for a signed solution. * Per-weight deposit for a signed solution.
**/ **/
signedDepositWeight: BalanceOf & AugmentedConst<ApiType>; signedDepositWeight: u128 & AugmentedConst<ApiType>;
/** /**
* Maximum number of signed submissions that can be queued. * Maximum number of signed submissions that can be queued.
* *
@@ -316,15 +318,15 @@ declare module '@polkadot/api/types/consts' {
* *
* This should probably be similar to [`Config::MinerMaxWeight`]. * This should probably be similar to [`Config::MinerMaxWeight`].
**/ **/
signedMaxWeight: Weight & AugmentedConst<ApiType>; signedMaxWeight: u64 & AugmentedConst<ApiType>;
/** /**
* Duration of the signed phase. * Duration of the signed phase.
**/ **/
signedPhase: BlockNumber & AugmentedConst<ApiType>; signedPhase: u32 & AugmentedConst<ApiType>;
/** /**
* Base reward for a signed solution * Base reward for a signed solution
**/ **/
signedRewardBase: BalanceOf & AugmentedConst<ApiType>; signedRewardBase: u128 & AugmentedConst<ApiType>;
/** /**
* The minimum amount of improvement to the solution score that defines a solution as * The minimum amount of improvement to the solution score that defines a solution as
* "better" (in any phase). * "better" (in any phase).
@@ -333,7 +335,16 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Duration of the unsigned phase. * Duration of the unsigned phase.
**/ **/
unsignedPhase: BlockNumber & AugmentedConst<ApiType>; unsignedPhase: u32 & AugmentedConst<ApiType>;
/**
* The maximum number of voters to put in the snapshot. At the moment, snapshots are only
* over a single block, but once multi-block elections are introduced they will take place
* over multiple blocks.
*
* Also, note the data type: If the voters are represented by a `u32` in `type
* CompactSolution`, the same `u32` is used here to ensure bounds are respected.
**/
voterSnapshotPerBlock: u32 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -343,7 +354,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* How much should be locked up in order to submit one's candidacy. * How much should be locked up in order to submit one's candidacy.
**/ **/
candidacyBond: BalanceOf & AugmentedConst<ApiType>; candidacyBond: u128 & AugmentedConst<ApiType>;
/** /**
* Number of members to elect. * Number of members to elect.
**/ **/
@@ -355,24 +366,24 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Identifier for the elections-phragmen pallet's lock * Identifier for the elections-phragmen pallet's lock
**/ **/
palletId: LockIdentifier & AugmentedConst<ApiType>; palletId: U8aFixed & AugmentedConst<ApiType>;
/** /**
* How long each seat is kept. This defines the next block number at which an election * How long each seat is kept. This defines the next block number at which an election
* round will happen. If set to zero, no elections are ever triggered and the module will * round will happen. If set to zero, no elections are ever triggered and the module will
* be in passive mode. * be in passive mode.
**/ **/
termDuration: BlockNumber & AugmentedConst<ApiType>; termDuration: u32 & AugmentedConst<ApiType>;
/** /**
* Base deposit associated with voting. * Base deposit associated with voting.
* *
* This should be sensibly high to economically ensure the pallet cannot be attacked by * This should be sensibly high to economically ensure the pallet cannot be attacked by
* creating a gigantic number of votes. * creating a gigantic number of votes.
**/ **/
votingBondBase: BalanceOf & AugmentedConst<ApiType>; votingBondBase: u128 & AugmentedConst<ApiType>;
/** /**
* The amount of bond that need to be locked for each vote (32 bytes). * The amount of bond that need to be locked for each vote (32 bytes).
**/ **/
votingBondFactor: BalanceOf & AugmentedConst<ApiType>; votingBondFactor: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -389,7 +400,7 @@ declare module '@polkadot/api/types/consts' {
* The issuance to ignore. This is subtracted from the `Currency`'s `total_issuance` to get * The issuance to ignore. This is subtracted from the `Currency`'s `total_issuance` to get
* the issuance by which we inflate or deflate the gilt. * the issuance by which we inflate or deflate the gilt.
**/ **/
ignoredIssuance: BalanceOf & AugmentedConst<ApiType>; ignoredIssuance: u128 & AugmentedConst<ApiType>;
/** /**
* The number of blocks between consecutive attempts to issue more gilts in an effort to * The number of blocks between consecutive attempts to issue more gilts in an effort to
* get to the target amount to be frozen. * get to the target amount to be frozen.
@@ -397,7 +408,7 @@ declare module '@polkadot/api/types/consts' {
* A larger value results in fewer storage hits each block, but a slower period to get to * A larger value results in fewer storage hits each block, but a slower period to get to
* the target. * the target.
**/ **/
intakePeriod: BlockNumber & AugmentedConst<ApiType>; intakePeriod: u32 & AugmentedConst<ApiType>;
/** /**
* The maximum amount of bids that can be turned into issued gilts each block. A larger * The maximum amount of bids that can be turned into issued gilts each block. A larger
* value here means less of the block available for transactions should there be a glut of * value here means less of the block available for transactions should there be a glut of
@@ -416,12 +427,12 @@ declare module '@polkadot/api/types/consts' {
* It should be at least big enough to ensure that there is no possible storage spam attack * It should be at least big enough to ensure that there is no possible storage spam attack
* or queue-filling attack. * or queue-filling attack.
**/ **/
minFreeze: BalanceOf & AugmentedConst<ApiType>; minFreeze: u128 & AugmentedConst<ApiType>;
/** /**
* The base period for the duration queues. This is the common multiple across all * The base period for the duration queues. This is the common multiple across all
* supported freezing durations that can be bid upon. * supported freezing durations that can be bid upon.
**/ **/
period: BlockNumber & AugmentedConst<ApiType>; period: u32 & AugmentedConst<ApiType>;
/** /**
* Number of duration queues in total. This sets the maximum duration supported, which is * Number of duration queues in total. This sets the maximum duration supported, which is
* this value multiplied by `Period`. * this value multiplied by `Period`.
@@ -432,15 +443,25 @@ declare module '@polkadot/api/types/consts' {
**/ **/
[key: string]: Codec; [key: string]: Codec;
}; };
grandpa: {
/**
* Max Authorities in use
**/
maxAuthorities: u32 & AugmentedConst<ApiType>;
/**
* Generic const
**/
[key: string]: Codec;
};
identity: { identity: {
/** /**
* The amount held on deposit for a registered identity * The amount held on deposit for a registered identity
**/ **/
basicDeposit: BalanceOf & AugmentedConst<ApiType>; basicDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The amount held on deposit per additional field for a registered identity. * The amount held on deposit per additional field for a registered identity.
**/ **/
fieldDeposit: BalanceOf & AugmentedConst<ApiType>; fieldDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* Maximum number of additional fields that may be stored in an ID. Needed to bound the I/O * Maximum number of additional fields that may be stored in an ID. Needed to bound the I/O
* required to access an identity, but can be pretty high. * required to access an identity, but can be pretty high.
@@ -460,7 +481,7 @@ declare module '@polkadot/api/types/consts' {
* that one storage item's value will increase by the size of an account ID, and there will * that one storage item's value will increase by the size of an account ID, and there will
* be another trie item whose value is the size of an account ID plus 32 bytes. * be another trie item whose value is the size of an account ID plus 32 bytes.
**/ **/
subAccountDeposit: BalanceOf & AugmentedConst<ApiType>; subAccountDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -473,7 +494,7 @@ declare module '@polkadot/api/types/consts' {
* This is exposed so that it can be tuned for particular runtime, when * This is exposed so that it can be tuned for particular runtime, when
* multiple pallets send unsigned transactions. * multiple pallets send unsigned transactions.
**/ **/
unsignedPriority: TransactionPriority & AugmentedConst<ApiType>; unsignedPriority: u64 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -483,7 +504,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The deposit needed for reserving an index. * The deposit needed for reserving an index.
**/ **/
deposit: BalanceOf & AugmentedConst<ApiType>; deposit: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -503,7 +524,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The Lottery's pallet id * The Lottery's pallet id
**/ **/
palletId: PalletId & AugmentedConst<ApiType>; palletId: FrameSupportPalletId & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -518,13 +539,13 @@ declare module '@polkadot/api/types/consts' {
* `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is * `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is
* `32 + sizeof(AccountId)` bytes. * `32 + sizeof(AccountId)` bytes.
**/ **/
depositBase: BalanceOf & AugmentedConst<ApiType>; depositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The amount of currency needed per unit threshold when creating a multisig execution. * The amount of currency needed per unit threshold when creating a multisig execution.
* *
* This is held for adding 32 bytes more into a pre-existing storage value. * This is held for adding 32 bytes more into a pre-existing storage value.
**/ **/
depositFactor: BalanceOf & AugmentedConst<ApiType>; depositFactor: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum amount of signatories allowed in the multisig. * The maximum amount of signatories allowed in the multisig.
**/ **/
@@ -541,14 +562,14 @@ declare module '@polkadot/api/types/consts' {
* This is held when a new storage item holding a `Balance` is created (typically 16 * This is held when a new storage item holding a `Balance` is created (typically 16
* bytes). * bytes).
**/ **/
announcementDepositBase: BalanceOf & AugmentedConst<ApiType>; announcementDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The amount of currency needed per announcement made. * The amount of currency needed per announcement made.
* *
* This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes) * This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes)
* into a pre-existing storage value. * into a pre-existing storage value.
**/ **/
announcementDepositFactor: BalanceOf & AugmentedConst<ApiType>; announcementDepositFactor: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum amount of time-delayed announcements that are allowed to be pending. * The maximum amount of time-delayed announcements that are allowed to be pending.
**/ **/
@@ -563,7 +584,7 @@ declare module '@polkadot/api/types/consts' {
* This is held for an additional storage item whose value size is * This is held for an additional storage item whose value size is
* `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes. * `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes.
**/ **/
proxyDepositBase: BalanceOf & AugmentedConst<ApiType>; proxyDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The amount of currency needed per proxy added. * The amount of currency needed per proxy added.
* *
@@ -571,7 +592,7 @@ declare module '@polkadot/api/types/consts' {
* pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take * pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take
* into account `32 + proxy_type.encode().len()` bytes of data. * into account `32 + proxy_type.encode().len()` bytes of data.
**/ **/
proxyDepositFactor: BalanceOf & AugmentedConst<ApiType>; proxyDepositFactor: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -584,7 +605,7 @@ declare module '@polkadot/api/types/consts' {
* This is held for an additional storage item whose value size is * This is held for an additional storage item whose value size is
* `2 + sizeof(BlockNumber, Balance)` bytes. * `2 + sizeof(BlockNumber, Balance)` bytes.
**/ **/
configDepositBase: BalanceOf & AugmentedConst<ApiType>; configDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The amount of currency needed per additional user when creating a recovery * The amount of currency needed per additional user when creating a recovery
* configuration. * configuration.
@@ -592,7 +613,7 @@ declare module '@polkadot/api/types/consts' {
* This is held for adding `sizeof(AccountId)` bytes more into a pre-existing storage * This is held for adding `sizeof(AccountId)` bytes more into a pre-existing storage
* value. * value.
**/ **/
friendDepositFactor: BalanceOf & AugmentedConst<ApiType>; friendDepositFactor: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum amount of friends allowed in a recovery configuration. * The maximum amount of friends allowed in a recovery configuration.
**/ **/
@@ -606,7 +627,7 @@ declare module '@polkadot/api/types/consts' {
* `sizeof(BlockNumber, Balance + T * AccountId)` bytes. Where T is a configurable * `sizeof(BlockNumber, Balance + T * AccountId)` bytes. Where T is a configurable
* threshold. * threshold.
**/ **/
recoveryDeposit: BalanceOf & AugmentedConst<ApiType>; recoveryDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -617,7 +638,7 @@ declare module '@polkadot/api/types/consts' {
* The maximum weight that may be scheduled per block for any dispatchables of less * The maximum weight that may be scheduled per block for any dispatchables of less
* priority than `schedule::HARD_DEADLINE`. * priority than `schedule::HARD_DEADLINE`.
**/ **/
maximumWeight: Weight & AugmentedConst<ApiType>; maximumWeight: u64 & AugmentedConst<ApiType>;
/** /**
* The maximum number of scheduled calls in the queue for a single block. * The maximum number of scheduled calls in the queue for a single block.
* Not strictly enforced, but used for weight estimation. * Not strictly enforced, but used for weight estimation.
@@ -632,37 +653,41 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The minimum amount of a deposit required for a bid to be made. * The minimum amount of a deposit required for a bid to be made.
**/ **/
candidateDeposit: BalanceOf & AugmentedConst<ApiType>; candidateDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The number of blocks between membership challenges. * The number of blocks between membership challenges.
**/ **/
challengePeriod: BlockNumber & AugmentedConst<ApiType>; challengePeriod: u32 & AugmentedConst<ApiType>;
/** /**
* Maximum candidate intake per round. * The maximum number of candidates that we accept per round.
**/ **/
maxCandidateIntake: u32 & AugmentedConst<ApiType>; maxCandidateIntake: u32 & AugmentedConst<ApiType>;
/** /**
* The number of times a member may vote the wrong way (or not at all, when they are a skeptic) * The maximum duration of the payout lock.
* before they become suspended. **/
maxLockDuration: u32 & AugmentedConst<ApiType>;
/**
* The number of times a member may vote the wrong way (or not at all, when they are a
* skeptic) before they become suspended.
**/ **/
maxStrikes: u32 & AugmentedConst<ApiType>; maxStrikes: u32 & AugmentedConst<ApiType>;
/** /**
* The societies's module id * The societies's pallet id
**/ **/
palletId: PalletId & AugmentedConst<ApiType>; palletId: FrameSupportPalletId & AugmentedConst<ApiType>;
/** /**
* The amount of incentive paid within each period. Doesn't include VoterTip. * The amount of incentive paid within each period. Doesn't include VoterTip.
**/ **/
periodSpend: BalanceOf & AugmentedConst<ApiType>; periodSpend: u128 & AugmentedConst<ApiType>;
/** /**
* The number of blocks between candidate/membership rotation periods. * The number of blocks between candidate/membership rotation periods.
**/ **/
rotationPeriod: BlockNumber & AugmentedConst<ApiType>; rotationPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* The amount of the unpaid reward that gets deducted in the case that either a skeptic * The amount of the unpaid reward that gets deducted in the case that either a skeptic
* doesn't vote or someone votes in the wrong way. * doesn't vote or someone votes in the wrong way.
**/ **/
wrongSideDeduction: BalanceOf & AugmentedConst<ApiType>; wrongSideDeduction: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -672,7 +697,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Number of eras that staked funds must remain bonded for. * Number of eras that staked funds must remain bonded for.
**/ **/
bondingDuration: EraIndex & AugmentedConst<ApiType>; bondingDuration: u32 & AugmentedConst<ApiType>;
maxNominations: u32 & AugmentedConst<ApiType>; maxNominations: u32 & AugmentedConst<ApiType>;
/** /**
* The maximum number of nominators rewarded for each validator. * The maximum number of nominators rewarded for each validator.
@@ -684,14 +709,14 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Number of sessions per era. * Number of sessions per era.
**/ **/
sessionsPerEra: SessionIndex & AugmentedConst<ApiType>; sessionsPerEra: u32 & AugmentedConst<ApiType>;
/** /**
* Number of eras that slashes are deferred by, after computation. * Number of eras that slashes are deferred by, after computation.
* *
* This should be less than the bonding duration. Set to 0 if slashes * This should be less than the bonding duration. Set to 0 if slashes
* should be applied immediately, without opportunity for intervention. * should be applied immediately, without opportunity for intervention.
**/ **/
slashDeferDuration: EraIndex & AugmentedConst<ApiType>; slashDeferDuration: u32 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -701,19 +726,19 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Maximum number of block number to block hash mappings to keep (oldest pruned first). * Maximum number of block number to block hash mappings to keep (oldest pruned first).
**/ **/
blockHashCount: BlockNumber & AugmentedConst<ApiType>; blockHashCount: u32 & AugmentedConst<ApiType>;
/** /**
* The maximum length of a block (in bytes). * The maximum length of a block (in bytes).
**/ **/
blockLength: BlockLength & AugmentedConst<ApiType>; blockLength: FrameSystemLimitsBlockLength & AugmentedConst<ApiType>;
/** /**
* Block & extrinsics weights: base values and limits. * Block & extrinsics weights: base values and limits.
**/ **/
blockWeights: BlockWeights & AugmentedConst<ApiType>; blockWeights: FrameSystemLimitsBlockWeights & AugmentedConst<ApiType>;
/** /**
* The weight of runtime database operations the runtime can invoke. * The weight of runtime database operations the runtime can invoke.
**/ **/
dbWeight: RuntimeDbWeight & AugmentedConst<ApiType>; dbWeight: FrameSupportWeightsRuntimeDbWeight & AugmentedConst<ApiType>;
/** /**
* The designated SS85 prefix of this chain. * The designated SS85 prefix of this chain.
* *
@@ -725,7 +750,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Get the chain's current version. * Get the chain's current version.
**/ **/
version: RuntimeVersion & AugmentedConst<ApiType>; version: SpVersionRuntimeVersion & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -738,7 +763,7 @@ declare module '@polkadot/api/types/consts' {
* generally work with this to determine a sensible block time. e.g. For Aura, it will be * generally work with this to determine a sensible block time. e.g. For Aura, it will be
* double this period on default settings. * double this period on default settings.
**/ **/
minimumPeriod: Moment & AugmentedConst<ApiType>; minimumPeriod: u64 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -746,9 +771,9 @@ declare module '@polkadot/api/types/consts' {
}; };
tips: { tips: {
/** /**
* The amount held on deposit per byte within the tip report reason. * The amount held on deposit per byte within the tip report reason or bounty description.
**/ **/
dataDepositPerByte: BalanceOf & AugmentedConst<ApiType>; dataDepositPerByte: u128 & AugmentedConst<ApiType>;
/** /**
* Maximum acceptable reason length. * Maximum acceptable reason length.
**/ **/
@@ -756,15 +781,15 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The period for which a tip remains open after is has achieved threshold tippers. * The period for which a tip remains open after is has achieved threshold tippers.
**/ **/
tipCountdown: BlockNumber & AugmentedConst<ApiType>; tipCountdown: u32 & AugmentedConst<ApiType>;
/** /**
* The amount of the final tip which goes to the original reporter of the tip. * The percent of the final tip which goes to the original reporter of the tip.
**/ **/
tipFindersFee: Percent & AugmentedConst<ApiType>; tipFindersFee: Percent & AugmentedConst<ApiType>;
/** /**
* The amount held on deposit for placing a tip report. * The amount held on deposit for placing a tip report.
**/ **/
tipReportDepositBase: BalanceOf & AugmentedConst<ApiType>; tipReportDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -774,11 +799,11 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The fee to be paid for making a transaction; the per-byte portion. * The fee to be paid for making a transaction; the per-byte portion.
**/ **/
transactionByteFee: BalanceOf & AugmentedConst<ApiType>; transactionByteFee: u128 & AugmentedConst<ApiType>;
/** /**
* The polynomial that is applied in order to derive fee from weight. * The polynomial that is applied in order to derive fee from weight.
**/ **/
weightToFee: Vec<WeightToFeeCoefficient> & AugmentedConst<ApiType>; weightToFee: Vec<FrameSupportWeightsWeightToFeeCoefficient> & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -796,7 +821,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The treasury's pallet id, used for deriving its sovereign account ID. * The treasury's pallet id, used for deriving its sovereign account ID.
**/ **/
palletId: PalletId & AugmentedConst<ApiType>; palletId: FrameSupportPalletId & AugmentedConst<ApiType>;
/** /**
* Fraction of a proposal's value that should be bonded in order to place the proposal. * Fraction of a proposal's value that should be bonded in order to place the proposal.
* An accepted proposal gets these back. A rejected proposal does not. * An accepted proposal gets these back. A rejected proposal does not.
@@ -805,11 +830,11 @@ declare module '@polkadot/api/types/consts' {
/** /**
* Minimum amount of funds that should be placed in a deposit for making a proposal. * Minimum amount of funds that should be placed in a deposit for making a proposal.
**/ **/
proposalBondMinimum: BalanceOf & AugmentedConst<ApiType>; proposalBondMinimum: u128 & AugmentedConst<ApiType>;
/** /**
* Period between successive spends. * Period between successive spends.
**/ **/
spendPeriod: BlockNumber & AugmentedConst<ApiType>; spendPeriod: u32 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
@@ -819,20 +844,20 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The basic amount of funds that must be reserved when adding an attribute to an asset. * The basic amount of funds that must be reserved when adding an attribute to an asset.
**/ **/
attributeDepositBase: DepositBalanceOf & AugmentedConst<ApiType>; attributeDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The basic amount of funds that must be reserved for an asset class. * The basic amount of funds that must be reserved for an asset class.
**/ **/
classDeposit: DepositBalanceOf & AugmentedConst<ApiType>; classDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The additional funds that must be reserved for the number of bytes store in metadata, * The additional funds that must be reserved for the number of bytes store in metadata,
* either "normal" metadata or attribute metadata. * either "normal" metadata or attribute metadata.
**/ **/
depositPerByte: DepositBalanceOf & AugmentedConst<ApiType>; depositPerByte: u128 & AugmentedConst<ApiType>;
/** /**
* The basic amount of funds that must be reserved for an asset instance. * The basic amount of funds that must be reserved for an asset instance.
**/ **/
instanceDeposit: DepositBalanceOf & AugmentedConst<ApiType>; instanceDeposit: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum length of an attribute key. * The maximum length of an attribute key.
**/ **/
@@ -840,7 +865,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The basic amount of funds that must be reserved when adding metadata to your asset. * The basic amount of funds that must be reserved when adding metadata to your asset.
**/ **/
metadataDepositBase: DepositBalanceOf & AugmentedConst<ApiType>; metadataDepositBase: u128 & AugmentedConst<ApiType>;
/** /**
* The maximum length of data stored on-chain. * The maximum length of data stored on-chain.
**/ **/
@@ -869,7 +894,7 @@ declare module '@polkadot/api/types/consts' {
/** /**
* The minimum amount transferred to call `vested_transfer`. * The minimum amount transferred to call `vested_transfer`.
**/ **/
minVestedTransfer: BalanceOf & AugmentedConst<ApiType>; minVestedTransfer: u128 & AugmentedConst<ApiType>;
/** /**
* Generic const * Generic const
**/ **/
+5 -49
View File
@@ -196,9 +196,8 @@ declare module '@polkadot/api/types/errors' {
contracts: { contracts: {
/** /**
* Performing the requested transfer would have brought the contract below * Performing the requested transfer would have brought the contract below
* the subsistence threshold. No transfer is allowed to do this in order to allow * the subsistence threshold. No transfer is allowed to do this. Use `seal_terminate`
* for a tombstone to be created. Use `seal_terminate` to remove a contract without * to recover a deposit.
* leaving a tombstone behind.
**/ **/
BelowSubsistenceThreshold: AugmentedError<ApiType>; BelowSubsistenceThreshold: AugmentedError<ApiType>;
/** /**
@@ -210,20 +209,6 @@ declare module '@polkadot/api/types/errors' {
* current schedule. * current schedule.
**/ **/
CodeTooLarge: AugmentedError<ApiType>; CodeTooLarge: AugmentedError<ApiType>;
/**
* A tombstone exist at the specified address.
*
* Tombstone cannot be called. Anyone can use `seal_restore_to` in order to revive
* the contract, though.
**/
ContractIsTombstone: AugmentedError<ApiType>;
/**
* A contract could not be evicted because it has enough balance to pay rent.
*
* This can be returned from [`Pallet::claim_surcharge`] because the target
* contract has enough balance to pay for its rent.
**/
ContractNotEvictable: AugmentedError<ApiType>;
/** /**
* No contract was found at the specified address. * No contract was found at the specified address.
**/ **/
@@ -243,7 +228,7 @@ declare module '@polkadot/api/types/errors' {
/** /**
* Removal of a contract failed because the deletion queue is full. * Removal of a contract failed because the deletion queue is full.
* *
* This can happen when either calling [`Pallet::claim_surcharge`] or `seal_terminate`. * This can happen when calling `seal_terminate`.
* The queue is filled by deleting contracts and emptied by a fixed amount each block. * The queue is filled by deleting contracts and emptied by a fixed amount each block.
* Trying again during another block is the only way to resolve this issue. * Trying again during another block is the only way to resolve this issue.
**/ **/
@@ -260,30 +245,10 @@ declare module '@polkadot/api/types/errors' {
* `seal_call` forwarded this contracts input. It therefore is no longer available. * `seal_call` forwarded this contracts input. It therefore is no longer available.
**/ **/
InputForwarded: AugmentedError<ApiType>; InputForwarded: AugmentedError<ApiType>;
/**
* An origin TrieId written in the current block.
**/
InvalidContractOrigin: AugmentedError<ApiType>;
/**
* Cannot restore to nonexisting or alive contract.
**/
InvalidDestinationContract: AugmentedError<ApiType>;
/** /**
* A new schedule must have a greater version than the current one. * A new schedule must have a greater version than the current one.
**/ **/
InvalidScheduleVersion: AugmentedError<ApiType>; InvalidScheduleVersion: AugmentedError<ApiType>;
/**
* Cannot restore from nonexisting or tombstone contract.
**/
InvalidSourceContract: AugmentedError<ApiType>;
/**
* An origin must be signed or inherent and auxiliary sender only provided on inherent.
**/
InvalidSurchargeClaim: AugmentedError<ApiType>;
/**
* Tombstones don't match.
**/
InvalidTombstone: AugmentedError<ApiType>;
/** /**
* Performing a call was denied because the calling depth reached the limit * Performing a call was denied because the calling depth reached the limit
* of what is specified in the schedule. * of what is specified in the schedule.
@@ -320,15 +285,6 @@ declare module '@polkadot/api/types/errors' {
* A call tried to invoke a contract that is flagged as non-reentrant. * A call tried to invoke a contract that is flagged as non-reentrant.
**/ **/
ReentranceDenied: AugmentedError<ApiType>; ReentranceDenied: AugmentedError<ApiType>;
/**
* The called contract does not have enough balance to pay for its storage.
*
* The contract ran out of balance and is therefore eligible for eviction into a
* tombstone. Anyone can evict the contract by submitting a `claim_surcharge`
* extrinsic. Alternatively, a plain balance transfer can be used in order to
* increase the contracts funds so that it can be called again.
**/
RentNotPaid: AugmentedError<ApiType>;
/** /**
* A storage modification exhausted the 32bit type that holds the storage size. * A storage modification exhausted the 32bit type that holds the storage size.
* *
@@ -339,12 +295,12 @@ declare module '@polkadot/api/types/errors' {
/** /**
* A contract self destructed in its constructor. * A contract self destructed in its constructor.
* *
* This can be triggered by a call to `seal_terminate` or `seal_restore_to`. * This can be triggered by a call to `seal_terminate`.
**/ **/
TerminatedInConstructor: AugmentedError<ApiType>; TerminatedInConstructor: AugmentedError<ApiType>;
/** /**
* Termination of a contract is not allowed while the contract is already * Termination of a contract is not allowed while the contract is already
* on the call stack. Can be triggered by `seal_terminate` or `seal_restore_to. * on the call stack. Can be triggered by `seal_terminate`.
**/ **/
TerminatedWhileReentrant: AugmentedError<ApiType>; TerminatedWhileReentrant: AugmentedError<ApiType>;
/** /**
File diff suppressed because it is too large Load Diff
+1
View File
@@ -1,6 +1,7 @@
// Copyright 2017-2021 @polkadot/api authors & contributors // Copyright 2017-2021 @polkadot/api authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import '@polkadot/types/augment';
import './consts'; import './consts';
import './errors'; import './errors';
import './events'; import './events';
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -2,7 +2,6 @@
/* eslint-disable */ /* eslint-disable */
import type { Bytes, HashMap, Json, Metadata, Null, Option, StorageKey, Text, U256, U64, Vec, bool, u32, u64 } from '@polkadot/types'; import type { Bytes, HashMap, Json, Metadata, Null, Option, StorageKey, Text, U256, U64, Vec, bool, u32, u64 } from '@polkadot/types';
import type { AnyNumber, Codec, IExtrinsic, Observable } from '@polkadot/types/types';
import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author'; import type { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';
import type { EpochAuthorship } from '@polkadot/types/interfaces/babe'; import type { EpochAuthorship } from '@polkadot/types/interfaces/babe';
import type { BeefySignedCommitment } from '@polkadot/types/interfaces/beefy'; import type { BeefySignedCommitment } from '@polkadot/types/interfaces/beefy';
@@ -21,6 +20,7 @@ import type { RpcMethods } from '@polkadot/types/interfaces/rpc';
import type { AccountId, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime'; import type { AccountId, BlockNumber, H160, H256, H64, Hash, Header, Index, Justification, KeyValue, SignedBlock, StorageData } from '@polkadot/types/interfaces/runtime';
import type { ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state'; import type { ReadProof, RuntimeVersion, TraceBlockResponse } from '@polkadot/types/interfaces/state';
import type { ApplyExtrinsicResult, ChainProperties, ChainType, Health, NetworkState, NodeRole, PeerInfo, SyncState } from '@polkadot/types/interfaces/system'; import type { ApplyExtrinsicResult, ChainProperties, ChainType, Health, NetworkState, NodeRole, PeerInfo, SyncState } from '@polkadot/types/interfaces/system';
import type { AnyNumber, Codec, IExtrinsic, Observable } from '@polkadot/types/types';
declare module '@polkadot/rpc-core/types.jsonrpc' { declare module '@polkadot/rpc-core/types.jsonrpc' {
export interface RpcInterface { export interface RpcInterface {
@@ -113,6 +113,10 @@ declare module '@polkadot/rpc-core/types.jsonrpc' {
* Returns a child storage entry at a specific block state * Returns a child storage entry at a specific block state
**/ **/
getStorage: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<StorageData>>>; getStorage: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, key: StorageKey | string | Uint8Array | any, at?: Hash | string | Uint8Array) => Observable<Option<StorageData>>>;
/**
* Returns child storage entries for multiple keys at a specific block state
**/
getStorageEntries: AugmentedRpc<(childKey: PrefixedStorageKey | string | Uint8Array, keys: Vec<StorageKey> | (StorageKey | string | Uint8Array | any)[], at?: Hash | string | Uint8Array) => Observable<Vec<Option<StorageData>>>>;
/** /**
* Returns the hash of a child storage entry at a block state * Returns the hash of a child storage entry at a block state
**/ **/
File diff suppressed because it is too large Load Diff
+53 -40
View File
@@ -12,7 +12,7 @@ import type { SubmittableExtrinsic } from '../submittable/types';
import type { ApiDecoration, ApiInterfaceRx, ApiOptions, ApiTypes, DecoratedErrors, DecoratedEvents, DecoratedRpc, DecoratedRpcSection, DecorateMethod, PaginationOptions, QueryableConsts, QueryableModuleStorage, QueryableModuleStorageAt, QueryableStorage, QueryableStorageAt, QueryableStorageEntry, QueryableStorageEntryAt, QueryableStorageMulti, QueryableStorageMultiArg, SubmittableExtrinsicFunction, SubmittableExtrinsics, SubmittableModuleExtrinsics } from '../types'; import type { ApiDecoration, ApiInterfaceRx, ApiOptions, ApiTypes, DecoratedErrors, DecoratedEvents, DecoratedRpc, DecoratedRpcSection, DecorateMethod, PaginationOptions, QueryableConsts, QueryableModuleStorage, QueryableModuleStorageAt, QueryableStorage, QueryableStorageAt, QueryableStorageEntry, QueryableStorageEntryAt, QueryableStorageMulti, QueryableStorageMultiArg, SubmittableExtrinsicFunction, SubmittableExtrinsics, SubmittableModuleExtrinsics } from '../types';
import type { VersionedRegistry } from './types'; import type { VersionedRegistry } from './types';
import { BehaviorSubject, combineLatest, map, of, switchMap, tap, toArray } from 'rxjs'; import { BehaviorSubject, combineLatest, from, map, of, switchMap, tap, toArray } from 'rxjs';
import { decorateDerive, ExactDerive } from '@polkadot/api-derive'; import { decorateDerive, ExactDerive } from '@polkadot/api-derive';
import { memo, RpcCore } from '@polkadot/rpc-core'; import { memo, RpcCore } from '@polkadot/rpc-core';
@@ -154,6 +154,8 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
this._rx.hasSubscriptions = this._rpcCore.provider.hasSubscriptions; this._rx.hasSubscriptions = this._rpcCore.provider.hasSubscriptions;
} }
public abstract at (blockHash: Uint8Array | string): Promise<ApiDecoration<ApiType>>;
/** /**
* @description Return the current used registry * @description Return the current used registry
*/ */
@@ -195,7 +197,11 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
consts: {}, consts: {},
errors: {}, errors: {},
events: {}, events: {},
query: {} query: {},
registry: registry.registry,
rx: {
query: {}
}
} as ApiDecoration<ApiType>; } as ApiDecoration<ApiType>;
} }
@@ -211,8 +217,12 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
const storage = blockHash const storage = blockHash
? this._decorateStorageAt(registry.decoratedMeta, this._decorateMethod, blockHash) ? this._decorateStorageAt(registry.decoratedMeta, this._decorateMethod, blockHash)
: this._decorateStorage(registry.decoratedMeta, this._decorateMethod); : this._decorateStorage(registry.decoratedMeta, this._decorateMethod);
const storageRx = blockHash
? this._decorateStorageAt(registry.decoratedMeta, this._rxDecorateMethod, blockHash)
: this._decorateStorage(registry.decoratedMeta, this._rxDecorateMethod);
augmentObject('query', storage, decoratedApi.query, fromEmpty); augmentObject('query', storage, decoratedApi.query, fromEmpty);
augmentObject('query', storageRx, decoratedApi.rx.query, fromEmpty);
return { return {
decoratedApi, decoratedApi,
@@ -227,7 +237,11 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
consts: {}, consts: {},
errors: {}, errors: {},
events: {}, events: {},
query: {} query: {},
registry: registry.registry,
rx: {
query: {}
}
} as ApiDecoration<ApiType>; } as ApiDecoration<ApiType>;
} }
@@ -237,6 +251,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
this._errors = decoratedApi.errors; this._errors = decoratedApi.errors;
this._events = decoratedApi.events; this._events = decoratedApi.events;
this._query = decoratedApi.query; this._query = decoratedApi.query;
this._rx.query = decoratedApi.rx.query;
if (fromEmpty || !this._extrinsics) { if (fromEmpty || !this._extrinsics) {
this._extrinsics = this._decorateExtrinsics(decoratedMeta, this._decorateMethod); this._extrinsics = this._decorateExtrinsics(decoratedMeta, this._decorateMethod);
@@ -246,8 +261,6 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
augmentObject(null, this._decorateExtrinsics(decoratedMeta, this._rxDecorateMethod), this._rx.tx, false); augmentObject(null, this._decorateExtrinsics(decoratedMeta, this._rxDecorateMethod), this._rx.tx, false);
} }
// rx
augmentObject(null, this._decorateStorage(decoratedMeta, this._rxDecorateMethod), this._rx.query, fromEmpty);
augmentObject(null, decoratedMeta.consts, this._rx.consts, fromEmpty); augmentObject(null, decoratedMeta.consts, this._rx.consts, fromEmpty);
} }
@@ -358,10 +371,14 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
(this.hasSubscriptions (this.hasSubscriptions
? this._rpcCore.state.subscribeStorage ? this._rpcCore.state.subscribeStorage
: this._rpcCore.state.queryStorageAt)( : this._rpcCore.state.queryStorageAt)(
calls.map((arg: QueryableStorageMultiArg<ApiType>) => calls.map((args: QueryableStorageMultiArg<ApiType>) =>
Array.isArray(arg) Array.isArray(args)
? [arg[0].creator, ...arg.slice(1)] ? args[0].creator.meta.type.isPlain
: [arg.creator]))); ? [args[0].creator]
: args[0].creator.meta.type.asMap.hashers.length === 1
? [args[0].creator, args.slice(1)]
: [args[0].creator, ...args.slice(1)]
: [args.creator])));
} }
protected _decorateExtrinsics<ApiType extends ApiTypes> ({ tx }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>): SubmittableExtrinsics<ApiType> { protected _decorateExtrinsics<ApiType extends ApiTypes> ({ tx }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>): SubmittableExtrinsics<ApiType> {
@@ -402,10 +419,10 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
}, {} as QueryableStorage<ApiType>); }, {} as QueryableStorage<ApiType>);
} }
protected _decorateStorageAt<ApiType extends ApiTypes> ({ query }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>, blockHash: Uint8Array): QueryableStorageAt<ApiType> { protected _decorateStorageAt<ApiType extends ApiTypes> ({ query, registry }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>, blockHash: Uint8Array): QueryableStorageAt<ApiType> {
return Object.entries(query).reduce((out, [name, section]): QueryableStorageAt<ApiType> => { return Object.entries(query).reduce((out, [name, section]): QueryableStorageAt<ApiType> => {
out[name] = Object.entries(section).reduce((out, [name, method]): QueryableModuleStorageAt<ApiType> => { out[name] = Object.entries(section).reduce((out, [name, method]): QueryableModuleStorageAt<ApiType> => {
out[name] = this._decorateStorageEntryAt(method, decorateMethod, blockHash); out[name] = this._decorateStorageEntryAt(registry, method, decorateMethod, blockHash);
return out; return out;
}, {} as QueryableModuleStorageAt<ApiType>); }, {} as QueryableModuleStorageAt<ApiType>);
@@ -416,7 +433,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
private _decorateStorageEntry<ApiType extends ApiTypes> (creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>): QueryableStorageEntry<ApiType> { private _decorateStorageEntry<ApiType extends ApiTypes> (creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>): QueryableStorageEntry<ApiType> {
// get the storage arguments, with DoubleMap as an array entry, otherwise spread // get the storage arguments, with DoubleMap as an array entry, otherwise spread
const getArgs = (args: unknown[]): unknown[] => extractStorageArgs(this.#registry, creator, args); const getArgs = (args: unknown[]) => extractStorageArgs(this.#registry, creator, args);
// Disable this where it occurs for each field we are decorating // Disable this where it occurs for each field we are decorating
/* eslint-disable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */
@@ -426,7 +443,13 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
decorated.creator = creator; decorated.creator = creator;
decorated.at = decorateMethod((hash: Hash, ...args: unknown[]): Observable<Codec> => decorated.at = decorateMethod((hash: Hash, ...args: unknown[]): Observable<Codec> =>
this._rpcCore.state.getStorage(getArgs(args), hash)); from(this.at(hash)).pipe(
switchMap((api): Observable<Codec> => {
assert(api.rx.query[creator.section] && api.rx.query[creator.section][creator.method], () => `query.${creator.section}.${creator.method} is not available in this version of the metadata`);
return api.rx.query[creator.section][creator.method](...args);
})
));
decorated.hash = decorateMethod((...args: unknown[]): Observable<Hash> => decorated.hash = decorateMethod((...args: unknown[]): Observable<Hash> =>
this._rpcCore.state.getStorageHash(getArgs(args))); this._rpcCore.state.getStorageHash(getArgs(args)));
@@ -436,18 +459,10 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
key.method === creator.method; key.method === creator.method;
decorated.key = (...args: unknown[]): string => decorated.key = (...args: unknown[]): string =>
u8aToHex(compactStripLength(creator( u8aToHex(compactStripLength(creator(...args))[1]);
creator.meta.type.isPlain
? undefined
: creator.meta.type.isMap
? args[0]
: creator.meta.type.isDoubleMap
? [args[0], args[1]]
: args
))[1]);
decorated.keyPrefix = (...keys: unknown[]): string => decorated.keyPrefix = (...args: unknown[]): string =>
u8aToHex(creator.keyPrefix(...keys)); u8aToHex(creator.keyPrefix(...args));
decorated.range = decorateMethod((range: [Hash, Hash?], ...args: unknown[]): Observable<[Hash, Codec][]> => decorated.range = decorateMethod((range: [Hash, Hash?], ...args: unknown[]): Observable<[Hash, Codec][]> =>
this._decorateStorageRange(decorated, args, range)); this._decorateStorageRange(decorated, args, range));
@@ -458,9 +473,8 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
decorated.sizeAt = decorateMethod((hash: Hash | Uint8Array | string, ...args: unknown[]): Observable<u64> => decorated.sizeAt = decorateMethod((hash: Hash | Uint8Array | string, ...args: unknown[]): Observable<u64> =>
this._rpcCore.state.getStorageSize(getArgs(args), hash)); this._rpcCore.state.getStorageSize(getArgs(args), hash));
// FIXME NMap support
// .keys() & .entries() only available on map types // .keys() & .entries() only available on map types
if (creator.iterKey && (creator.meta.type.isMap || creator.meta.type.isDoubleMap || creator.meta.type.isNMap)) { if (creator.iterKey && creator.meta.type.isMap) {
decorated.entries = decorateMethod( decorated.entries = decorateMethod(
memo(this.#instanceId, (...args: unknown[]): Observable<[StorageKey, Codec][]> => memo(this.#instanceId, (...args: unknown[]): Observable<[StorageKey, Codec][]> =>
this._retrieveMapEntries(creator, null, args))); this._retrieveMapEntries(creator, null, args)));
@@ -486,10 +500,13 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
this._retrieveMapKeysPaged(creator, opts))); this._retrieveMapKeysPaged(creator, opts)));
} }
if (this.supportMulti) { if (this.supportMulti && creator.meta.type.isMap) {
// When using double map storage function, user need to pass double map key as an array // When using double map storage function, user need to pass double map key as an array
decorated.multi = decorateMethod((args: (unknown | unknown[])[]): Observable<Codec[]> => decorated.multi = decorateMethod((args: unknown[]): Observable<Codec[]> =>
this._retrieveMulti(args.map((arg) => [creator, arg]))); creator.meta.type.asMap.hashers.length === 1
? this._retrieveMulti(args.map((a) => [creator, [a]]))
: this._retrieveMulti(args.map((a) => [creator, a as unknown[]]))
);
} }
/* eslint-enable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */ /* eslint-enable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */
@@ -497,9 +514,9 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
return this._decorateFunctionMeta(creator as any, decorated) as unknown as QueryableStorageEntry<ApiType>; return this._decorateFunctionMeta(creator as any, decorated) as unknown as QueryableStorageEntry<ApiType>;
} }
private _decorateStorageEntryAt<ApiType extends ApiTypes> (creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>, blockHash: Uint8Array): QueryableStorageEntryAt<ApiType> { private _decorateStorageEntryAt<ApiType extends ApiTypes> (registry: Registry, creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>, blockHash: Uint8Array): QueryableStorageEntryAt<ApiType> {
// get the storage arguments, with DoubleMap as an array entry, otherwise spread // get the storage arguments, with DoubleMap as an array entry, otherwise spread
const getArgs = (args: unknown[]): unknown[] => extractStorageArgs(this.#registry, creator, args); const getArgs = (args: unknown[]): unknown[] => extractStorageArgs(registry, creator, args);
// Disable this where it occurs for each field we are decorating // Disable this where it occurs for each field we are decorating
/* eslint-disable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */
@@ -520,11 +537,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
u8aToHex(compactStripLength(creator( u8aToHex(compactStripLength(creator(
creator.meta.type.isPlain creator.meta.type.isPlain
? undefined ? undefined
: creator.meta.type.isMap : args
? args[0]
: creator.meta.type.isDoubleMap
? [args[0], args[1]]
: args
))[1]); ))[1]);
decorated.keyPrefix = (...keys: unknown[]): string => decorated.keyPrefix = (...keys: unknown[]): string =>
@@ -535,7 +548,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
// FIXME NMap support // FIXME NMap support
// .keys() & .entries() only available on map types // .keys() & .entries() only available on map types
if (creator.iterKey && (creator.meta.type.isMap || creator.meta.type.isDoubleMap)) { if (creator.iterKey && creator.meta.type.isMap) {
decorated.entries = decorateMethod( decorated.entries = decorateMethod(
memo(this.#instanceId, (...args: unknown[]): Observable<[StorageKey, Codec][]> => memo(this.#instanceId, (...args: unknown[]): Observable<[StorageKey, Codec][]> =>
this._retrieveMapEntries(creator, blockHash, args))); this._retrieveMapEntries(creator, blockHash, args)));
@@ -579,7 +592,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
} }
// retrieve a set of values for a specific set of keys - here we chunk the keys into PAGE_SIZE sizes // retrieve a set of values for a specific set of keys - here we chunk the keys into PAGE_SIZE sizes
private _retrieveMulti (keys: [StorageEntry, unknown | unknown[]][]): Observable<Codec[]> { private _retrieveMulti (keys: [StorageEntry, unknown[]][]): Observable<Codec[]> {
if (!keys.length) { if (!keys.length) {
return of([]); return of([]);
} }
@@ -596,7 +609,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
} }
private _retrieveMapKeys ({ iterKey, meta, method, section }: StorageEntry, at: Hash | Uint8Array | string | null, args: unknown[]): Observable<StorageKey[]> { private _retrieveMapKeys ({ iterKey, meta, method, section }: StorageEntry, at: Hash | Uint8Array | string | null, args: unknown[]): Observable<StorageKey[]> {
assert(iterKey && (meta.type.isMap || meta.type.isDoubleMap || meta.type.isNMap), 'keys can only be retrieved on maps, linked maps and double maps'); assert(iterKey && meta.type.isMap, 'keys can only be retrieved on maps');
const headKey = iterKey(...args).toHex(); const headKey = iterKey(...args).toHex();
const startSubject = new BehaviorSubject<string>(headKey); const startSubject = new BehaviorSubject<string>(headKey);
@@ -620,7 +633,7 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
} }
private _retrieveMapKeysPaged ({ iterKey, meta, method, section }: StorageEntry, opts: PaginationOptions): Observable<StorageKey[]> { private _retrieveMapKeysPaged ({ iterKey, meta, method, section }: StorageEntry, opts: PaginationOptions): Observable<StorageKey[]> {
assert(iterKey && (meta.type.isMap || meta.type.isDoubleMap || meta.type.isNMap), 'keys can only be retrieved on maps, linked maps and double maps'); assert(iterKey && meta.type.isMap, 'keys can only be retrieved on maps');
const headKey = iterKey(...opts.args).toHex(); const headKey = iterKey(...opts.args).toHex();
+2 -2
View File
@@ -182,8 +182,8 @@ export abstract class Getters<ApiType extends ApiTypes> extends Init<ApiType> im
/** /**
* @description The underlying Rx API interface * @description The underlying Rx API interface
*/ */
public get rx (): Pick<ApiInterfaceRx, 'tx' | 'rpc'> { public get rx (): Pick<ApiInterfaceRx, 'tx' | 'rpc' | 'query'> {
return assertResult(this._rx as Pick<ApiInterfaceRx, 'tx' | 'rpc'>); return assertResult(this._rx as Pick<ApiInterfaceRx, 'tx' | 'rpc' | 'query'>);
} }
/** /**
+3 -2
View File
@@ -21,7 +21,8 @@ function consts (api: ApiPromise): void {
console.log( console.log(
api.consts.foo.bar, api.consts.foo.bar,
api.consts.balances.existentialDeposit.toNumber(), api.consts.balances.existentialDeposit.toNumber(),
api.consts.balances.existentialDeposit.meta.docs.map((s): string => s.toString()).join('') api.consts.balances.existentialDeposit.meta.docs.map((s) => s.toString()).join(''),
api.consts.system.blockWeights.maxBlock.divn(123).toNumber()
); );
} }
@@ -81,7 +82,7 @@ async function query (api: ApiPromise, pairs: TestKeyringMap): Promise<void> {
const oldBal = await api.query.balances.totalIssuance.at('abcd'); const oldBal = await api.query.balances.totalIssuance.at('abcd');
// It's hard to correctly type .multi. Expected: `Balance[]`, actual: Codec[]. // It's hard to correctly type .multi. Expected: `Balance[]`, actual: Codec[].
// In the meantime, we can case with `<Balance>` (this is not available on recent chains) // In the meantime, we can case with `<Balance>` (this is not available on recent chains)
const multi = await api.query.balances.freeBalance.multi<Balance>([pairs.alice.address, pairs.bob.address]); const multi = await api.query.balances.freeBalance.multi([pairs.alice.address, pairs.bob.address]);
console.log('query types:', bar, bal, bal2, override, oldBal, multi); console.log('query types:', bar, bal, bal2, override, oldBal, multi);
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/api', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/api', version: '6.2.1' };
+8 -14
View File
@@ -39,7 +39,7 @@ describe('ApiPromise', (): void => {
}; };
const signer = new SingleAccountSigner(registry, aliceEd); const signer = new SingleAccountSigner(registry, aliceEd);
const api = await ApiPromise.create({ provider, registry, signer }); const api = await ApiPromise.create({ provider, registry, signer, throwOnConnect: true });
const transfer = api.tx.balances.transfer(keyring.getPair('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e').address, 321564789876512345n); const transfer = api.tx.balances.transfer(keyring.getPair('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e').address, 321564789876512345n);
return { api, transfer: await transfer.signAsync(aliceEd.address, {}) }; return { api, transfer: await transfer.signAsync(aliceEd.address, {}) };
@@ -59,7 +59,7 @@ describe('ApiPromise', (): void => {
const rpcData = await provider.send<string>('state_getMetadata', []); const rpcData = await provider.send<string>('state_getMetadata', []);
const genesisHash = registry.createType('Hash', await provider.send('chain_getBlockHash', [])).toHex(); const genesisHash = registry.createType('Hash', await provider.send('chain_getBlockHash', [])).toHex();
const specVersion = 0; const specVersion = 0;
const api = await ApiPromise.create({ metadata: { [`${genesisHash}-${specVersion}`]: rpcData }, provider, registry }); const api = await ApiPromise.create({ metadata: { [`${genesisHash}-${specVersion}`]: rpcData }, provider, registry, throwOnConnect: true });
expect(api.genesisHash).toBeDefined(); expect(api.genesisHash).toBeDefined();
expect(api.runtimeMetadata).toBeDefined(); expect(api.runtimeMetadata).toBeDefined();
@@ -74,7 +74,7 @@ describe('ApiPromise', (): void => {
it('Create API instance without metadata and makes the runtime, rpc, state & extrinsics available', async (): Promise<void> => { it('Create API instance without metadata and makes the runtime, rpc, state & extrinsics available', async (): Promise<void> => {
const metadata = {}; const metadata = {};
const api = await ApiPromise.create({ metadata, provider, registry }); const api = await ApiPromise.create({ metadata, provider, registry, throwOnConnect: true });
expect(api.genesisHash).toBeDefined(); expect(api.genesisHash).toBeDefined();
expect(api.runtimeMetadata).toBeDefined(); expect(api.runtimeMetadata).toBeDefined();
@@ -98,17 +98,15 @@ describe('ApiPromise', (): void => {
} }
} }
const api = new ErrorApiPromise();
try { try {
await api.isReadyOrError; const api = await ErrorApiPromise.create({ provider, throwOnConnect: true });
await api.disconnect();
fail('Expected an error but none occurred.'); fail('Expected an error but none occurred.');
} catch { } catch {
// Pass // Pass
} }
await api.disconnect();
}); });
}); });
@@ -118,7 +116,7 @@ describe('ApiPromise', (): void => {
const SIG = '0x659effefbbe5ab4d7136ebb5084b959eb424e32b862307371be4721ac2c46334245af4f1476c36c5e5aff04396c2fdd2ce561ec90382821d4aa071b559b1db0f'; const SIG = '0x659effefbbe5ab4d7136ebb5084b959eb424e32b862307371be4721ac2c46334245af4f1476c36c5e5aff04396c2fdd2ce561ec90382821d4aa071b559b1db0f';
it('signs data using a specified keyring', async (): Promise<void> => { it('signs data using a specified keyring', async (): Promise<void> => {
const api = await ApiPromise.create({ provider, registry }); const api = await ApiPromise.create({ provider, registry, throwOnConnect: true });
const sig = await api.sign(aliceEd, TEST); const sig = await api.sign(aliceEd, TEST);
expect(sig).toEqual(SIG); expect(sig).toEqual(SIG);
@@ -127,11 +125,7 @@ describe('ApiPromise', (): void => {
}); });
it('signs data using an external signer', async (): Promise<void> => { it('signs data using an external signer', async (): Promise<void> => {
const api = await ApiPromise.create({ const api = await ApiPromise.create({ provider, registry, signer: new SingleAccountSigner(registry, aliceEd), throwOnConnect: true });
provider,
registry,
signer: new SingleAccountSigner(registry, aliceEd)
});
const sig = await api.sign(ADDR, TEST); const sig = await api.sign(ADDR, TEST);
expect(sig).toEqual(SIG); expect(sig).toEqual(SIG);
+1
View File
@@ -45,6 +45,7 @@ export interface SignerOptions {
nonce: AnyNumber | Codec; nonce: AnyNumber | Codec;
signer?: Signer; signer?: Signer;
tip?: AnyNumber; tip?: AnyNumber;
assetId?: AnyNumber;
} }
export type AddressOrPair = IKeyringPair | string | AccountId | Address; export type AddressOrPair = IKeyringPair | string | AccountId | Address;
+2 -2
View File
@@ -1,7 +1,7 @@
// Copyright 2017-2021 @polkadot/api authors & contributors // Copyright 2017-2021 @polkadot/api authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { ModuleConstantMetadataLatest } from '@polkadot/types/interfaces'; import type { PalletConstantMetadataLatest } from '@polkadot/types/interfaces';
import type { Codec } from '@polkadot/types/types'; import type { Codec } from '@polkadot/types/types';
import type { ApiTypes } from './base'; import type { ApiTypes } from './base';
@@ -10,7 +10,7 @@ export interface AugmentedConsts<ApiType extends ApiTypes> { }
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
export interface AugmentedConst<ApiType extends ApiTypes> { export interface AugmentedConst<ApiType extends ApiTypes> {
meta: ModuleConstantMetadataLatest; meta: PalletConstantMetadataLatest;
} }
export interface QueryableModuleConsts { export interface QueryableModuleConsts {
+4
View File
@@ -112,4 +112,8 @@ export interface ApiDecoration<ApiType extends ApiTypes> {
errors: DecoratedErrors<ApiType>; errors: DecoratedErrors<ApiType>;
events: DecoratedEvents<ApiType>; events: DecoratedEvents<ApiType>;
query: QueryableStorage<ApiType>; query: QueryableStorage<ApiType>;
registry: Registry;
rx: {
query: QueryableStorage<'rxjs'>;
}
} }
+20 -19
View File
@@ -8,13 +8,19 @@ import type { StorageEntry } from '@polkadot/types/primitive/types';
import type { AnyFunction, AnyTuple, Callback, Codec, IStorageKey } from '@polkadot/types/types'; import type { AnyFunction, AnyTuple, Callback, Codec, IStorageKey } from '@polkadot/types/types';
import type { ApiTypes, DropLast, MethodResult, ObsInnerType, PaginationOptions, PromiseOrObs, UnsubscribePromise } from './base'; import type { ApiTypes, DropLast, MethodResult, ObsInnerType, PaginationOptions, PromiseOrObs, UnsubscribePromise } from './base';
interface StorageEntryObservableMulti { type AsCodec<R extends Codec | any> = R extends Codec
<T extends Codec>(args: (unknown[] | unknown)[]): Observable<T[]>; ? R
: Codec;
type ReturnCodec<F extends AnyFunction> = AsCodec<ObsInnerType<ReturnType<F>>>;
interface StorageEntryObservableMulti<R extends Codec = Codec> {
<T extends Codec = R>(args: (unknown[] | unknown)[]): Observable<T[]>;
} }
interface StorageEntryPromiseMulti { interface StorageEntryPromiseMulti<R extends Codec = Codec> {
<T extends Codec>(args: (unknown[] | unknown)[]): Promise<T[]>; <T extends Codec = R>(args: (unknown[] | unknown)[]): Promise<T[]>;
<T extends Codec>(args: (unknown[] | unknown)[], callback: Callback<T[]>): UnsubscribePromise; <T extends Codec = R>(args: (unknown[] | unknown)[], callback: Callback<T[]>): UnsubscribePromise;
} }
export interface StorageEntryPromiseOverloads { export interface StorageEntryPromiseOverloads {
@@ -52,28 +58,23 @@ export interface QueryableStorageAt<ApiType extends ApiTypes> extends AugmentedQ
[key: string]: QueryableModuleStorageAt<ApiType>; [key: string]: QueryableModuleStorageAt<ApiType>;
} }
export interface StorageEntryBase<ApiType extends ApiTypes, F extends AnyFunction, A extends AnyTuple = AnyTuple> { export interface StorageEntryBase<ApiType extends ApiTypes, F extends AnyFunction, A extends AnyTuple = AnyTuple> extends StorageEntryBaseAt<ApiType, F, A> {
at: <T extends Codec | any = ObsInnerType<ReturnType<F>>>(hash: Hash | Uint8Array | string, ...args: Parameters<F>) => PromiseOrObs<ApiType, T>; at: <T extends Codec | any = ReturnCodec<F>>(hash: Hash | Uint8Array | string, ...args: Parameters<F>) => PromiseOrObs<ApiType, T>;
creator: StorageEntry; creator: StorageEntry;
entries: <T extends Codec | any = ObsInnerType<ReturnType<F>>, K extends AnyTuple = A>(...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>; entriesAt: <T extends Codec | any = ReturnCodec<F>, K extends AnyTuple = A>(hash: Hash | Uint8Array | string, ...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>;
entriesAt: <T extends Codec | any = ObsInnerType<ReturnType<F>>, K extends AnyTuple = A>(hash: Hash | Uint8Array | string, ...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>; entriesPaged: <T extends Codec | any = ReturnCodec<F>, K extends AnyTuple = A>(opts: PaginationOptions<Parameters<F>[0]>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>;
entriesPaged: <T extends Codec | any = ObsInnerType<ReturnType<F>>, K extends AnyTuple = A>(opts: PaginationOptions<Parameters<F>[0]>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>;
hash: (...args: Parameters<F>) => PromiseOrObs<ApiType, Hash>;
is: (key: IStorageKey<AnyTuple>) => key is IStorageKey<A>;
key: (...args: Parameters<F>) => string;
keyPrefix: (...args: DropLast<Parameters<F>>) => string;
keys: <K extends AnyTuple = A> (...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, StorageKey<K>[]>;
keysAt: <K extends AnyTuple = A> (hash: Hash | Uint8Array | string, ...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, StorageKey<K>[]>; keysAt: <K extends AnyTuple = A> (hash: Hash | Uint8Array | string, ...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, StorageKey<K>[]>;
keysPaged: <K extends AnyTuple = A> (opts: PaginationOptions<Parameters<F>[0]>) => PromiseOrObs<ApiType, StorageKey<K>[]>; keysPaged: <K extends AnyTuple = A> (opts: PaginationOptions<Parameters<F>[0]>) => PromiseOrObs<ApiType, StorageKey<K>[]>;
// @deprecated The underlying RPC this been marked unsafe and is generally not exposed // @deprecated The underlying RPC this been marked unsafe and is generally not exposed
range: <T extends Codec | any = ObsInnerType<ReturnType<F>>>([from, to]: [Hash | Uint8Array | string, Hash | Uint8Array | string | undefined] | [Hash | Uint8Array | string], ...args: Parameters<F>) => PromiseOrObs<ApiType, [Hash, T][]>; range: <T extends Codec | any = ReturnCodec<F>>([from, to]: [Hash | Uint8Array | string, Hash | Uint8Array | string | undefined] | [Hash | Uint8Array | string], ...args: Parameters<F>) => PromiseOrObs<ApiType, [Hash, T][]>;
size: (...args: Parameters<F>) => PromiseOrObs<ApiType, u64>;
sizeAt: (hash: Hash | Uint8Array | string, ...args: Parameters<F>) => PromiseOrObs<ApiType, u64>; sizeAt: (hash: Hash | Uint8Array | string, ...args: Parameters<F>) => PromiseOrObs<ApiType, u64>;
multi: ApiType extends 'rxjs' ? StorageEntryObservableMulti : StorageEntryPromiseMulti; multi: ApiType extends 'rxjs'
? StorageEntryObservableMulti<ReturnCodec<F>>
: StorageEntryPromiseMulti<ReturnCodec<F>>;
} }
export interface StorageEntryBaseAt<ApiType extends ApiTypes, F extends AnyFunction, A extends AnyTuple = AnyTuple> { export interface StorageEntryBaseAt<ApiType extends ApiTypes, F extends AnyFunction, A extends AnyTuple = AnyTuple> {
entries: <T extends Codec | any = ObsInnerType<ReturnType<F>>, K extends AnyTuple = A>(...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>; entries: <T extends Codec | any = ReturnCodec<F>, K extends AnyTuple = A>(...args: DropLast<Parameters<F>>) => PromiseOrObs<ApiType, [StorageKey<K>, T][]>;
hash: (...args: Parameters<F>) => PromiseOrObs<ApiType, Hash>; hash: (...args: Parameters<F>) => PromiseOrObs<ApiType, Hash>;
is: (key: IStorageKey<AnyTuple>) => key is IStorageKey<A>; is: (key: IStorageKey<AnyTuple>) => key is IStorageKey<A>;
key: (...args: Parameters<F>) => string; key: (...args: Parameters<F>) => string;
+15 -43
View File
@@ -1,8 +1,6 @@
// Copyright 2017-2019 @polkadot/api authors & contributors // Copyright 2017-2019 @polkadot/api authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { Storage } from '@polkadot/types/metadata/decorate/types';
import { decorateStorage, Metadata, TypeRegistry } from '@polkadot/types'; import { decorateStorage, Metadata, TypeRegistry } from '@polkadot/types';
import metaStatic from '@polkadot/types-support/metadata/static-substrate'; import metaStatic from '@polkadot/types-support/metadata/static-substrate';
@@ -10,50 +8,46 @@ import { extractStorageArgs } from './validate';
describe('extractStorageArgs', (): void => { describe('extractStorageArgs', (): void => {
const registry = new TypeRegistry(); const registry = new TypeRegistry();
let storage: Storage; const metadata = new Metadata(registry, metaStatic);
beforeEach((): void => { registry.setMetadata(metadata);
const metadata = new Metadata(registry, metaStatic);
storage = decorateStorage(registry, metadata.asLatest, metadata.version); const storage = decorateStorage(registry, metadata.asLatest, metadata.version);
});
it('validates no-arg plain', (): void => { it('validates no-arg plain', (): void => {
expect( expect(
extractStorageArgs(registry, storage.timestamp.now, []) extractStorageArgs(registry, storage.timestamp.now, [])
).toEqual([storage.timestamp.now]); ).toEqual([storage.timestamp.now, []]);
}); });
it('validates no-arg plain (with undefined, undefined)', (): void => { it('validates no-arg plain (with undefined, undefined)', (): void => {
expect( expect(
extractStorageArgs(registry, storage.timestamp.now, [undefined, undefined]) extractStorageArgs(registry, storage.timestamp.now, [undefined, undefined])
).toEqual([storage.timestamp.now]); ).toEqual([storage.timestamp.now, []]);
}); });
it('validates no-arg plain (failing when there are args)', (): void => { it('validates no-arg plain (failing when there are args)', (): void => {
expect( expect(
(): unknown => extractStorageArgs(registry, storage.timestamp.now, [123, 456]) () => extractStorageArgs(registry, storage.timestamp.now, [123, 456])
).toThrow('timestamp.now() does not take any arguments, 2 found'); ).toThrow('timestamp.now() does not take any arguments, 2 found');
}); });
it('validates map, 1 arg', (): void => { it('validates map, 1 arg', (): void => {
expect( expect(
extractStorageArgs(registry, storage.staking.payee, ['abc']) extractStorageArgs(registry, storage.staking.payee, ['abc'])
).toEqual([storage.staking.payee, 'abc']); ).toEqual([storage.staking.payee, ['abc']]);
}); });
it('validates map, 1 arg (failing with no args)', (): void => { it('validates map, 1 arg (failing with no args)', (): void => {
expect( expect(
(): any => () => extractStorageArgs(registry, storage.staking.payee, [])
extractStorageArgs(registry, storage.staking.payee, []) ).toThrow('staking.payee(AccountId32) is a map, requiring 1 arguments, 0 found');
).toThrow('staking.payee(AccountId) is a map, requiring 1 argument, 0 found');
}); });
it('validates map, 1 arg (failing with no args)', (): void => { it('validates map, 1 arg (failing with no args)', (): void => {
expect( expect(
(): any => () => extractStorageArgs(registry, storage.staking.payee, ['abc', 'def'])
extractStorageArgs(registry, storage.staking.payee, ['abc', 'def']) ).toThrow('staking.payee(AccountId32) is a map, requiring 1 arguments, 2 found');
).toThrow('staking.payee(AccountId) is a map, requiring 1 argument, 2 found');
}); });
it('validates doublemap, 2 args', (): void => { it('validates doublemap, 2 args', (): void => {
@@ -64,35 +58,13 @@ describe('extractStorageArgs', (): void => {
it('validates doublemap, 2 args (failing with no args)', (): void => { it('validates doublemap, 2 args (failing with no args)', (): void => {
expect( expect(
(): any => () => extractStorageArgs(registry, storage.staking.erasStakers, [])
extractStorageArgs(registry, storage.staking.erasStakers, []) ).toThrow('staking.erasStakers(u32, AccountId32) is a map, requiring 2 arguments, 0 found');
).toThrow('staking.erasStakers(EraIndex, AccountId) is a double map, requiring 2 arguments, 0 found');
}); });
it('validates doublemap, 2 args (failing with 1 arg)', (): void => { it('validates doublemap, 2 args (failing with 1 arg)', (): void => {
expect( expect(
(): any => () => extractStorageArgs(registry, storage.staking.erasStakers, [123])
extractStorageArgs(registry, storage.staking.erasStakers, [123]) ).toThrow('staking.erasStakers(u32, AccountId32) is a map, requiring 2 arguments, 1 found');
).toThrow('staking.erasStakers(EraIndex, AccountId) is a double map, requiring 2 arguments, 1 found');
});
// Linked maps have been removed
it.skip('validates linked map, no args', (): void => {
expect(
extractStorageArgs(registry, storage.staking.validators, [])
).toEqual([storage.staking.validators]);
});
it.skip('validates linked map, single arg', (): void => {
expect(
extractStorageArgs(registry, storage.staking.validators, [123])
).toEqual([storage.staking.validators, 123]);
});
it.skip('validates linked map (failing with extra args)', (): void => {
expect(
(): any[] =>
extractStorageArgs(registry, storage.staking.validators, [123, 456])
).toThrow('staking.validators(AccountId) is a linked map, requiring either 0 arguments (retrieving all) or 1 argument, 2 found');
}); });
}); });
+15 -43
View File
@@ -1,60 +1,32 @@
// Copyright 2017-2019 @polkadot/api authors & contributors // Copyright 2017-2019 @polkadot/api authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { Type } from '@polkadot/types'; import type { SiLookupTypeId } from '@polkadot/types/interfaces';
import type { StorageEntry } from '@polkadot/types/primitive/types'; import type { StorageEntry } from '@polkadot/types/primitive/types';
import type { Registry } from '@polkadot/types/types'; import type { Registry } from '@polkadot/types/types';
import { assert, isUndefined } from '@polkadot/util'; import { assert, isUndefined } from '@polkadot/util';
function sig (_: Registry, { method, section }: StorageEntry, args: Type[]): string { function sig ({ lookup }: Registry, { method, section }: StorageEntry, args: SiLookupTypeId[]): string {
return `${section}.${method}(${args.join(', ')})`; return `${section}.${method}(${args.map((a) => lookup.getTypeDef(a).type).join(', ')})`;
}
function doDoubleMap (registry: Registry, creator: StorageEntry, args: unknown[]): [StorageEntry, [any, any]] {
const { key1, key2 } = creator.meta.type.asDoubleMap;
assert(args.length === 2, () => `${sig(registry, creator, [key1, key2])} is a double map, requiring 2 arguments, ${args.length} found`);
// pass as tuple
return [creator, args as [any, any]];
}
function doMap (registry: Registry, creator: StorageEntry, args: unknown[]): [StorageEntry] | [StorageEntry, any] {
const { key } = creator.meta.type.asMap;
assert(args.length === 1, () => `${sig(registry, creator, [key])} is a map, requiring 1 argument, ${args.length} found`);
// expand
return args.length
? [creator, args[0]]
: [creator];
}
function doNMap (registry: Registry, creator: StorageEntry, args: unknown[]): [StorageEntry, any[]] {
const { keyVec } = creator.meta.type.asNMap;
assert(args.length === keyVec.length, () => `${sig(registry, creator, keyVec)} is a multi map, requiring ${keyVec.length} arguments, ${args.length} found`);
// pass as tuple
return [creator, args];
} }
// sets up the arguments in the form of [creator, args] ready to be used in a storage // sets up the arguments in the form of [creator, args] ready to be used in a storage
// call. Additionally, it verifies that the correct number of arguments have been passed // call. Additionally, it verifies that the correct number of arguments have been passed
export function extractStorageArgs (registry: Registry, creator: StorageEntry, _args: unknown[]): [StorageEntry, any[]] | [StorageEntry] | [StorageEntry, any] { export function extractStorageArgs (registry: Registry, creator: StorageEntry, _args: unknown[]): [StorageEntry, unknown[]] {
const args = _args.filter((arg) => !isUndefined(arg)); const args = _args.filter((arg) => !isUndefined(arg));
if (creator.meta.type.isDoubleMap) { if (creator.meta.type.isPlain) {
return doDoubleMap(registry, creator, args); assert(args.length === 0, () => `${sig(registry, creator, [])} does not take any arguments, ${args.length} found`);
} else if (creator.meta.type.isMap) { } else {
return doMap(registry, creator, args); const { hashers, key } = creator.meta.type.asMap;
} else if (creator.meta.type.isNMap) { const keys = hashers.length === 1
return doNMap(registry, creator, args); ? [key]
: registry.lookup.getSiType(key).def.asTuple.map((t) => t);
assert(args.length === keys.length, () => `${sig(registry, creator, keys)} is a map, requiring ${keys.length} arguments, ${args.length} found`);
} }
assert(args.length === 0, () => `${sig(registry, creator, [])} does not take any arguments, ${args.length} found`); // pass as tuple
return [creator, args];
// no args
return [creator];
} }
+5 -6
View File
@@ -22,6 +22,11 @@ describe('misc online tests', (): void => {
await api.disconnect(); await api.disconnect();
}); });
it('expose rpc and rx definition', (): void => {
console.error(api.rpc.payment.queryFeeDetails.meta);
console.error(api.rx.rpc.chain.getBlock.meta);
});
it.skip('retrieves balances correctly', async (): Promise<void> => { it.skip('retrieves balances correctly', async (): Promise<void> => {
console.error(JSON.stringify( console.error(JSON.stringify(
await api.query.system.account('FPzukZw2mphWsXDqdkNzLaxnanjZEWH9i2vqwobTdtde5me') await api.query.system.account('FPzukZw2mphWsXDqdkNzLaxnanjZEWH9i2vqwobTdtde5me')
@@ -64,10 +69,4 @@ describe('misc online tests', (): void => {
await api.query.society.defenderVotes('Dab4bfYTZRUDMWjYAUQuFbDreQ9mt7nULWu3Dw7jodbzVe9') await api.query.society.defenderVotes('Dab4bfYTZRUDMWjYAUQuFbDreQ9mt7nULWu3Dw7jodbzVe9')
)); ));
}); });
it('expose rpc and rx definition', (): void => {
console.error(api.rpc.payment.queryFeeDetails.meta);
console.error(api.rx.rpc.chain.getBlock.meta);
});
}); });
+1 -1
View File
@@ -150,7 +150,7 @@ const typesBundle = {
types: [ types: [
{ {
minmax: [0, undefined] as [number?, number?], minmax: [0, undefined],
types: { types: {
Balance: 'u64', Balance: 'u64',
BalanceOf: 'Balance', BalanceOf: 'Balance',
+5 -5
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/rpc-core", "name": "@polkadot/rpc-core",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "A JavaScript wrapper for the Polkadot JsonRPC interface", "description": "A JavaScript wrapper for the Polkadot JsonRPC interface",
"main": "index.js", "main": "index.js",
@@ -20,12 +20,12 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-core#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-core#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/rpc-provider": "5.9.1", "@polkadot/rpc-provider": "6.2.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/util": "^7.3.1", "@polkadot/util": "^7.4.1",
"rxjs": "^7.3.0" "rxjs": "^7.3.0"
}, },
"devDependencies": { "devDependencies": {
"@polkadot/keyring": "^7.3.1" "@polkadot/keyring": "^7.4.1"
} }
} }
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/rpc-core', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/rpc-core', version: '6.2.1' };
+9 -9
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/rpc-provider", "name": "@polkadot/rpc-provider",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Transport providers for the API", "description": "Transport providers for the API",
"main": "index.js", "main": "index.js",
@@ -20,17 +20,17 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-provider#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-provider#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/util": "^7.3.1", "@polkadot/util": "^7.4.1",
"@polkadot/util-crypto": "^7.3.1", "@polkadot/util-crypto": "^7.4.1",
"@polkadot/x-fetch": "^7.3.1", "@polkadot/x-fetch": "^7.4.1",
"@polkadot/x-global": "^7.3.1", "@polkadot/x-global": "^7.4.1",
"@polkadot/x-ws": "^7.3.1", "@polkadot/x-ws": "^7.4.1",
"eventemitter3": "^4.0.7" "eventemitter3": "^4.0.7"
}, },
"devDependencies": { "devDependencies": {
"@polkadot/keyring": "^7.3.1", "@polkadot/keyring": "^7.4.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"mock-socket": "^9.0.3", "mock-socket": "^9.0.3",
"nock": "^13.1.3" "nock": "^13.1.3"
} }
@@ -29,6 +29,14 @@ describe('Http', (): void => {
).not.toThrow(); ).not.toThrow();
}); });
it('allow clone', (): void => {
const clone = http.clone();
/* eslint-disable */
expect((clone as any)['#endpoint']).toEqual((http as any)['#endpoint']);
expect((clone as any)['#headers']).toEqual((http as any)['#headers']);
/* eslint-enable */
});
it('always returns isConnected true', (): void => { it('always returns isConnected true', (): void => {
expect(http.isConnected).toEqual(true); expect(http.isConnected).toEqual(true);
}); });
+1 -1
View File
@@ -62,7 +62,7 @@ export class HttpProvider implements ProviderInterface {
* @description Returns a clone of the object * @description Returns a clone of the object
*/ */
public clone (): HttpProvider { public clone (): HttpProvider {
throw new Error('Unimplemented'); return new HttpProvider(this.#endpoint, this.#headers);
} }
/** /**
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/rpc-provider', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/rpc-provider', version: '6.2.1' };
+8 -8
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/typegen", "name": "@polkadot/typegen",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Type generation scripts", "description": "Type generation scripts",
"main": "index.js", "main": "index.js",
@@ -29,17 +29,17 @@
"@babel/core": "^7.15.5", "@babel/core": "^7.15.5",
"@babel/register": "^7.15.3", "@babel/register": "^7.15.3",
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/api": "5.9.1", "@polkadot/api": "6.2.1",
"@polkadot/rpc-provider": "5.9.1", "@polkadot/rpc-provider": "6.2.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/types-support": "5.9.1", "@polkadot/types-support": "6.2.1",
"@polkadot/util": "^7.3.1", "@polkadot/util": "^7.4.1",
"handlebars": "^4.7.7", "handlebars": "^4.7.7",
"websocket": "^1.0.34", "websocket": "^1.0.34",
"yargs": "^17.1.1" "yargs": "^17.2.1"
}, },
"devDependencies": { "devDependencies": {
"@types/websocket": "^1.0.4", "@types/websocket": "^1.0.4",
"@types/yargs": "^17.0.2" "@types/yargs": "^17.0.3"
} }
} }
+1 -1
View File
@@ -12,7 +12,7 @@ import { ApiPromise, WsProvider } from '@polkadot/api';
/** @internal */ /** @internal */
async function run (ws: string): Promise<void> { async function run (ws: string): Promise<void> {
const provider = new WsProvider(ws); const provider = new WsProvider(ws);
const api = await ApiPromise.create({ provider }); const api = await ApiPromise.create({ provider, throwOnConnect: true });
const [chain, props] = await Promise.all([ const [chain, props] = await Promise.all([
api.rpc.system.chain(), api.rpc.system.chain(),
api.rpc.system.properties() api.rpc.system.properties()
+13 -6
View File
@@ -6,6 +6,7 @@ import type { ExtraTypes } from './types';
import Handlebars from 'handlebars'; import Handlebars from 'handlebars';
import lookupDefinitions from '@polkadot/types/augment/lookup/definitions';
import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import * as defaultDefs from '@polkadot/types/interfaces/definitions';
import { stringCamelCase } from '@polkadot/util'; import { stringCamelCase } from '@polkadot/util';
@@ -17,14 +18,19 @@ const generateForMetaTemplate = Handlebars.compile(template);
/** @internal */ /** @internal */
function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void { function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void {
writeFile(dest, (): string => { writeFile(dest, (): string => {
const allTypes = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const allTypes = {
'@polkadot/types/augment': { lookup: lookupDefinitions },
'@polkadot/types/interfaces': defaultDefs,
...extraTypes
};
const imports = createImports(allTypes); const imports = createImports(allTypes);
const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => { const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => {
return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs); return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs);
}, {}); }, {});
const { lookup, pallets, registry } = meta.asLatest;
const modules = meta.asLatest.modules const modules = pallets
.filter((mod) => mod.constants.length > 0) .filter(({ constants }) => constants.length > 0)
.map(({ constants, name }) => { .map(({ constants, name }) => {
if (!isStrict) { if (!isStrict) {
setImports(allDefs, imports, ['Codec']); setImports(allDefs, imports, ['Codec']);
@@ -32,7 +38,8 @@ function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes,
const items = constants const items = constants
.map(({ docs, name, type }) => { .map(({ docs, name, type }) => {
const returnType = formatType(meta.registry, allDefs, type.toString(), imports); const typeDef = lookup.getTypeDef(type);
const returnType = typeDef.lookupName || formatType(registry, allDefs, typeDef, imports);
setImports(allDefs, imports, [returnType]); setImports(allDefs, imports, [returnType]);
@@ -57,8 +64,8 @@ function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes,
isStrict, isStrict,
modules, modules,
types: [ types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({ ...Object.keys(imports.localTypes).sort().map<{ file: string; types: string[] }>((packagePath) => ({
file: packagePath, file: packagePath.replace('@polkadot/types/augment', '@polkadot/types'),
types: Object.keys(imports.localTypes[packagePath]) types: Object.keys(imports.localTypes[packagePath])
})), })),
{ {
+4 -4
View File
@@ -17,11 +17,11 @@ const generateForMetaTemplate = Handlebars.compile(template);
function generateForMeta (meta: Metadata, dest: string, isStrict: boolean): void { function generateForMeta (meta: Metadata, dest: string, isStrict: boolean): void {
writeFile(dest, (): string => { writeFile(dest, (): string => {
const imports = createImports({}); const imports = createImports({});
const { lookup, pallets } = meta.asLatest;
const modules = meta.asLatest.modules const modules = pallets
.filter((mod) => mod.errors.length > 0) .filter(({ errors }) => errors.isSome)
.map(({ errors, name }) => ({ .map(({ errors, name }) => ({
items: errors items: lookup.getSiType(errors.unwrap().type).def.asVariant.variants
.map(({ docs, name }) => ({ .map(({ docs, name }) => ({
docs, docs,
name: name.toString() name: name.toString()
+19 -13
View File
@@ -6,6 +6,7 @@ import type { ExtraTypes } from './types';
import Handlebars from 'handlebars'; import Handlebars from 'handlebars';
import lookupDefinitions from '@polkadot/types/augment/lookup/definitions';
import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import * as defaultDefs from '@polkadot/types/interfaces/definitions';
import { stringCamelCase } from '@polkadot/util'; import { stringCamelCase } from '@polkadot/util';
@@ -17,29 +18,34 @@ const generateForMetaTemplate = Handlebars.compile(template);
/** @internal */ /** @internal */
function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void { function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void {
writeFile(dest, (): string => { writeFile(dest, (): string => {
const allTypes = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const allTypes = {
'@polkadot/types/augment': { lookup: lookupDefinitions },
'@polkadot/types/interfaces': defaultDefs,
...extraTypes
};
const imports = createImports(allTypes); const imports = createImports(allTypes);
const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => { const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => {
return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs); return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs);
}, {}); }, {});
const { lookup, pallets, registry } = meta.asLatest;
const modules = meta.asLatest.modules const modules = pallets
.filter((mod) => mod.events.isSome) .filter(({ events }) => events.isSome)
.map(({ events, name }) => ({ .map(({ events, name }) => ({
items: events items: lookup.getSiType(events.unwrap().type).def.asVariant.variants
.unwrap() .map(({ docs, fields, name }) => {
.sort(compareName) const args = fields
.map(({ args, docs, name }) => { .map(({ type }) => lookup.getTypeDef(type))
const types = args.map((type) => formatType(meta.registry, allDefs, type.toString(), imports)); .map((typeDef) => typeDef.lookupName || formatType(registry, allDefs, typeDef, imports));
setImports(allDefs, imports, types); setImports(allDefs, imports, args);
return { return {
docs, docs,
name: name.toString(), name: name.toString(),
type: types.join(', ') type: args.join(', ')
}; };
}).sort(compareName), })
.sort(compareName),
name: stringCamelCase(name) name: stringCamelCase(name)
})) }))
.sort(compareName); .sort(compareName);
@@ -51,7 +57,7 @@ function generateForMeta (meta: Metadata, dest: string, extraTypes: ExtraTypes,
modules, modules,
types: [ types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({ ...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath, file: packagePath.replace('@polkadot/types/augment', '@polkadot/types'),
types: Object.keys(imports.localTypes[packagePath]) types: Object.keys(imports.localTypes[packagePath])
})), })),
{ {
+1
View File
@@ -5,6 +5,7 @@ export { generateDefaultConsts } from './consts';
export { generateDefaultErrors } from './errors'; export { generateDefaultErrors } from './errors';
export { generateDefaultEvents } from './events'; export { generateDefaultEvents } from './events';
export { generateDefaultInterface } from './interfaceRegistry'; export { generateDefaultInterface } from './interfaceRegistry';
export { generateDefaultLookup } from './lookup';
export { generateDefaultQuery } from './query'; export { generateDefaultQuery } from './query';
export { generateDefaultRpc } from './rpc'; export { generateDefaultRpc } from './rpc';
export { generateDefaultTsDef } from './tsDef'; export { generateDefaultTsDef } from './tsDef';
+270
View File
@@ -0,0 +1,270 @@
// Copyright 2017-2021 @polkadot/typegen authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { PortableRegistry, PortableType, SiLookupTypeId, SiPath, SiTypeParameter } from '@polkadot/types/interfaces';
import type { TypeDef } from '@polkadot/types/types';
import Handlebars from 'handlebars';
import path from 'path';
import * as defaultDefinitions from '@polkadot/types/interfaces/definitions';
import { Registry } from '@polkadot/types/types';
import staticKusama from '@polkadot/types-support/metadata/static-kusama';
import staticPolkadot from '@polkadot/types-support/metadata/static-polkadot';
import staticSubstrate from '@polkadot/types-support/metadata/static-substrate';
import { isString, stringify } from '@polkadot/util';
import { createImports, exportType, initMeta, readTemplate, writeFile } from '../util';
import { typeEncoders } from './tsDef';
const MAP_ENUMS = ['Call', 'Event', 'Error', 'RawEvent'];
const WITH_TYPEDEF = false;
const generateLookupDefsTmpl = Handlebars.compile(readTemplate('lookup/defs'));
const generateLookupDefsNamedTmpl = Handlebars.compile(readTemplate('lookup/defs-named'));
const generateLookupIndexTmpl = Handlebars.compile(readTemplate('lookup/index'));
const generateLookupTypesTmpl = Handlebars.compile(readTemplate('lookup/types'));
function generateParamType (registry: Registry, { name, type }: SiTypeParameter): string {
if (type.isSome) {
const link = registry.lookup.types[type.unwrap().toNumber()];
if (link.type.path.length) {
return generateTypeDocs(registry, null, link.type.path, link.type.params);
}
}
return name.toString();
}
function generateTypeDocs (registry: Registry, id: SiLookupTypeId | null, path: SiPath, params: SiTypeParameter[]): string {
return `${id ? `${registry.createLookupType(id)}${path.length ? ': ' : ''}` : ''}${path.map((p) => p.toString()).join('::')}${params.length ? `<${params.map((p) => generateParamType(registry, p)).join(', ')}>` : ''}`;
}
function formatObject (lines: string[]): string[] {
const max = lines.length - 1;
return [
'{',
...lines.map((l, index) =>
(l.endsWith(',') || l.endsWith('{') || index === max || lines[index + 1].endsWith('}') || lines[index + 1].endsWith('}'))
? l
: `${l},`
),
'}'
];
}
function expandSet (parsed: Record<string, number>): string[] {
return formatObject(
Object.entries(parsed).reduce<string[]>((all, [k, v]) => {
all.push(`${k}: ${v}`);
return all;
}, [])
);
}
function expandObject (parsed: Record<string, string | Record<string, string>>): string[] {
if (parsed._set) {
return expandSet(parsed._set as unknown as Record<string, number>);
}
return formatObject(
Object.entries(parsed).reduce<string[]>((all, [k, v]) => {
const inner = isString(v)
? expandType(v)
: Array.isArray(v)
? [`[${(v as string[]).map((e) => `'${e}'`).join(', ')}]`]
: expandObject(v);
inner.forEach((l, index): void => {
all.push(`${
index === 0
? `${k}: ${l}`
: `${l}`
}`);
});
return all;
}, [])
);
}
function expandType (encoded: string): string[] {
if (!encoded.startsWith('{')) {
return [`'${encoded}'`];
}
return expandObject(JSON.parse(encoded) as Record<string, string | Record<string, string>>);
}
function expandDefToString ({ lookupNameRoot, type }: TypeDef, indent: number): string {
if (lookupNameRoot) {
return `'${lookupNameRoot}'`;
}
const lines = expandType(type);
let inc = 0;
return lines.map((l, index) => {
let r: string;
if (l.endsWith('{')) {
r = index === 0
? l
: `${' '.padStart(indent + inc)}${l}`;
inc += 2;
} else {
if (l.endsWith('},') || l.endsWith('}')) {
inc -= 2;
}
r = index === 0
? l
: `${' '.padStart(indent + inc)}${l}`;
}
return r;
}).join('\n');
}
function getFilteredTypes (lookup: PortableRegistry, exclude: string[] = []): [PortableType, TypeDef][] {
const named = lookup.types.filter(({ id, type: { path } }) => {
const typeDef = lookup.getTypeDef(id);
return (
// We actually only want those with lookupName set
!!typeDef.lookupName &&
!(
path.length === 2 &&
(
(
// Ensure that we match {node, kusama, *}_runtime
path[0].toString().split('_')[1] === 'runtime' &&
!['Call', 'Event'].includes(path[1].toString())
) ||
path[0].toString().startsWith('pallet_')
) &&
// Ensure we strip generics, e.g. Event<T>
MAP_ENUMS.includes(path[1].toString().split('<')[0])
) &&
!(
path.length >= 3 &&
path[path.length - 2].toString() === 'pallet' &&
// As above, cater for generics
MAP_ENUMS.includes(path[path.length - 1].toString().split('<')[0])
)
);
});
const names = named.map(({ id }) => lookup.getName(id));
return named
.filter((_, index) =>
!names.some((n, iindex) =>
index > iindex &&
n === names[index]
)
)
.map((p): [PortableType, TypeDef] => [p, lookup.getTypeDef(p.id)])
.filter(([, typeDef]) => !exclude.includes(typeDef.lookupName || '<invalid>'));
}
function generateLookupDefs (registry: Registry, filtered: [PortableType, TypeDef][], destDir: string, subPath?: string): void {
writeFile(path.join(destDir, `${subPath || 'definitions'}.ts`), (): string => {
const all = filtered.map(([{ id, type: { params, path } }, typeDef]) => {
const typeLookup = registry.createLookupType(id);
const def = expandDefToString(typeDef, subPath ? 2 : 4);
return {
docs: [
generateTypeDocs(registry, id, path, params),
WITH_TYPEDEF
? `@typeDef ${stringify(typeDef)}`
: null
].filter((d): d is string => !!d),
type: { def, typeLookup, typeName: typeDef.lookupName }
};
});
const max = all.length - 1;
return (subPath ? generateLookupDefsNamedTmpl : generateLookupDefsTmpl)({
defs: all.map(({ docs, type }, i) => {
const { def, typeLookup, typeName } = type;
return {
defs: [
[typeName || typeLookup, `${def}${i !== max ? ',' : ''}`]
].map(([n, t]) => `${n}: ${t}`),
docs
};
}),
headerType: 'defs'
});
});
}
function generateLookupTypes (registry: Registry, filtered: [PortableType, TypeDef][], destDir: string, subPath?: string): void {
const imports = {
...createImports(
{ '@polkadot/types/interfaces': defaultDefinitions },
{ types: {} }
),
interfaces: []
};
const items = filtered.map(([, typeDef]) => {
typeDef.name = typeDef.lookupName;
return typeDef.lookupNameRoot && typeDef.lookupName
? exportType(typeDef.lookupIndex, typeDef.lookupName, typeDef.lookupNameRoot)
: typeEncoders[typeDef.info](registry, imports.definitions, typeDef, imports);
}).filter((t): t is string => !!t);
writeFile(path.join(destDir, `types${subPath ? `-${subPath}` : ''}.ts`), () => generateLookupTypesTmpl({
headerType: 'defs',
imports,
items: items.map((l) =>
l
.split('\n')
.map((l) => l.length ? ` ${l}` : '')
.join('\n')
),
types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath,
types: Object.keys(imports.localTypes[packagePath])
}))
]
}), true);
writeFile(path.join(destDir, 'index.ts'), () => generateLookupIndexTmpl({ headerType: 'defs' }), true);
}
function generateLookup (destDir: string, entries: [string | undefined, string][]): void {
entries.reduce<string[]>((exclude, [subPath, staticMeta]): string[] => {
const { lookup, registry } = initMeta(staticMeta).metadata.asLatest;
const filtered = getFilteredTypes(lookup, exclude);
generateLookupDefs(registry, filtered, destDir, subPath);
generateLookupTypes(registry, filtered, destDir, subPath);
return exclude.concat(
...filtered
.map(([, typeDef]) => typeDef.lookupName)
.filter((n): n is string => !!n)
);
}, []);
}
// Generate `packages/types/src/lookup/*s`, the registry of all lookup types
export function generateDefaultLookup (destDir = 'packages/types/src/augment/lookup', staticData?: string): void {
generateLookup(
destDir,
staticData
? [[undefined, staticData]]
: [
['substrate', staticSubstrate],
['polkadot', staticPolkadot],
['kusama', staticKusama]
]
);
}
+43 -62
View File
@@ -1,15 +1,16 @@
// Copyright 2017-2021 @polkadot/typegen authors & contributors // Copyright 2017-2021 @polkadot/typegen authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { StorageEntryMetadataLatest } from '@polkadot/types/interfaces/metadata'; import type { PortableRegistry, StorageEntryMetadataLatest } from '@polkadot/types/interfaces/metadata';
import type { Metadata } from '@polkadot/types/metadata/Metadata'; import type { Metadata } from '@polkadot/types/metadata/Metadata';
import type { Registry } from '@polkadot/types/types'; import type { Registry } from '@polkadot/types/types';
import type { ExtraTypes } from './types'; import type { ExtraTypes } from './types';
import Handlebars from 'handlebars'; import Handlebars from 'handlebars';
import lookupDefinitions from '@polkadot/types/augment/lookup/definitions';
import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import * as defaultDefs from '@polkadot/types/interfaces/definitions';
import { unwrapStorageType } from '@polkadot/types/primitive/StorageKey'; import { unwrapStorageSi } from '@polkadot/types/primitive/StorageKey';
import { stringCamelCase } from '@polkadot/util'; import { stringCamelCase } from '@polkadot/util';
import { compareName, createImports, formatType, getSimilarTypes, initMeta, readTemplate, setImports, TypeImports, writeFile } from '../util'; import { compareName, createImports, formatType, getSimilarTypes, initMeta, readTemplate, setImports, TypeImports, writeFile } from '../util';
@@ -17,69 +18,43 @@ import { ModuleTypes } from '../util/imports';
// From a storage entry metadata, we return [args, returnType] // From a storage entry metadata, we return [args, returnType]
/** @internal */ /** @internal */
function entrySignature (allDefs: Record<string, ModuleTypes>, registry: Registry, storageEntry: StorageEntryMetadataLatest, imports: TypeImports): [string, string, string] { function entrySignature (lookup: PortableRegistry, allDefs: Record<string, ModuleTypes>, registry: Registry, storageEntry: StorageEntryMetadataLatest, imports: TypeImports): [boolean, string, string, string] {
const outputType = unwrapStorageType(registry, storageEntry.type, storageEntry.modifier.isOptional); const outputType = lookup.getTypeDef(unwrapStorageSi(storageEntry.type));
if (storageEntry.type.isPlain) { if (storageEntry.type.isPlain) {
setImports(allDefs, imports, [storageEntry.type.asPlain.toString()]); const typeDef = lookup.getTypeDef(storageEntry.type.asPlain);
return ['', '', formatType(registry, allDefs, outputType, imports)]; setImports(allDefs, imports, [
typeDef.lookupName || typeDef.type,
storageEntry.modifier.isOptional
? 'Option'
: null
]);
return [storageEntry.modifier.isOptional, '', '', formatType(registry, allDefs, outputType, imports)];
} else if (storageEntry.type.isMap) { } else if (storageEntry.type.isMap) {
const map = storageEntry.type.asMap; const { hashers, key, value } = storageEntry.type.asMap;
const keyDefs = hashers.length === 1
// Find similar types of the `key` type ? [lookup.getTypeDef(key)]
const similarTypes = getSimilarTypes(registry, allDefs, map.key.toString(), imports); : lookup.getSiType(key).def.asTuple.map((k) => lookup.getTypeDef(k));
const similarTypes = keyDefs.map((k) => getSimilarTypes(registry, allDefs, k.lookupName || k.type, imports));
setImports(allDefs, imports, [ const keyTypes = similarTypes.map((t) => t.join(' | '));
...similarTypes, const defValue = lookup.getTypeDef(value);
map.value.toString()
]);
return [
formatType(registry, allDefs, map.key.toString(), imports),
`arg: ${similarTypes.join(' | ')}`,
formatType(registry, allDefs, outputType, imports)
];
} else if (storageEntry.type.isDoubleMap) {
const dm = storageEntry.type.asDoubleMap;
// Find similar types of `key1` and `key2` types
const similarTypes1 = getSimilarTypes(registry, allDefs, dm.key1.toString(), imports);
const similarTypes2 = getSimilarTypes(registry, allDefs, dm.key2.toString(), imports);
setImports(allDefs, imports, [
...similarTypes1,
...similarTypes2,
dm.value.toString()
]);
const key1Types = similarTypes1.join(' | ');
const key2Types = similarTypes2.join(' | ');
return [
[
formatType(registry, allDefs, dm.key1.toString(), imports),
formatType(registry, allDefs, dm.key2.toString(), imports)
].join(', '),
`arg1: ${key1Types}, arg2: ${key2Types}`,
formatType(registry, allDefs, outputType, imports)
];
} else if (storageEntry.type.isNMap) {
const nmap = storageEntry.type.asNMap;
// Find similar types for all keys
const similarTypes = nmap.keyVec.map((k) => getSimilarTypes(registry, allDefs, k.toString(), imports));
setImports(allDefs, imports, [ setImports(allDefs, imports, [
...similarTypes.reduce<string[]>((all, t) => all.concat(t), []), ...similarTypes.reduce<string[]>((all, t) => all.concat(t), []),
nmap.value.toString() storageEntry.modifier.isOptional
? 'Option'
: null,
defValue.lookupName
? undefined
: defValue.type
]); ]);
const keyTypes = similarTypes.map((t) => t.join(' | '));
return [ return [
nmap.keyVec.map((k) => formatType(registry, allDefs, k.toString(), imports)).join(', '), storageEntry.modifier.isOptional,
keyTypes.map((t, i) => `arg${i + 1}: ${t}`).join(', '), keyDefs.map((k) => formatType(registry, allDefs, k.lookupName || k.type, imports)).join(', '),
keyTypes.map((t, i) => `arg${keyTypes.length === 1 ? '' : (i + 1)}: ${t}`).join(', '),
formatType(registry, allDefs, outputType, imports) formatType(registry, allDefs, outputType, imports)
]; ];
} }
@@ -93,19 +68,25 @@ const generateForMetaTemplate = Handlebars.compile(template);
/** @internal */ /** @internal */
function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void { function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void {
writeFile(dest, (): string => { writeFile(dest, (): string => {
const allTypes: ExtraTypes = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const allTypes: ExtraTypes = {
'@polkadot/types/augment': { lookup: lookupDefinitions },
'@polkadot/types/interfaces': defaultDefs,
...extraTypes
};
const imports = createImports(allTypes); const imports = createImports(allTypes);
const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => { const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => {
return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs); return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs);
}, {}); }, {});
const { lookup, pallets } = meta.asLatest;
const modules = meta.asLatest.modules const modules = pallets
.sort(compareName) .filter(({ storage }) => storage.isSome)
.filter((mod) => !mod.storage.isNone)
.map(({ name, storage }) => { .map(({ name, storage }) => {
const items = storage.unwrap().items const items = storage.unwrap().items
.map((storageEntry) => { .map((storageEntry) => {
const [args, params, returnType] = entrySignature(allDefs, registry, storageEntry, imports); const [isOptional, args, params, _returnType] = entrySignature(lookup, allDefs, registry, storageEntry, imports);
const returnType = isOptional
? `Option<${_returnType}>`
: _returnType;
return { return {
args, args,
@@ -134,7 +115,7 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr
modules, modules,
types: [ types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({ ...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath, file: packagePath.replace('@polkadot/types/augment', '@polkadot/types'),
types: Object.keys(imports.localTypes[packagePath]) types: Object.keys(imports.localTypes[packagePath])
})), })),
{ {
+1 -1
View File
@@ -132,7 +132,7 @@ export function generateRpcTypes (registry: TypeRegistry, importDefinitions: Rec
modules, modules,
types: [ types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({ ...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath, file: packagePath.replace('@polkadot/types/augment', '@polkadot/types'),
types: Object.keys(imports.localTypes[packagePath]) types: Object.keys(imports.localTypes[packagePath])
})) }))
] ]
+76 -41
View File
@@ -35,7 +35,7 @@ function errorUnhandled (_: Registry, definitions: Record<string, ModuleTypes>,
/** @internal */ /** @internal */
function tsExport (registry: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports): string { function tsExport (registry: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports): string {
return exportInterface(def.name, formatType(registry, definitions, def, imports)); return exportInterface(def.lookupIndex, def.name, formatType(registry, definitions, def, imports, false));
} }
const tsBTreeMap = tsExport; const tsBTreeMap = tsExport;
@@ -46,18 +46,19 @@ const tsHashMap = tsExport;
const tsOption = tsExport; const tsOption = tsExport;
const tsPlain = tsExport; const tsPlain = tsExport;
const tsTuple = tsExport; const tsTuple = tsExport;
const tsWrapperOpaque = tsExport;
/** @internal */ /** @internal */
function tsEnum (registry: Registry, definitions: Record<string, ModuleTypes>, { name: enumName, sub }: TypeDef, imports: TypeImports): string { function tsEnum (registry: Registry, definitions: Record<string, ModuleTypes>, { lookupIndex, name: enumName, sub }: TypeDef, imports: TypeImports): string {
setImports(definitions, imports, ['Enum']); setImports(definitions, imports, ['Enum']);
const keys = (sub as TypeDef[]).map((def, index): string => { const keys = (sub as TypeDef[]).map((def, index): string => {
const { info, name = `unknown${index}`, type } = def; const { info, lookupName, name = `unknown${index}`, type } = def;
const getter = stringUpperFirst(stringCamelCase(name.replace(' ', '_'))); const getter = stringUpperFirst(stringCamelCase(name.replace(' ', '_')));
const isComplex = [TypeDefInfo.Result, TypeDefInfo.Struct, TypeDefInfo.Tuple, TypeDefInfo.Vec, TypeDefInfo.VecFixed].includes(info); const isComplex = [TypeDefInfo.Option, TypeDefInfo.Result, TypeDefInfo.Struct, TypeDefInfo.Tuple, TypeDefInfo.Vec, TypeDefInfo.VecFixed].includes(info);
const asGetter = type === 'Null' || info === TypeDefInfo.DoNotConstruct const asGetter = type === 'Null' || info === TypeDefInfo.DoNotConstruct
? '' ? ''
: createGetter(definitions, `as${getter}`, isComplex ? formatType(registry, definitions, info === TypeDefInfo.Struct ? def : type, imports) : type, imports); : createGetter(definitions, `as${getter}`, lookupName || (isComplex ? formatType(registry, definitions, info === TypeDefInfo.Struct ? def : type, imports, false) : type), imports);
const isGetter = info === TypeDefInfo.DoNotConstruct const isGetter = info === TypeDefInfo.DoNotConstruct
? '' ? ''
: createGetter(definitions, `is${getter}`, 'boolean', imports); : createGetter(definitions, `is${getter}`, 'boolean', imports);
@@ -66,47 +67,65 @@ function tsEnum (registry: Registry, definitions: Record<string, ModuleTypes>, {
case TypeDefInfo.Compact: case TypeDefInfo.Compact:
case TypeDefInfo.Plain: case TypeDefInfo.Plain:
case TypeDefInfo.Result: case TypeDefInfo.Result:
case TypeDefInfo.Si:
case TypeDefInfo.Struct: case TypeDefInfo.Struct:
case TypeDefInfo.Tuple: case TypeDefInfo.Tuple:
case TypeDefInfo.Vec: case TypeDefInfo.Vec:
case TypeDefInfo.Option: case TypeDefInfo.Option:
case TypeDefInfo.VecFixed: case TypeDefInfo.VecFixed:
case TypeDefInfo.WrapperOpaque:
return `${isGetter}${asGetter}`; return `${isGetter}${asGetter}`;
case TypeDefInfo.DoNotConstruct: case TypeDefInfo.DoNotConstruct:
return ''; case TypeDefInfo.Null:
return `${isGetter}`;
default: default:
throw new Error(`Enum: ${enumName || 'undefined'}: Unhandled nested "${TypeDefInfo[info]}" type`); throw new Error(`Enum: ${enumName || 'undefined'}: Unhandled type ${TypeDefInfo[info]}, ${stringify(def)}`);
} }
}); });
return exportInterface(enumName, 'Enum', keys.join('')); return exportInterface(lookupIndex, enumName, 'Enum', keys.join(''));
} }
function tsInt (_: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports, type: 'Int' | 'UInt' = 'Int'): string { function tsInt (_: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports, type: 'Int' | 'UInt' = 'Int'): string {
setImports(definitions, imports, [type]); setImports(definitions, imports, [type]);
return exportInterface(def.name, type); return exportInterface(def.lookupIndex, def.name, type);
}
/** @internal */
function tsNull (registry: Registry, definitions: Record<string, ModuleTypes>, { lookupIndex = -1, name }: TypeDef, imports: TypeImports): string {
setImports(definitions, imports, ['Null']);
// * @description extends [[${base}]]
const doc = `/** @name ${name || ''}${lookupIndex !== -1 ? ` (${lookupIndex})` : ''} */\n`;
return `${doc}export type ${name || ''} = Null;`;
} }
/** @internal */ /** @internal */
function tsResultGetter (registry: Registry, definitions: Record<string, ModuleTypes>, resultName = '', getter: 'Ok' | 'Err' | 'Error', def: TypeDef, imports: TypeImports): string { function tsResultGetter (registry: Registry, definitions: Record<string, ModuleTypes>, resultName = '', getter: 'Ok' | 'Err' | 'Error', def: TypeDef, imports: TypeImports): string {
const { info, type } = def; const { info, lookupName, type } = def;
const asGetter = type === 'Null' const asGetter = type === 'Null'
? '' ? ''
: (getter === 'Error' ? ' /** @deprecated Use asErr */\n' : '') + createGetter(definitions, `as${getter}`, info === TypeDefInfo.Tuple ? formatType(registry, definitions, def, imports) : type, imports); : (getter === 'Error' ? ' /** @deprecated Use asErr */\n' : '') + createGetter(definitions, `as${getter}`, lookupName || (info === TypeDefInfo.Tuple ? formatType(registry, definitions, def, imports, false) : type), imports);
const isGetter = (getter === 'Error' ? ' /** @deprecated Use isErr */\n' : '') + createGetter(definitions, `is${getter}`, 'boolean', imports); const isGetter = (getter === 'Error' ? ' /** @deprecated Use isErr */\n' : '') + createGetter(definitions, `is${getter}`, 'boolean', imports);
switch (info) { switch (info) {
case TypeDefInfo.Option:
case TypeDefInfo.Plain: case TypeDefInfo.Plain:
case TypeDefInfo.Si:
case TypeDefInfo.Tuple: case TypeDefInfo.Tuple:
case TypeDefInfo.Vec: case TypeDefInfo.Vec:
case TypeDefInfo.Option: case TypeDefInfo.WrapperOpaque:
return `${isGetter}${asGetter}`; return `${isGetter}${asGetter}`;
case TypeDefInfo.Null:
return `${isGetter}`;
default: default:
throw new Error(`Result: ${resultName}: Unhandled type ${TypeDefInfo[info]}`); throw new Error(`Result: ${resultName}: Unhandled type ${TypeDefInfo[info]}, ${stringify(def)}`);
} }
} }
@@ -122,17 +141,22 @@ function tsResult (registry: Registry, definitions: Record<string, ModuleTypes>,
setImports(definitions, imports, [def.type]); setImports(definitions, imports, [def.type]);
return exportInterface(def.name, formatType(registry, definitions, def, imports), inner); const fmtType = def.lookupName && def.name !== def.lookupName
? def.lookupName
: formatType(registry, definitions, def, imports, false);
return exportInterface(def.lookupIndex, def.name, fmtType, inner);
} }
/** @internal */ /** @internal */
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
function tsSi (registry: Registry, definitions: Record<string, ModuleTypes>, { type }: TypeDef, imports: TypeImports): string { function tsSi (registry: Registry, definitions: Record<string, ModuleTypes>, typeDef: TypeDef, imports: TypeImports): string {
throw new Error('Unable to generate string definition from TypeDefInfo.Si'); // FIXME
return `// SI: ${JSON.stringify(typeDef)}`;
} }
/** @internal */ /** @internal */
function tsSet (_: Registry, definitions: Record<string, ModuleTypes>, { name: setName, sub }: TypeDef, imports: TypeImports): string { function tsSet (_: Registry, definitions: Record<string, ModuleTypes>, { lookupIndex, name: setName, sub }: TypeDef, imports: TypeImports): string {
setImports(definitions, imports, ['Set']); setImports(definitions, imports, ['Set']);
const types = (sub as TypeDef[]).map(({ name }): string => { const types = (sub as TypeDef[]).map(({ name }): string => {
@@ -141,20 +165,22 @@ function tsSet (_: Registry, definitions: Record<string, ModuleTypes>, { name: s
return createGetter(definitions, `is${name}`, 'boolean', imports); return createGetter(definitions, `is${name}`, 'boolean', imports);
}); });
return exportInterface(setName, 'Set', types.join('')); return exportInterface(lookupIndex, setName, 'Set', types.join(''));
} }
/** @internal */ /** @internal */
function tsStruct (registry: Registry, definitions: Record<string, ModuleTypes>, { name: structName, sub }: TypeDef, imports: TypeImports): string { function tsStruct (registry: Registry, definitions: Record<string, ModuleTypes>, { lookupIndex, name: structName, sub }: TypeDef, imports: TypeImports): string {
setImports(definitions, imports, ['Struct']); setImports(definitions, imports, ['Struct']);
const keys = (sub as TypeDef[]).map((typedef): string => { const keys = (sub as TypeDef[]).map((def): string => {
const returnType = formatType(registry, definitions, typedef, imports); const fmtType = def.lookupName && def.name !== def.lookupName
? def.lookupName
: formatType(registry, definitions, def, imports, false);
return createGetter(definitions, typedef.name, returnType, imports); return createGetter(definitions, def.name, fmtType, imports);
}); });
return exportInterface(structName, 'Struct', keys.join('')); return exportInterface(lookupIndex, structName, 'Struct', keys.join(''));
} }
/** @internal */ /** @internal */
@@ -166,19 +192,29 @@ function tsUInt (registry: Registry, definitions: Record<string, ModuleTypes>, d
function tsVec (registry: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports): string { function tsVec (registry: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports): string {
const type = (def.sub as TypeDef).type; const type = (def.sub as TypeDef).type;
if (def.info === TypeDefInfo.VecFixed && type === 'u8') { if (type === 'u8') {
setImports(definitions, imports, ['U8aFixed']); if (def.info === TypeDefInfo.VecFixed) {
setImports(definitions, imports, ['U8aFixed']);
return exportType(def.name, 'U8aFixed'); return exportType(def.lookupIndex, def.name, 'U8aFixed');
} else {
setImports(definitions, imports, ['Bytes']);
return exportType(def.lookupIndex, def.name, 'Bytes');
}
} }
return exportInterface(def.name, formatType(registry, definitions, def, imports)); const fmtType = def.lookupName && def.name !== def.lookupName
? def.lookupName
: formatType(registry, definitions, def, imports, false);
return exportInterface(def.lookupIndex, def.name, fmtType);
} }
// handlers are defined externally to use - this means that when we do a // handlers are defined externally to use - this means that when we do a
// `generators[typedef.info](...)` TS will show any unhandled types. Rather // `generators[typedef.info](...)` TS will show any unhandled types. Rather
// we are being explicit in having no handlers where we do not support (yet) // we are being explicit in having no handlers where we do not support (yet)
const encoders: Record<TypeDefInfo, (registry: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports) => string> = { export const typeEncoders: Record<TypeDefInfo, (registry: Registry, definitions: Record<string, ModuleTypes>, def: TypeDef, imports: TypeImports) => string> = {
[TypeDefInfo.BTreeMap]: tsBTreeMap, [TypeDefInfo.BTreeMap]: tsBTreeMap,
[TypeDefInfo.BTreeSet]: tsBTreeSet, [TypeDefInfo.BTreeSet]: tsBTreeSet,
[TypeDefInfo.Compact]: tsCompact, [TypeDefInfo.Compact]: tsCompact,
@@ -187,7 +223,7 @@ const encoders: Record<TypeDefInfo, (registry: Registry, definitions: Record<str
[TypeDefInfo.HashMap]: tsHashMap, [TypeDefInfo.HashMap]: tsHashMap,
[TypeDefInfo.Int]: tsInt, [TypeDefInfo.Int]: tsInt,
[TypeDefInfo.Linkage]: errorUnhandled, [TypeDefInfo.Linkage]: errorUnhandled,
[TypeDefInfo.Null]: errorUnhandled, [TypeDefInfo.Null]: tsNull,
[TypeDefInfo.Option]: tsOption, [TypeDefInfo.Option]: tsOption,
[TypeDefInfo.Plain]: tsPlain, [TypeDefInfo.Plain]: tsPlain,
[TypeDefInfo.Range]: errorUnhandled, [TypeDefInfo.Range]: errorUnhandled,
@@ -198,7 +234,8 @@ const encoders: Record<TypeDefInfo, (registry: Registry, definitions: Record<str
[TypeDefInfo.Tuple]: tsTuple, [TypeDefInfo.Tuple]: tsTuple,
[TypeDefInfo.UInt]: tsUInt, [TypeDefInfo.UInt]: tsUInt,
[TypeDefInfo.Vec]: tsVec, [TypeDefInfo.Vec]: tsVec,
[TypeDefInfo.VecFixed]: tsVec [TypeDefInfo.VecFixed]: tsVec,
[TypeDefInfo.WrapperOpaque]: tsWrapperOpaque
}; };
/** @internal */ /** @internal */
@@ -206,7 +243,7 @@ function generateInterfaces (registry: Registry, definitions: Record<string, Mod
return Object.entries(types).map(([name, type]): [string, string] => { return Object.entries(types).map(([name, type]): [string, string] => {
const def = getTypeDef(isString(type) ? type : stringify(type), { name }); const def = getTypeDef(isString(type) ? type : stringify(type), { name });
return [name, encoders[def.info](registry, definitions, def, imports)]; return [name, typeEncoders[def.info](registry, definitions, def, imports)];
}); });
} }
@@ -220,25 +257,23 @@ const templateTypes = readTemplate('tsDef/types');
const generateTsDefTypesTemplate = Handlebars.compile(templateTypes); const generateTsDefTypesTemplate = Handlebars.compile(templateTypes);
/** @internal */ /** @internal */
function generateTsDefFor (registry: Registry, importDefinitions: { [importPath: string]: Record<string, ModuleTypes> }, defName: string, { types }: { types: Record<string, any> }, outputDir: string): void { export function generateTsDefFor (registry: Registry, importDefinitions: { [importPath: string]: Record<string, ModuleTypes> }, defName: string, { types }: { types: Record<string, any> }, outputDir: string): void {
const imports = { ...createImports(importDefinitions, { types }), interfaces: [] } as Imports; const imports = { ...createImports(importDefinitions, { types }), interfaces: [] } as Imports;
const definitions = imports.definitions; const definitions = imports.definitions;
const interfaces = generateInterfaces(registry, definitions, { types }, imports); const interfaces = generateInterfaces(registry, definitions, { types }, imports);
const items = interfaces.sort((a, b): number => a[0].localeCompare(b[0])).map(([, definition]): string => definition); const items = interfaces.sort((a, b) => a[0].localeCompare(b[0])).map(([, definition]) => definition);
const importTypes = [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath,
types: Object.keys(imports.localTypes[packagePath])
}))
];
writeFile(path.join(outputDir, defName, 'types.ts'), () => generateTsDefModuleTypesTemplate({ writeFile(path.join(outputDir, defName, 'types.ts'), () => generateTsDefModuleTypesTemplate({
headerType: 'defs', headerType: 'defs',
imports, imports,
items, items,
name: defName, name: defName,
types: importTypes types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath.replace('@polkadot/types/augment', '@polkadot/types'),
types: Object.keys(imports.localTypes[packagePath])
}))
]
}), true); }), true);
writeFile(path.join(outputDir, defName, 'index.ts'), () => generateTsDefIndexTemplate({ headerType: 'defs' }), true); writeFile(path.join(outputDir, defName, 'index.ts'), () => generateTsDefIndexTemplate({ headerType: 'defs' }), true);
} }
+36 -13
View File
@@ -7,6 +7,7 @@ import type { ExtraTypes } from './types';
import Handlebars from 'handlebars'; import Handlebars from 'handlebars';
import lookupDefinitions from '@polkadot/types/augment/lookup/definitions';
import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import * as defaultDefs from '@polkadot/types/interfaces/definitions';
import { Text } from '@polkadot/types/primitive'; import { Text } from '@polkadot/types/primitive';
import { stringCamelCase } from '@polkadot/util'; import { stringCamelCase } from '@polkadot/util';
@@ -30,32 +31,54 @@ const generateForMetaTemplate = Handlebars.compile(template);
/** @internal */ /** @internal */
function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void { function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: ExtraTypes, isStrict: boolean): void {
writeFile(dest, (): string => { writeFile(dest, (): string => {
const allTypes: ExtraTypes = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const allTypes: ExtraTypes = {
'@polkadot/types/augment': { lookup: lookupDefinitions },
'@polkadot/types/interfaces': defaultDefs,
...extraTypes
};
const imports = createImports(allTypes); const imports = createImports(allTypes);
const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => { const allDefs = Object.entries(allTypes).reduce((defs, [path, obj]) => {
return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs); return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [`${path}/${key}`]: value }), defs);
}, {}); }, {});
const { lookup, pallets } = meta.asLatest;
const modules = meta.asLatest.modules const modules = pallets
.filter(({ calls }) => calls.unwrapOr([]).length !== 0) .sort(compareName)
.filter(({ calls }) => calls.isSome)
.map(({ calls, name }) => { .map(({ calls, name }) => {
setImports(allDefs, imports, ['Call', 'Extrinsic', 'SubmittableExtrinsic']); setImports(allDefs, imports, ['Call', 'Extrinsic', 'SubmittableExtrinsic']);
const items = calls.unwrap() const sectionName = stringCamelCase(name);
.map(({ args, docs, name }) => { const items = lookup.getSiType(calls.unwrap().type).def.asVariant.variants
const params = args .map(({ docs, fields, name }) => {
.map(({ name, type }) => { const typesInfo = fields.map(({ name, type, typeName }, index): [string, string, string] => {
const typeStr = type.toString(); const typeDef = registry.lookup.getTypeDef(type);
return [
name.isSome
? mapName(name.unwrap())
: `param${index}`,
typeName.isSome
? typeName.toString()
: typeDef.type,
typeDef.isFromSi
? typeDef.type
: typeDef.lookupName || typeDef.type
];
});
const params = typesInfo
.map(([name,, typeStr]) => {
const similarTypes = getSimilarTypes(registry, allDefs, typeStr, imports); const similarTypes = getSimilarTypes(registry, allDefs, typeStr, imports);
setImports(allDefs, imports, [typeStr, ...similarTypes]); setImports(allDefs, imports, [typeStr, ...similarTypes]);
return `${mapName(name)}: ${similarTypes.join(' | ')}`; return `${name}: ${similarTypes.join(' | ')}`;
}) })
.join(', '); .join(', ');
return { return {
args: args.map(({ type }) => formatType(registry, allDefs, type.toString(), imports)).join(', '), args: typesInfo.map(([,, typeStr]) =>
formatType(registry, allDefs, typeStr, imports)
).join(', '),
docs, docs,
name: stringCamelCase(name), name: stringCamelCase(name),
params params
@@ -65,7 +88,7 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr
return { return {
items, items,
name: stringCamelCase(name) name: sectionName
}; };
}) })
.sort(compareName); .sort(compareName);
@@ -77,7 +100,7 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr
modules, modules,
types: [ types: [
...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({ ...Object.keys(imports.localTypes).sort().map((packagePath): { file: string; types: string[] } => ({
file: packagePath, file: packagePath.replace('@polkadot/types/augment', '@polkadot/types'),
types: Object.keys(imports.localTypes[packagePath]) types: Object.keys(imports.localTypes[packagePath])
})), })),
{ {
+2 -1
View File
@@ -1,9 +1,10 @@
// Copyright 2017-2021 @polkadot/typegen authors & contributors // Copyright 2017-2021 @polkadot/typegen authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import { generateDefaultConsts, generateDefaultErrors, generateDefaultEvents, generateDefaultInterface, generateDefaultQuery, generateDefaultRpc, generateDefaultTsDef, generateDefaultTx } from './generate'; import { generateDefaultConsts, generateDefaultErrors, generateDefaultEvents, generateDefaultInterface, generateDefaultLookup, generateDefaultQuery, generateDefaultRpc, generateDefaultTsDef, generateDefaultTx } from './generate';
export function main (): void { export function main (): void {
generateDefaultLookup();
generateDefaultInterface(); generateDefaultInterface();
generateDefaultConsts(); generateDefaultConsts();
+72 -53
View File
@@ -1,12 +1,12 @@
// Copyright 2017-2021 @polkadot/typegen authors & contributors // Copyright 2017-2021 @polkadot/typegen authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import type { MetadataLatest } from '@polkadot/types/interfaces/metadata'; import type { MetadataLatest, PortableRegistry, SiLookupTypeId } from '@polkadot/types/interfaces';
import type { Codec, DefinitionRpcParam } from '@polkadot/types/types'; import type { Codec, DefinitionRpcParam } from '@polkadot/types/types';
import fs from 'fs'; import fs from 'fs';
import { GenericCall as Call, Metadata, TypeRegistry, Vec } from '@polkadot/types'; import { Metadata, TypeRegistry, Vec } from '@polkadot/types';
import * as definitions from '@polkadot/types/interfaces/definitions'; import * as definitions from '@polkadot/types/interfaces/definitions';
import { getStorage as getSubstrateStorage } from '@polkadot/types/metadata/decorate/storage/getStorage'; import { getStorage as getSubstrateStorage } from '@polkadot/types/metadata/decorate/storage/getStorage';
import { Text } from '@polkadot/types/primitive'; import { Text } from '@polkadot/types/primitive';
@@ -45,9 +45,15 @@ const DESC_STORAGE = `The following sections contain Storage methods are part of
/** @internal */ /** @internal */
function docsVecToMarkdown (docLines: Vec<Text>, indent = 0): string { function docsVecToMarkdown (docLines: Vec<Text>, indent = 0): string {
const md = docLines const md = docLines
.map((docLine) => docLine && docLine.substring(1)) // trim the leading space .map((docLine) =>
.reduce((md, docLine): string => // generate paragraphs docLine
!docLine.trim().length .toString()
.trimStart()
.replace(/^r"/g, '')
.trimStart()
)
.reduce((md, docLine) => // generate paragraphs
!docLine.length
? `${md}\n\n` // empty line ? `${md}\n\n` // empty line
: /^[*-]/.test(docLine.trimStart()) && !md.endsWith('\n\n') : /^[*-]/.test(docLine.trimStart()) && !md.endsWith('\n\n')
? `${md}\n\n${docLine}` // line calling for a preceding linebreak ? `${md}\n\n${docLine}` // line calling for a preceding linebreak
@@ -112,6 +118,12 @@ function sortByName<T extends { name: Codec | string }> (a: T, b: T): number {
return a.name.toString().toUpperCase().localeCompare(b.name.toString().toUpperCase()); return a.name.toString().toUpperCase().localeCompare(b.name.toString().toUpperCase());
} }
function getSiName (lookup: PortableRegistry, type: SiLookupTypeId): string {
const typeDef = lookup.getTypeDef(type);
return typeDef.lookupName || typeDef.type;
}
/** @internal */ /** @internal */
function addRpc (): string { function addRpc (): string {
const sections = Object const sections = Object
@@ -162,25 +174,25 @@ function addRpc (): string {
} }
/** @internal */ /** @internal */
function addConstants (metadata: MetadataLatest): string { function addConstants ({ lookup, pallets }: MetadataLatest): string {
return renderPage({ return renderPage({
description: DESC_CONSTANTS, description: DESC_CONSTANTS,
sections: metadata.modules sections: pallets
.sort(sortByName) .sort(sortByName)
.filter((moduleMetadata) => !moduleMetadata.constants.isEmpty) .filter(({ constants }) => !constants.isEmpty)
.map((moduleMetadata) => { .map(({ constants, name }) => {
const sectionName = stringLowerFirst(moduleMetadata.name); const sectionName = stringLowerFirst(name);
return { return {
items: moduleMetadata.constants items: constants
.sort(sortByName) .sort(sortByName)
.map((func) => { .map(({ docs, name, type }) => {
const methodName = stringCamelCase(func.name); const methodName = stringCamelCase(name);
return { return {
interface: '`' + `api.consts.${sectionName}.${methodName}` + '`', interface: '`' + `api.consts.${sectionName}.${methodName}` + '`',
name: `${methodName}: ` + '`' + func.type.toString() + '`', name: `${methodName}: ` + '`' + getSiName(lookup, type) + '`',
...(func.docs.length && { summary: func.docs }) ...(docs.length && { summary: docs })
}; };
}), }),
name: sectionName name: sectionName
@@ -191,9 +203,9 @@ function addConstants (metadata: MetadataLatest): string {
} }
/** @internal */ /** @internal */
function addStorage (metadata: MetadataLatest): string { function addStorage ({ lookup, pallets, registry }: MetadataLatest): string {
const { substrate } = getSubstrateStorage(metadata.registry); const { substrate } = getSubstrateStorage(registry);
const moduleSections = metadata.modules const moduleSections = pallets
.sort(sortByName) .sort(sortByName)
.filter((moduleMetadata) => !moduleMetadata.storage.isNone) .filter((moduleMetadata) => !moduleMetadata.storage.isNone)
.map((moduleMetadata): Section => { .map((moduleMetadata): Section => {
@@ -203,15 +215,20 @@ function addStorage (metadata: MetadataLatest): string {
items: moduleMetadata.storage.unwrap().items items: moduleMetadata.storage.unwrap().items
.sort(sortByName) .sort(sortByName)
.map((func) => { .map((func) => {
const arg = func.type.isMap let arg = '';
? ('`' + func.type.asMap.key.toString() + '`')
: func.type.isDoubleMap if (func.type.isMap) {
? ('`' + func.type.asDoubleMap.key1.toString() + ', ' + func.type.asDoubleMap.key2.toString() + '`') const { hashers, key } = func.type.asMap;
: func.type.isNMap
? ('`' + func.type.asNMap.keyVec.map((k) => k.toString()).join(', ') + '`') arg = '`' + (
: ''; hashers.length === 1
? getSiName(lookup, key)
: lookup.getSiType(key).def.asTuple.map((t) => getSiName(lookup, t)).join(', ')
) + '`';
}
const methodName = stringLowerFirst(func.name); const methodName = stringLowerFirst(func.name);
const outputType = unwrapStorageType(metadata.registry, func.type, func.modifier.isOptional); const outputType = unwrapStorageType(registry, func.type, func.modifier.isOptional);
return { return {
interface: '`' + `api.query.${sectionName}.${methodName}` + '`', interface: '`' + `api.query.${sectionName}.${methodName}` + '`',
@@ -229,12 +246,10 @@ function addStorage (metadata: MetadataLatest): string {
description: 'These are well-known keys that are always available to the runtime implementation of any Substrate-based network.', description: 'These are well-known keys that are always available to the runtime implementation of any Substrate-based network.',
items: Object.entries(substrate).map(([name, { meta }]) => { items: Object.entries(substrate).map(([name, { meta }]) => {
const arg = meta.type.isMap const arg = meta.type.isMap
? ('`' + meta.type.asMap.key.toString() + '`') ? ('`' + getSiName(lookup, meta.type.asMap.key) + '`')
: meta.type.isDoubleMap : '';
? ('`' + meta.type.asDoubleMap.key1.toString() + ', ' + meta.type.asDoubleMap.key2.toString() + '`')
: '';
const methodName = stringLowerFirst(name); const methodName = stringLowerFirst(name);
const outputType = unwrapStorageType(metadata.registry, meta.type, meta.modifier.isOptional); const outputType = unwrapStorageType(registry, meta.type, meta.modifier.isOptional);
return { return {
interface: '`' + `api.query.substrate.${methodName}` + '`', interface: '`' + `api.query.substrate.${methodName}` + '`',
@@ -249,26 +264,28 @@ function addStorage (metadata: MetadataLatest): string {
} }
/** @internal */ /** @internal */
function addExtrinsics (metadata: MetadataLatest): string { function addExtrinsics ({ lookup, pallets }: MetadataLatest): string {
return renderPage({ return renderPage({
description: DESC_EXTRINSICS, description: DESC_EXTRINSICS,
sections: metadata.modules sections: pallets
.sort(sortByName) .sort(sortByName)
.filter((meta) => !meta.calls.isNone && meta.calls.unwrap().length !== 0) .filter(({ calls }) => calls.isSome)
.map((meta) => { .map(({ calls, name }) => {
const sectionName = stringCamelCase(meta.name); const sectionName = stringCamelCase(name);
return { return {
items: meta.calls.unwrap() items: lookup.getSiType(calls.unwrap().type).def.asVariant.variants
.sort(sortByName) .sort(sortByName)
.map((func) => { .map(({ docs, fields, name }, index) => {
const methodName = stringCamelCase(func.name); const methodName = stringCamelCase(name);
const args = Call.filterOrigin(func).map(({ name, type }) => `${name.toString()}: ` + '`' + type.toString() + '`').join(', '); const args = fields.map(({ name, type }) =>
`${name.isSome ? name.toString() : `param${index}`}: ` + '`' + getSiName(lookup, type) + '`'
).join(', ');
return { return {
interface: '`' + `api.tx.${sectionName}.${methodName}` + '`', interface: '`' + `api.tx.${sectionName}.${methodName}` + '`',
name: `${methodName}(${args})`, name: `${methodName}(${args})`,
...(func.docs.length && { summary: func.docs }) ...(docs.length && { summary: docs })
}; };
}), }),
name: sectionName name: sectionName
@@ -279,23 +296,25 @@ function addExtrinsics (metadata: MetadataLatest): string {
} }
/** @internal */ /** @internal */
function addEvents (metadata: MetadataLatest): string { function addEvents ({ lookup, pallets }: MetadataLatest): string {
return renderPage({ return renderPage({
description: DESC_EVENTS, description: DESC_EVENTS,
sections: metadata.modules sections: pallets
.sort(sortByName) .sort(sortByName)
.filter((meta) => !meta.events.isNone && meta.events.unwrap().length !== 0) .filter(({ events }) => events.isSome)
.map((meta) => ({ .map((meta) => ({
items: meta.events.unwrap() items: lookup.getSiType(meta.events.unwrap().type).def.asVariant.variants
.sort(sortByName) .sort(sortByName)
.map((func) => { .map(({ docs, fields, name }) => {
const methodName = func.name.toString(); const methodName = name.toString();
const args = func.args.map((type): string => '`' + type.toString() + '`').join(', '); const args = fields.map(({ type }) =>
'`' + getSiName(lookup, type) + '`'
).join(', ');
return { return {
interface: '`' + `api.events.${stringCamelCase(meta.name)}.${methodName}.is` + '`', interface: '`' + `api.events.${stringCamelCase(meta.name)}.${methodName}.is` + '`',
name: `${methodName}(${args})`, name: `${methodName}(${args})`,
...(func.docs.length && { summary: func.docs }) ...(docs.length && { summary: docs })
}; };
}), }),
name: stringCamelCase(meta.name) name: stringCamelCase(meta.name)
@@ -305,14 +324,14 @@ function addEvents (metadata: MetadataLatest): string {
} }
/** @internal */ /** @internal */
function addErrors (metadata: MetadataLatest): string { function addErrors ({ lookup, pallets }: MetadataLatest): string {
return renderPage({ return renderPage({
description: DESC_ERRORS, description: DESC_ERRORS,
sections: metadata.modules sections: pallets
.sort(sortByName) .sort(sortByName)
.filter((moduleMetadata) => !moduleMetadata.errors.isEmpty) .filter(({ errors }) => errors.isSome)
.map((moduleMetadata) => ({ .map((moduleMetadata) => ({
items: moduleMetadata.errors items: lookup.getSiType(moduleMetadata.errors.unwrap().type).def.asVariant.variants
.sort(sortByName) .sort(sortByName)
.map((error) => ({ .map((error) => ({
interface: '`' + `api.errors.${stringCamelCase(moduleMetadata.name)}.${error.name.toString()}.is` + '`', interface: '`' + `api.errors.${stringCamelCase(moduleMetadata.name)}.${error.name.toString()}.is` + '`',
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/typegen', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/typegen', version: '6.2.1' };
@@ -0,0 +1,15 @@
{{> header }}
/* eslint-disable sort-keys */
import type { DefinitionsTypes } from '../../types';
export default {
{{#each defs}}
{{> docs}}
{{#each defs}}
{{{this}}}
{{/each}}
{{/each}}
} as DefinitionsTypes;
{{> footer }}
@@ -0,0 +1,18 @@
{{> header }}
/* eslint-disable sort-keys */
import type { Definitions } from '../../types';
export default {
rpc: {},
types: {
{{#each defs}}
{{> docs}}
{{#each defs}}
{{{this}}}
{{/each}}
{{/each}}
}
} as Definitions;
{{> footer }}
@@ -0,0 +1,4 @@
{{> header }}
export * from './types';
{{> footer }}
@@ -0,0 +1,12 @@
{{> header }}
{{{ imports }}}
declare module '@polkadot/types/lookup' {
{{#each items}}
{{{this}}}
{{/each}}
}
{{> footer }}
+73 -57
View File
@@ -55,7 +55,7 @@ Handlebars.registerHelper({
...types ...types
]; ];
return defs.reduce((result, { file, types }): string => { return [...defs].sort((a, b) => a.file.localeCompare(b.file)).reduce((result, { file, types }): string => {
return types.length return types.length
? `${result}import type { ${types.sort().join(', ')} } from '${file}';\n` ? `${result}import type { ${types.sort().join(', ')} } from '${file}';\n`
: result; : result;
@@ -71,9 +71,9 @@ Handlebars.registerHelper({
// helper to generate a `export interface <Name> extends <Base> {<Body>} // helper to generate a `export interface <Name> extends <Base> {<Body>}
/** @internal */ /** @internal */
export function exportInterface (name = '', base: string, body = ''): string { export function exportInterface (lookupIndex = -1, name = '', base: string, body = ''): string {
// * @description extends [[${base}]] // * @description extends [[${base}]]
const doc = `/** @name ${name} */\n`; const doc = `/** @name ${name}${lookupIndex !== -1 ? ` (${lookupIndex})` : ''} */\n`;
return `${doc}export interface ${name} extends ${base} {${body.length ? '\n' : ''}${body}}`; return `${doc}export interface ${name} extends ${base} {${body.length ? '\n' : ''}${body}}`;
} }
@@ -82,23 +82,40 @@ export function exportInterface (name = '', base: string, body = ''): string {
// but since we don't want type alias (TS doesn't preserve names) we use // but since we don't want type alias (TS doesn't preserve names) we use
// interface here. // interface here.
/** @internal */ /** @internal */
export function exportType (name = '', base: string): string { export function exportType (lookupIndex = -1, name = '', base: string): string {
return exportInterface(name, base); return exportInterface(lookupIndex, name, base);
}
function singleParamNotation (registry: Registry, wrapper: string, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean): string {
const sub = (typeDef.sub as TypeDef);
setImports(definitions, imports, [wrapper, sub.lookupName]);
return paramsNotation(wrapper, sub.lookupName || formatType(registry, definitions, sub.type, imports, withShortcut));
}
function dualParamsNotation (registry: Registry, wrapper: string, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean): string {
const [a, b] = (typeDef.sub as TypeDef[]);
setImports(definitions, imports, [wrapper, a.lookupName, b.lookupName]);
return paramsNotation(wrapper, [
a.lookupName || formatType(registry, definitions, a.type, imports, withShortcut),
b.lookupName || formatType(registry, definitions, b.type, imports, withShortcut)
]);
} }
const formatters: Record<TypeDefInfo, (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => string> = { const formatters: Record<TypeDefInfo, (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => string> = {
[TypeDefInfo.Compact]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Compact]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Compact']); return singleParamNotation(registry, 'Compact', typeDef, definitions, imports, withShortcut);
const sub = typeDef.sub as TypeDef;
return paramsNotation('Compact', formatType(registry, definitions, sub.lookupName || sub.type, imports, withShortcut));
}, },
[TypeDefInfo.DoNotConstruct]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
[TypeDefInfo.DoNotConstruct]: (registry: Registry, { lookupName }: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['DoNotConstruct']); setImports(definitions, imports, ['DoNotConstruct']);
return 'DoNotConstruct'; return 'DoNotConstruct';
}, },
[TypeDefInfo.Enum]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Enum]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
if (typeDef.lookupName) { if (typeDef.lookupName) {
return typeDef.lookupName; return typeDef.lookupName;
@@ -106,65 +123,77 @@ const formatters: Record<TypeDefInfo, (registry: Registry, typeDef: TypeDef, def
throw new Error(`TypeDefInfo.Enum: Not implemented on ${stringify(typeDef)}`); throw new Error(`TypeDefInfo.Enum: Not implemented on ${stringify(typeDef)}`);
}, },
[TypeDefInfo.Int]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Int]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
throw new Error(`TypeDefInfo.Int: Not implemented on ${stringify(typeDef)}`); throw new Error(`TypeDefInfo.Int: Not implemented on ${stringify(typeDef)}`);
}, },
[TypeDefInfo.UInt]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.UInt]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
throw new Error(`TypeDefInfo.UInt: Not implemented on ${stringify(typeDef)}`); throw new Error(`TypeDefInfo.UInt: Not implemented on ${stringify(typeDef)}`);
}, },
[TypeDefInfo.Null]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Null]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Null']); setImports(definitions, imports, ['Null']);
return 'Null'; return 'Null';
}, },
[TypeDefInfo.Option]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Option]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Option']); return singleParamNotation(registry, 'Option', typeDef, definitions, imports, withShortcut);
const sub = (typeDef.sub as TypeDef);
return paramsNotation('Option', formatType(registry, definitions, sub.lookupName || sub.type, imports, withShortcut));
}, },
[TypeDefInfo.Plain]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Plain]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, [typeDef.type]); setImports(definitions, imports, [typeDef.type]);
return typeDef.type; return typeDef.type;
}, },
[TypeDefInfo.Range]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Range]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
throw new Error(`TypeDefInfo.Range: Not implemented on ${stringify(typeDef)}`); throw new Error(`TypeDefInfo.Range: Not implemented on ${stringify(typeDef)}`);
}, },
[TypeDefInfo.Set]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Set]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
throw new Error(`TypeDefInfo.Set: Not implemented on ${stringify(typeDef)}`); throw new Error(`TypeDefInfo.Set: Not implemented on ${stringify(typeDef)}`);
}, },
[TypeDefInfo.Si]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Si]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
return formatType(registry, definitions, registry.lookup.getTypeDef(typeDef.type), imports, withShortcut); return formatType(registry, definitions, registry.lookup.getTypeDef(typeDef.type), imports, withShortcut);
}, },
[TypeDefInfo.Struct]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Struct]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Struct']); if (typeDef.lookupName) {
return typeDef.lookupName;
}
const sub = typeDef.sub as TypeDef[];
setImports(definitions, imports, ['Struct', ...sub.map(({ lookupName }) => lookupName)]);
return `{${withShortcut ? ' ' : '\n'}${ return `{${withShortcut ? ' ' : '\n'}${
((typeDef.sub as TypeDef[]).map(({ lookupName, name, type }, index) => [ sub.map(({ lookupName, name, type }, index) => [
name || `unknown${index}`, name || `unknown${index}`,
formatType(registry, definitions, lookupName || type, imports, withShortcut) lookupName || formatType(registry, definitions, type, imports, withShortcut)
])).map(([k, t]) => `${withShortcut ? '' : ' readonly '}${k}: ${t};`).join(withShortcut ? ' ' : '\n') ]).map(([k, t]) => `${withShortcut ? '' : ' readonly '}${k}: ${t};`).join(withShortcut ? ' ' : '\n')
}${withShortcut ? ' ' : '\n '}} & Struct`; }${withShortcut ? ' ' : '\n '}} & Struct`;
}, },
[TypeDefInfo.Tuple]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Tuple]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['ITuple']); const sub = typeDef.sub as TypeDef[];
setImports(definitions, imports, ['ITuple', ...sub.map(({ lookupName }) => lookupName)]);
// `(a,b)` gets transformed into `ITuple<[a, b]>` // `(a,b)` gets transformed into `ITuple<[a, b]>`
return paramsNotation('ITuple', `[${ return paramsNotation('ITuple', `[${
((typeDef.sub as TypeDef[]).map(({ lookupName, type }) => sub.map(({ lookupName, type }) =>
formatType(registry, definitions, lookupName || type, imports, withShortcut) lookupName || formatType(registry, definitions, type, imports, withShortcut)
)).join(', ') ).join(', ')
}]`); }]`);
}, },
[TypeDefInfo.Vec]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Vec]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Vec']); return singleParamNotation(registry, 'Vec', typeDef, definitions, imports, withShortcut);
const sub = (typeDef.sub as TypeDef);
return paramsNotation('Vec', formatType(registry, definitions, sub.lookupName || sub.type, imports, withShortcut));
}, },
[TypeDefInfo.VecFixed]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.VecFixed]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
const sub = (typeDef.sub as TypeDef); const sub = (typeDef.sub as TypeDef);
@@ -174,44 +203,31 @@ const formatters: Record<TypeDefInfo, (registry: Registry, typeDef: TypeDef, def
return 'U8aFixed'; return 'U8aFixed';
} }
setImports(definitions, imports, ['Vec']); return singleParamNotation(registry, 'Vec', typeDef, definitions, imports, withShortcut);
return paramsNotation('Vec', formatType(registry, definitions, sub.lookupName || sub.type, imports, withShortcut));
}, },
[TypeDefInfo.BTreeMap]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.BTreeMap]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['BTreeMap']); return dualParamsNotation(registry, 'BTreeMap', typeDef, definitions, imports, withShortcut);
const [keyDef, valDef] = (typeDef.sub as TypeDef[]);
return `BTreeMap<${formatType(registry, definitions, keyDef.lookupName || keyDef.type, imports, withShortcut)}, ${formatType(registry, definitions, valDef.lookupName || valDef.type, imports, withShortcut)}>`;
}, },
[TypeDefInfo.BTreeSet]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.BTreeSet]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['BTreeSet']); return singleParamNotation(registry, 'BTreeSet', typeDef, definitions, imports, withShortcut);
const valDef = typeDef.sub as TypeDef;
return `BTreeSet<${formatType(registry, definitions, valDef.lookupName || valDef.type, imports, withShortcut)}>`;
}, },
[TypeDefInfo.HashMap]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.HashMap]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['HashMap']); return dualParamsNotation(registry, 'HashMap', typeDef, definitions, imports, withShortcut);
const [keyDef, valDef] = (typeDef.sub as TypeDef[]);
return `HashMap<${formatType(registry, definitions, keyDef.lookupName || keyDef.type, imports, withShortcut)}, ${formatType(registry, definitions, valDef.lookupName || valDef.type, imports, withShortcut)}>`;
}, },
[TypeDefInfo.Linkage]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Linkage]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Linkage']); return singleParamNotation(registry, 'Linkage', typeDef, definitions, imports, withShortcut);
const sub = (typeDef.sub as TypeDef);
return paramsNotation('Linkage', formatType(registry, definitions, sub.lookupName || sub.type, imports, withShortcut));
}, },
[TypeDefInfo.Result]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => { [TypeDefInfo.Result]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
setImports(definitions, imports, ['Result']); return dualParamsNotation(registry, 'Result', typeDef, definitions, imports, withShortcut);
},
const [okDef, errDef] = (typeDef.sub as TypeDef[]); [TypeDefInfo.WrapperOpaque]: (registry: Registry, typeDef: TypeDef, definitions: Record<string, ModuleTypes>, imports: TypeImports, withShortcut: boolean) => {
return singleParamNotation(registry, 'WrapperOpaque', typeDef, definitions, imports, withShortcut);
return `Result<${formatType(registry, definitions, okDef.lookupName || okDef.type, imports, withShortcut)}, ${formatType(registry, definitions, errDef.lookupName || errDef.type, imports, withShortcut)}>`;
} }
}; };
@@ -237,7 +253,7 @@ export function formatType (registry: Registry, definitions: Record<string, Modu
typeDef = type; typeDef = type;
} }
setImports(definitions, imports, [typeDef.type]); setImports(definitions, imports, [typeDef.lookupName || typeDef.type]);
return formatters[typeDef.info](registry, typeDef, definitions, imports, withShortcut); return formatters[typeDef.info](registry, typeDef, definitions, imports, withShortcut);
} }
+2 -2
View File
@@ -36,10 +36,10 @@ export interface TypeImports {
// Maps the types as found to the source location. This is used to generate the // Maps the types as found to the source location. This is used to generate the
// imports in the output file, dep-duped and sorted // imports in the output file, dep-duped and sorted
/** @internal */ /** @internal */
export function setImports (allDefs: Record<string, ModuleTypes>, imports: TypeImports, types: string[]): void { export function setImports (allDefs: Record<string, ModuleTypes>, imports: TypeImports, types: (string | null | undefined)[]): void {
const { codecTypes, extrinsicTypes, genericTypes, ignoredTypes, localTypes, metadataTypes, primitiveTypes, typesTypes } = imports; const { codecTypes, extrinsicTypes, genericTypes, ignoredTypes, localTypes, metadataTypes, primitiveTypes, typesTypes } = imports;
types.forEach((type): void => { types.filter((t): t is string => !!t).forEach((type): void => {
if (ignoredTypes.includes(type)) { if (ignoredTypes.includes(type)) {
// do nothing // do nothing
} else if (['AnyNumber', 'CallFunction', 'Codec', 'IExtrinsic', 'ITuple'].includes(type)) { } else if (['AnyNumber', 'CallFunction', 'Codec', 'IExtrinsic', 'ITuple'].includes(type)) {
+3 -3
View File
@@ -4,7 +4,7 @@
import type { ExtraTypes } from '../generate/types'; import type { ExtraTypes } from '../generate/types';
import { Metadata, TypeRegistry } from '@polkadot/types'; import { Metadata, TypeRegistry } from '@polkadot/types';
import staticData from '@polkadot/types-support/metadata/static-substrate'; import staticSubstrate from '@polkadot/types-support/metadata/static-substrate';
import { registerDefinitions } from './register'; import { registerDefinitions } from './register';
@@ -13,12 +13,12 @@ interface Result {
registry: TypeRegistry; registry: TypeRegistry;
} }
export function initMeta (data = staticData, extraTypes: ExtraTypes = {}): Result { export function initMeta (staticMeta = staticSubstrate, extraTypes: ExtraTypes = {}): Result {
const registry = new TypeRegistry(); const registry = new TypeRegistry();
registerDefinitions(registry, extraTypes); registerDefinitions(registry, extraTypes);
const metadata = new Metadata(registry, data); const metadata = new Metadata(registry, staticMeta);
registry.setMetadata(metadata); registry.setMetadata(metadata);
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/types-known", "name": "@polkadot/types-known",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Known type definitions", "description": "Known type definitions",
"main": "index.js", "main": "index.js",
@@ -20,8 +20,8 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/types-known#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/types-known#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/networks": "^7.3.1", "@polkadot/networks": "^7.4.1",
"@polkadot/types": "5.9.1", "@polkadot/types": "6.2.1",
"@polkadot/util": "^7.3.1" "@polkadot/util": "^7.4.1"
} }
} }
+3 -3
View File
@@ -7,7 +7,7 @@ import type { Hash } from '@polkadot/types/interfaces';
import type { ChainUpgradeVersion, CodecHasher, DefinitionRpc, DefinitionRpcSub, OverrideModuleType, OverrideVersionedType, Registry, RegistryTypes } from '@polkadot/types/types'; import type { ChainUpgradeVersion, CodecHasher, DefinitionRpc, DefinitionRpcSub, OverrideModuleType, OverrideVersionedType, Registry, RegistryTypes } from '@polkadot/types/types';
import type { BN } from '@polkadot/util'; import type { BN } from '@polkadot/util';
import { bnToBn, isUndefined } from '@polkadot/util'; import { bnToBn, isNull, isUndefined } from '@polkadot/util';
import typesChain from './chain'; import typesChain from './chain';
import typesModules from './modules'; import typesModules from './modules';
@@ -22,8 +22,8 @@ export { packageInfo } from './packageInfo';
function filterVersions (versions: OverrideVersionedType[] = [], specVersion: number): RegistryTypes { function filterVersions (versions: OverrideVersionedType[] = [], specVersion: number): RegistryTypes {
return versions return versions
.filter(({ minmax: [min, max] }) => .filter(({ minmax: [min, max] }) =>
(isUndefined(min) || specVersion >= min) && (isUndefined(min) || isNull(min) || specVersion >= min) &&
(isUndefined(max) || specVersion <= max) (isUndefined(max) || isNull(max) || specVersion <= max)
) )
.reduce((result: RegistryTypes, { types }): RegistryTypes => ({ .reduce((result: RegistryTypes, { types }): RegistryTypes => ({
...result, ...result,
+1 -1
View File
@@ -3,4 +3,4 @@
// Auto-generated by @polkadot/dev, do not edit // Auto-generated by @polkadot/dev, do not edit
export const packageInfo = { name: '@polkadot/types-known', version: '5.9.1' }; export const packageInfo = { name: '@polkadot/types-known', version: '6.2.1' };
+1
View File
@@ -45,6 +45,7 @@ const versioned: OverrideVersionedType[] = [
DispatchError: 'DispatchErrorTo198', DispatchError: 'DispatchErrorTo198',
DispatchInfo: 'DispatchInfoTo244', DispatchInfo: 'DispatchInfoTo244',
Heartbeat: 'HeartbeatTo244', Heartbeat: 'HeartbeatTo244',
IdentityInfo: 'IdentityInfoTo198',
Keys: 'SessionKeys5', Keys: 'SessionKeys5',
Multiplier: 'Fixed64', Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225', OpenTip: 'OpenTipTo225',
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@polkadot/types-support", "name": "@polkadot/types-support",
"version": "5.9.1", "version": "6.2.1",
"type": "module", "type": "module",
"description": "Supporting files for types, mostly for testing", "description": "Supporting files for types, mostly for testing",
"main": "index.js", "main": "index.js",
@@ -20,6 +20,6 @@
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/types-support#readme", "homepage": "https://github.com/polkadot-js/api/tree/master/packages/types-support#readme",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.15.4", "@babel/runtime": "^7.15.4",
"@polkadot/util": "^7.3.1" "@polkadot/util": "^7.4.1"
} }
} }
@@ -1,6 +1,6 @@
// Copyright 2017-2021 @polkadot/types-support authors & contributors // Copyright 2017-2021 @polkadot/types-support authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import metadata from './v13/kusama-hex'; import metadata from './v14/kusama-hex';
export default metadata; export default metadata;
@@ -1,6 +1,6 @@
// Copyright 2017-2021 @polkadot/types-support authors & contributors // Copyright 2017-2021 @polkadot/types-support authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import metadata from './v13/polkadot-hex'; import metadata from './v14/polkadot-hex';
export default metadata; export default metadata;
@@ -1,6 +1,6 @@
// Copyright 2017-2021 @polkadot/types-support authors & contributors // Copyright 2017-2021 @polkadot/types-support authors & contributors
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
import metadata from './v13/substrate-hex'; import metadata from './v14/substrate-hex';
export default metadata; export default metadata;

Some files were not shown because too many files have changed in this diff Show More