Compare commits

...
56 Commits
Author SHA1 Message Date
Github Actions 8c73cd7d6e [CI Skip] release/stable 1.24.1
skip-checks: true
2020-07-13 09:49:07 +00:00
Jaco Greeff 36232c0289 1.24 (#2421) 2020-07-13 11:38:47 +02:00
Github Actions 50d4e0397f [CI Skip] release/beta 1.24.0-beta.2
skip-checks: true
2020-07-10 13:28:14 +00:00
Jaco Greeff 539a8c4cb5 Types for poll module (#2418) 2020-07-10 15:17:03 +02:00
Github Actions b849976b3b [CI Skip] release/beta 1.24.0-beta.1
skip-checks: true
2020-07-08 14:35:48 +00:00
Jaco Greeff 2395401a2b Raw/Bytes isUtf8 & assert in toUtf8 (#2414) 2020-07-08 16:24:13 +02:00
Github Actions 0e1bbd5cac [CI Skip] release/beta 1.24.0-beta.0
skip-checks: true
2020-07-08 12:57:36 +00:00
Jaco Greeff e9489d41cb Raw isAscii & toUtf8 (#2413)
* Raw isAscii & toUtf8

* Tests for isAscii & toUtf8

* Cleanup return types
2020-07-08 14:46:12 +02:00
Github Actions 63483b9db7 [CI Skip] release/stable 1.23.1
skip-checks: true
2020-07-06 05:45:32 +00:00
Jaco Greeff b26c7f9f0a 1.23.1 (ith version bump) 2020-07-06 07:31:36 +02:00
Github Actions a165c9375c [CI Skip] release/beta 1.23.0-beta.7
skip-checks: true
2020-07-06 05:27:04 +00:00
Jaco Greeff 28631f7180 1.23 (#2411) 2020-07-06 07:15:07 +02:00
Github Actions 6489251b47 [CI Skip] release/beta 1.23.0-beta.6
skip-checks: true
2020-07-03 15:34:13 +00:00
Jaco Greeff 66884febea Add OpaqueCall type (#2408) 2020-07-03 17:22:02 +02:00
Github Actions 8058dc350f [CI Skip] release/beta 1.23.0-beta.5
skip-checks: true
2020-07-03 10:05:48 +00:00
Jaco Greeff 63096cc238 Remove unneeded base extends (#2407)
* Remove unneeded base extends

* CHANGELOG

* Result with value on enum
2020-07-03 11:55:39 +02:00
Github Actions 05600c0cd0 [CI Skip] release/beta 1.23.0-beta.4
skip-checks: true
2020-07-03 09:46:07 +00:00
Jaco Greeff eed5e23e65 Validate number sign in AbstractInt (#2406) 2020-07-03 11:33:30 +02:00
Github Actions cdf5b15673 [CI Skip] release/beta 1.23.0-beta.3
skip-checks: true
2020-07-02 05:27:15 +00:00
Jaco Greeff 1922676bd7 Bump deps (#2404) 2020-07-02 07:14:08 +02:00
Github Actions b6c427e985 [CI Skip] release/beta 1.23.0-beta.2
skip-checks: true
2020-07-01 15:55:54 +00:00
Jaco Greeff 0327aedf8e Update ProxyType for Kusama, Polkadot & Westend (#2403)
* Update ProxyType fro Kusama, Polkadot & Westend

* CHANGELOG
2020-07-01 17:42:22 +02:00
Github Actions d7035cebb1 [CI Skip] release/beta 1.23.0-beta.1
skip-checks: true
2020-07-01 11:51:42 +00:00
Daniel Maricic 8b492021af Fixed typo in README (#2402) 2020-07-01 13:39:07 +02:00
Github Actions 6a01fc7c8c [CI Skip] release/beta 1.23.0-beta.0
skip-checks: true
2020-07-01 05:58:34 +00:00
Jaco Greeff bbc30ec9dc Cross-referencing type failure (#2400)
* Cross-referencing type failure

* typo

* Adjust toRawType() with name from registry

* Rewrite yarn.lock

* Adjustments

* Test adjustments
2020-07-01 07:47:21 +02:00
Github Actions f07c0628bc [CI Skip] release/stable 1.22.1
skip-checks: true
2020-06-30 08:04:08 +00:00
Jaco Greeff 023c7588e5 1.22 (#2399)
* 1.22

* CHANGELOG for OpenTip
2020-06-30 09:52:42 +02:00
Jaco Greeff 7dfc8625cc New OpenTip structure (#2394)
* New OpenTip structure

* Kusama update
2020-06-29 16:20:43 +02:00
Github Actions 8643b5da87 [CI Skip] release/beta 1.22.0-beta.5
skip-checks: true
2020-06-29 07:03:10 +00:00
Jaco Greeff afa0e63ae8 CHANGELOG & Bumps (#2397)
* CHANGELOG & Bumps

* Rewrite yarn.lock
2020-06-29 08:52:12 +02:00
Github Actions 534303ff45 [CI Skip] release/beta 1.22.0-beta.4
skip-checks: true
2020-06-28 14:18:29 +00:00
Jaco Greeff f1ebcddec6 Adjust for vesting via locks (#2396) 2020-06-28 16:08:02 +02:00
Github Actions 657a2006dd [CI Skip] release/beta 1.22.0-beta.3
skip-checks: true
2020-06-24 19:02:00 +00:00
Jaco Greeff 219e928c01 Retried staker rewards for specified eras (#2392) 2020-06-24 20:52:21 +02:00
Github Actions 43183118d5 [CI Skip] release/beta 1.22.0-beta.2
skip-checks: true
2020-06-24 10:43:10 +00:00
Alexander Krupenkin 76e15d465d Add [u8; 33] type width for U8aFixed type (#2391)
ECDSA compressed public key has 33-byte length, this is required for encoding public key as a parameter.
2020-06-24 12:31:55 +02:00
Github Actions 4c0387e1a3 [CI Skip] release/beta 1.22.0-beta.1
skip-checks: true
2020-06-23 20:31:15 +00:00
Jaco Greeff bbbd82eb4a Move indices cache to indices list (#2390) 2020-06-23 22:19:13 +02:00
Github Actions a34a7450aa [CI Skip] release/beta 1.22.0-beta.0
skip-checks: true
2020-06-23 18:38:54 +00:00
Jaco Greeff bf472fdcf4 Optimize accountId -> accountIndex lookups (#2389) 2020-06-23 20:25:58 +02:00
Github Actions f428a58006 [CI Skip] release/stable 1.21.1
skip-checks: true
2020-06-23 16:12:18 +00:00
Jaco Greeff fcce2ab340 1.21 (#2384)
* 1.21

* CHANGELOG

* Babe EquivocationProof

* Update CHANGELOG.md
2020-06-23 18:01:47 +02:00
Jaco Greeff 877eb11717 Swap releases type to shared enum (#2388)
* Swap releases type to u8

* Shared enum for releases

* Update metadata for new names
2020-06-23 17:40:15 +02:00
Jaco Greeff 4b55f1be93 Babe Equivocation (#2374)
* Babe Equivocation

* metadata field rename to GrandpaEquivocationProof
2020-06-23 16:46:26 +02:00
Github Actions f2a677634e [CI Skip] release/beta 1.21.0-beta.4
skip-checks: true
2020-06-23 13:18:12 +00:00
Jaco Greeff eea4c8775e Use setImmediate for unsubscribe (allow outer resolve) (#2385) 2020-06-23 15:06:08 +02:00
Github Actions 792bf0ec36 [CI Skip] release/beta 1.21.0-beta.3
skip-checks: true
2020-06-23 12:20:27 +00:00
Jaco Greeff e3d13107a9 Add support for CheckMortality extension (#2383) 2020-06-23 14:08:40 +02:00
Jaco Greeff e5c2c6a228 Use BN in-place operators as appropriate (#2381)
* Use BN in-place operators as appropriate

* CHANGELOG
2020-06-23 14:02:54 +02:00
Github Actions d2be79132c [CI Skip] release/beta 1.21.0-beta.2
skip-checks: true
2020-06-23 11:59:30 +00:00
Jaco Greeff 76da2638c1 Ensure subscriptions always unsubscribe as required (#2380)
* Ensure single-shot calls always unsubscribe

* memo/refCount cleanups

* Fix unsubscriptions

* Cleanup linting types

* CHANGELOG
2020-06-23 13:47:28 +02:00
Github Actions daf3912920 [CI Skip] release/beta 1.21.0-beta.1
skip-checks: true
2020-06-23 09:17:57 +00:00
Jaco Greeff 6dfebbb9fe Fixup subscriptions for promise (w/ callback) (#2379)
* Fixup subscriptions for promise (w/ callback)

* Update packages/api/src/base/Decorate.ts
2020-06-23 11:05:51 +02:00
Github Actions e55c5f77f7 [CI Skip] release/beta 1.21.0-beta.0
skip-checks: true
2020-06-23 07:41:54 +00:00
Jaco Greeff c7315ffb74 Do not use subscriptions on single subs (#2378)
* Do not use subscriptions on single subs

* Apply suggestions from code review
2020-06-23 09:29:49 +02:00
91 changed files with 2312 additions and 1921 deletions
+34
View File
@@ -1,5 +1,39 @@
# CHANGELOG
## 1.24.1 Jul 13, 2020
- Added `isAscii` & `isUtf8` getters to `Bytes` & `Raw` types
- Added `toUtf8()` helper to `Bytes` & `Raw` types
- `@polkadot/util` 2.18
## 1.23.1 Jul 6, 2020
- Small README typo fix (Thanks to https://github.com/woss)
- Add latest Substrate master types
- Adjust `<Codec>.toRawType()` to use registry name as available
- Update `ProxyType` for Kusama, Polkadot & Westend with `IdentityJudgement`
- Validate number format (signed/unsigned) for number types
- Remove core codec dependencies on Base class (with proper TS encapsulation)
- `@polkadot/util` 2.17
## 1.22.1 Jun 30, 2020
- **Important** Substrate changed the treasury tip structure, on older chains supply `OpenTip: 'OpenTipTo225'`
- Allow for `[u8; 33]` in U8aFixed (Thanks to https://github.com/akru)
- Improve derive accountId -> accountIndex lookups (optimize entries queries)
- Vesting balance calculations via `derive.balances.all` has been updated for locks
- Add derive for multi staking rewards with specified eras
- `@polkadot/util` 2.16
## 1.21.1 Jun 23, 2020
- Fix subscriptions never unsubscribing after the id swap in 1.18.1 (Thanks to https://github.com/dillu24 for testing iterations)
- Add support for `CheckMortality` signed extension (old `CheckEra` is now an alias)
- Promise API will default to using `getStorage` on non-subscription calls, reducing RPC overhead
- Optimize derive BN allocations, using in-place operators as applicable
- Add new Substrate types for Babe `EquivocationProof`
- Adjust `Releases` enum to use a shared instance
## 1.20.1 Jun 22, 2020
- **Important** RPC for `account_nextIndex` has been moved to `system_accountNextIndex` (Aligning with Substrate as a primary alias)
+1 -1
View File
@@ -7,7 +7,7 @@
# @polkadot/api
This library provides a clean wrapper around all the methods exposed by a Polkadot/Subtrate network client and defines all the types exposed by a node. For complete documentation around the classes, interfaces and their use, visit the [documentation portal](https://polkadot.js.org/api/).
This library provides a clean wrapper around all the methods exposed by a Polkadot/Substrate network client and defines all the types exposed by a node. For complete documentation around the classes, interfaces and their use, visit the [documentation portal](https://polkadot.js.org/api/).
If you are an existing user, please be sure to track the [CHANGELOG](CHANGELOG.md) and [UPGRADING](UPGRADING.md) guides when changing versions.
+1 -1
View File
@@ -9,5 +9,5 @@
"packages": [
"packages/*"
],
"version": "1.20.1"
"version": "1.24.1"
}
+7 -7
View File
@@ -24,15 +24,15 @@
"test:watch": "polkadot-dev-run-test --watch"
},
"devDependencies": {
"@babel/core": "^7.10.3",
"@babel/register": "^7.10.3",
"@babel/runtime": "^7.10.3",
"@polkadot/dev": "^0.55.11",
"@polkadot/ts": "^0.3.26",
"@babel/core": "^7.10.4",
"@babel/register": "^7.10.4",
"@babel/runtime": "^7.10.4",
"@polkadot/dev": "^0.55.21",
"@polkadot/ts": "^0.3.27",
"@polkadot/typegen": "workspace:packages/typegen",
"@types/jest": "^26.0.0",
"@types/jest": "^26.0.4",
"@vuepress/plugin-search": "^1.5.2",
"copyfiles": "^2.3.0"
},
"version": "1.20.1"
"version": "1.24.1"
}
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/api-contract",
"version": "1.20.1",
"version": "1.24.1",
"description": "Interfaces for interacting with contracts and contract ABIs",
"main": "index.js",
"keywords": [
@@ -26,12 +26,12 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-contract#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/api": "1.20.1",
"@polkadot/rpc-core": "1.20.1",
"@polkadot/types": "1.20.1",
"@polkadot/util": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/api": "1.24.1",
"@polkadot/rpc-core": "1.24.1",
"@polkadot/types": "1.24.1",
"@polkadot/util": "^2.18.1",
"bn.js": "^5.1.2",
"rxjs": "^6.5.5"
"rxjs": "^6.6.0"
}
}
+10 -10
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/api-derive",
"version": "1.20.1",
"version": "1.24.1",
"description": "Common functions used across Polkadot, derived from RPC calls and storage queries.",
"main": "index.js",
"keywords": [
@@ -27,18 +27,18 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-derive#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/api": "1.20.1",
"@polkadot/rpc-core": "1.20.1",
"@polkadot/rpc-provider": "1.20.1",
"@polkadot/types": "1.20.1",
"@polkadot/util": "^2.15.1",
"@polkadot/util-crypto": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/api": "1.24.1",
"@polkadot/rpc-core": "1.24.1",
"@polkadot/rpc-provider": "1.24.1",
"@polkadot/types": "1.24.1",
"@polkadot/util": "^2.18.1",
"@polkadot/util-crypto": "^2.18.1",
"bn.js": "^5.1.2",
"memoizee": "^0.4.14",
"rxjs": "^6.5.5"
"rxjs": "^6.6.0"
},
"devDependencies": {
"@polkadot/keyring": "^2.15.1"
"@polkadot/keyring": "^2.18.1"
}
}
+17 -6
View File
@@ -16,6 +16,8 @@ import { memo } from '../util';
const enumsetSize = ENUMSET_SIZE.toNumber();
let indicesCache: AccountIndexes | null = null;
function queryEnumSet (api: ApiInterfaceRx): Observable<AccountIndexes> {
return api.query.indices.nextEnumSet<AccountIndex>().pipe(
// use the nextEnumSet (which is a counter of the number of sets) to construct
@@ -72,11 +74,20 @@ function queryAccounts (api: ApiInterfaceRx): Observable<AccountIndexes> {
*/
export function indexes (api: ApiInterfaceRx): () => Observable<AccountIndexes> {
return memo((): Observable<AccountIndexes> =>
(api.query.indices
? isFunction(api.query.indices.accounts)
? queryAccounts(api)
: queryEnumSet(api)
: of({} as AccountIndexes)
).pipe(startWith({}))
indicesCache
? of(indicesCache)
: (
api.query.indices
? isFunction(api.query.indices.accounts)
? queryAccounts(api).pipe(startWith({}))
: queryEnumSet(api).pipe(startWith({}))
: of({} as AccountIndexes)
).pipe(
map((indices): AccountIndexes => {
indicesCache = indices;
return indices;
})
)
);
}
+11 -15
View File
@@ -20,15 +20,17 @@ type Result = [DeriveBalancesAccount, BlockNumber, ResultBalance];
function calcBalances (api: ApiInterfaceRx, [{ accountId, accountNonce, freeBalance, frozenFee, frozenMisc, reservedBalance, votingBalance }, bestNumber, [vesting, locks]]: Result): DeriveBalancesAll {
let lockedBalance = api.registry.createType('Balance');
let lockedBreakdown: (BalanceLock | BalanceLockTo212)[] = [];
let vestingLocked = api.registry.createType('Balance');
let allLocked = false;
if (Array.isArray(locks)) {
// only get the locks that are valid until passed the current block
lockedBreakdown = (locks as BalanceLockTo212[]).filter(({ until }): boolean => !until || (bestNumber && until.gt(bestNumber)));
const notAll = lockedBreakdown.filter(({ amount }): boolean => !amount.isMax());
const notAll = lockedBreakdown.filter(({ amount }) => !amount.isMax());
allLocked = lockedBreakdown.some(({ amount }): boolean => amount.isMax());
allLocked = lockedBreakdown.some(({ amount }) => amount.isMax());
vestingLocked = api.registry.createType('Balance', lockedBreakdown.filter(({ id }) => id.eq('0x76657374696e6720')).reduce((result: BN, { amount }) => result.iadd(amount), new BN(0)));
// get the maximum of the locks according to https://github.com/paritytech/substrate/blob/master/srml/balances/src/lib.rs#L699
if (notAll.length) {
@@ -41,19 +43,11 @@ function calcBalances (api: ApiInterfaceRx, [{ accountId, accountNonce, freeBala
// - perBlock is the unlock amount
const { locked: vestingTotal, perBlock, startingBlock } = vesting || api.registry.createType('VestingInfo');
const isStarted = bestNumber.gt(startingBlock);
const vestedBalance = api.registry.createType('Balance', isStarted ? perBlock.mul(bestNumber.sub(startingBlock)) : 0);
const isVesting = isStarted && vestedBalance.lt(vestingTotal);
// The available balance & vested has an interplay here
// "
// vesting is a guarantee that the account's balance will never go below a certain amount. so it functions in the opposite way, a bit like a lock that is monotonically decreasing rather than a liquid amount that is monotonically increasing.
// locks function as the same guarantee - that a balance will not be lower than a particular amount.
// because of this you can see that if there is a "vesting lock" that guarantees the balance cannot go below 200, and a "staking lock" that guarantees the balance cannot drop below 300, then we just have two guarantees of which the first is irrelevant.
// i.e. (balance >= 200 && balance >= 300) == (balance >= 300)
// ""
const floating = freeBalance.sub(lockedBalance);
const extraReceived = isVesting ? freeBalance.sub(vestingTotal) : new BN(0);
const availableBalance = api.registry.createType('Balance', allLocked ? 0 : bnMax(new BN(0), isVesting && floating.gt(vestedBalance) ? vestedBalance.add(extraReceived) : floating));
const vestedNow = isStarted ? perBlock.mul(bestNumber.sub(startingBlock)) : new BN(0);
const vestedBalance = vestedNow.gt(vestingTotal) ? vestingTotal : api.registry.createType('Balance', vestedNow);
const isVesting = isStarted && !vestingLocked.isZero();
const vestedClaimable = api.registry.createType('Balance', isVesting ? vestingLocked.sub(vestingTotal.sub(vestedBalance)) : 0);
const availableBalance = api.registry.createType('Balance', allLocked ? 0 : bnMax(new BN(0), freeBalance.sub(lockedBalance)));
return {
accountId,
@@ -67,6 +61,8 @@ function calcBalances (api: ApiInterfaceRx, [{ accountId, accountNonce, freeBala
lockedBreakdown,
reservedBalance,
vestedBalance,
vestedClaimable,
vestingLocked,
vestingTotal,
votingBalance
};
+3 -3
View File
@@ -82,15 +82,15 @@ function calcVotesPrev (votesFor: DeriveReferendumVote[]): DeriveReferendumVoteS
if (vote.isAye) {
state.allAye.push(derived);
state.voteCountAye++;
state.votedAye = state.votedAye.add(counted);
state.votedAye.iadd(counted);
} else {
state.allNay.push(derived);
state.voteCountNay++;
state.votedNay = state.votedNay.add(counted);
state.votedNay.iadd(counted);
}
state.voteCount++;
state.votedTotal = state.votedTotal.add(counted);
state.votedTotal.iadd(counted);
return state;
}, {
+2 -2
View File
@@ -17,9 +17,9 @@ type ResultSlots = [u64, u64, u64, Option<SessionIndex>];
type ResultSlotsFlat = [u64, u64, u64, SessionIndex];
function createDerive (api: ApiInterfaceRx, info: DeriveSessionInfo, [currentSlot, epochIndex, epochOrGenesisStartSlot, activeEraStartSessionIndex]: ResultSlotsFlat): DeriveSessionProgress {
const epochStartSlot = epochIndex.mul(info.sessionLength).add(epochOrGenesisStartSlot);
const epochStartSlot = epochIndex.mul(info.sessionLength).iadd(epochOrGenesisStartSlot);
const sessionProgress = currentSlot.sub(epochStartSlot);
const eraProgress = info.currentIndex.sub(activeEraStartSessionIndex).mul(info.sessionLength).add(sessionProgress);
const eraProgress = info.currentIndex.sub(activeEraStartSessionIndex).imul(info.sessionLength).iadd(sessionProgress);
return {
...info,
+23 -23
View File
@@ -21,7 +21,7 @@ function groupByEra (list: UnlockChunk[]): Record<string, BN> {
map[key] = !map[key]
? value.unwrap()
: map[key].add(value.unwrap());
: map[key].iadd(value.unwrap());
return map;
}, {});
@@ -32,8 +32,8 @@ function calculateUnlocking (api: ApiInterfaceRx, stakingLedger: StakingLedger |
return undefined;
}
const unlockingChunks = stakingLedger.unlocking.filter(({ era }): boolean =>
era.unwrap().sub(sessionInfo.activeEra).gtn(0)
const unlockingChunks = stakingLedger.unlocking.filter(({ era }) =>
era.unwrap().gt(sessionInfo.activeEra)
);
if (!unlockingChunks.length) {
@@ -43,11 +43,13 @@ function calculateUnlocking (api: ApiInterfaceRx, stakingLedger: StakingLedger |
// group the unlock chunks that have the same era and sum their values
const groupedResult = groupByEra(unlockingChunks);
const results = Object.entries(groupedResult).map(([eraString, value]): DeriveUnlocking => ({
remainingEras: new BN(eraString).sub(sessionInfo.activeEra),
remainingEras: new BN(eraString).isub(sessionInfo.activeEra),
value: api.registry.createType('Balance', value)
}));
return results.length ? results : undefined;
return results.length
? results
: undefined;
}
function redeemableSum (api: ApiInterfaceRx, stakingLedger: StakingLedger | undefined, sessionInfo: DeriveSessionInfo): Balance {
@@ -57,7 +59,7 @@ function redeemableSum (api: ApiInterfaceRx, stakingLedger: StakingLedger | unde
return api.registry.createType('Balance', stakingLedger.unlocking.reduce((total, { era, value }): BN => {
return sessionInfo.activeEra.gte(era.unwrap())
? total.add(value.unwrap())
? total.iadd(value.unwrap())
: total;
}, new BN(0)));
}
@@ -70,6 +72,21 @@ function parseResult (api: ApiInterfaceRx, sessionInfo: DeriveSessionInfo, query
};
}
/**
* @description From a list of stashes, fill in all the relevant staking details
*/
export function accounts (api: ApiInterfaceRx): (accountIds: (Uint8Array | string)[]) => Observable<DeriveStakingAccount[]> {
return memo((accountIds: (Uint8Array | string)[]): Observable<DeriveStakingAccount[]> =>
api.derive.session.info().pipe(
switchMap((sessionInfo) =>
api.derive.staking.queryMulti(accountIds).pipe(
map((queries) => queries.map((query) => parseResult(api, sessionInfo, query)))
)
)
)
);
}
/**
* @description From a stash, retrieve the controllerId and fill in all the relevant staking details
*/
@@ -80,20 +97,3 @@ export function account (api: ApiInterfaceRx): (accountId: Uint8Array | string)
)
);
}
/**
* @description From a list of stashes, fill in all the relevant staking details
*/
export function accounts (api: ApiInterfaceRx): (accountIds: (Uint8Array | string)[]) => Observable<DeriveStakingAccount[]> {
return memo((accountIds: (Uint8Array | string)[]): Observable<DeriveStakingAccount[]> =>
api.derive.session.info().pipe(
switchMap((sessionInfo) =>
api.derive.staking.queryMulti(accountIds).pipe(
map((queries) =>
queries.map((query) => parseResult(api, sessionInfo, query))
)
)
)
)
);
}
@@ -12,8 +12,8 @@ import { Option, u32 } from '@polkadot/types';
import { memo } from '../util';
export function erasHistoric (api: ApiInterfaceRx): (withActive?: boolean) => Observable<EraIndex[]> {
return memo((withActive?: boolean): Observable<EraIndex[]> =>
export function erasHistoric (api: ApiInterfaceRx): (withActive: boolean) => Observable<EraIndex[]> {
return memo((withActive: boolean): Observable<EraIndex[]> =>
api.query.staking?.activeEra
? api.queryMulti<[Option<ActiveEraInfo>, u32]>([
api.query.staking.activeEra,
@@ -52,7 +52,7 @@ function parseRewards (api: ApiInterfaceRx, stashId: AccountId, [, erasPoints, e
: ZERO;
}
value = avail.sub(valCut).mul(staked).div(expTotal).add(validatorId === stakerId ? valCut : ZERO);
value = avail.sub(valCut).imul(staked).div(expTotal).iadd(validatorId === stakerId ? valCut : ZERO);
}
validators[validatorId] = {
@@ -199,14 +199,18 @@ export function stakerRewards (api: ApiInterfaceRx): (accountId: Uint8Array | st
);
}
export function stakerRewardsMulti (api: ApiInterfaceRx): (accountIds: (Uint8Array | string)[], withActive?: boolean) => Observable<DeriveStakerReward[][]> {
return memo((accountIds: (Uint8Array | string)[], withActive = false): Observable<DeriveStakerReward[][]> =>
accountIds.length
? api.derive.staking.erasHistoric(withActive).pipe(
switchMap((eras) =>
combineLatest(accountIds.map((acc) => api.derive.staking._stakerRewards(acc, eras, withActive)))
)
)
export function stakerRewardsMultiEras (api: ApiInterfaceRx): (accountIds: (Uint8Array | string)[], eras: EraIndex[]) => Observable<DeriveStakerReward[][]> {
return memo((accountIds: (Uint8Array | string)[], eras: EraIndex[]): Observable<DeriveStakerReward[][]> =>
accountIds.length && eras.length
? combineLatest(accountIds.map((acc) => api.derive.staking._stakerRewards(acc, eras, false)))
: of([])
);
}
export function stakerRewardsMulti (api: ApiInterfaceRx): (accountIds: (Uint8Array | string)[], withActive?: boolean) => Observable<DeriveStakerReward[][]> {
return memo((accountIds: (Uint8Array | string)[], withActive = false): Observable<DeriveStakerReward[][]> =>
api.derive.staking.erasHistoric(withActive).pipe(
switchMap((eras) => api.derive.staking.stakerRewardsMultiEras(accountIds, eras))
)
);
}
@@ -18,7 +18,7 @@ export function nextElected (api: ApiInterfaceRx): () => Observable<AccountId[]>
// only populate for next era in the last session, so track both here - entries are not
// subscriptions, so we need a trigger - currentIndex acts as that trigger to refresh
switchMap(({ currentEra }) => api.query.staking.erasStakers.keys(currentEra)),
map((keys) => keys.map((key): AccountId => key.args[1] as AccountId))
map((keys) => keys.map((key) => key.args[1] as AccountId))
)
: api.query.staking.currentElected<AccountId[]>()
);
+3 -3
View File
@@ -20,7 +20,7 @@ interface Result {
function latestNonce (api: ApiInterfaceRx, address: string): Observable<Index> {
return api.derive.balances.account(address).pipe(
map(({ accountNonce }): Index => accountNonce)
map(({ accountNonce }) => accountNonce)
);
}
@@ -31,7 +31,7 @@ function signingHeader (api: ApiInterfaceRx): Observable<Header> {
switchMap((hash) => api.rpc.chain.getHeader(hash))
)
]).pipe(
map(([current, finalized]): Header =>
map(([current, finalized]) =>
// determine the hash to use, current when lag > max, else finalized
current.number.unwrap().sub(finalized.number.unwrap()).gt(MAX_FINALITY_LAG)
? current
@@ -57,7 +57,7 @@ export function signingInfo (api: ApiInterfaceRx): (address: string, nonce?: Any
header,
mortalLength: MORTAL_PERIOD
.div(api.consts.babe?.expectedBlockTime || api.consts.timestamp?.minimumPeriod.muln(2) || FALLBACK_PERIOD)
.add(MAX_FINALITY_LAG)
.iadd(MAX_FINALITY_LAG)
.toNumber(),
nonce
}))
+2
View File
@@ -31,6 +31,8 @@ export interface DeriveBalancesAll extends DeriveBalancesAccount {
availableBalance: Balance;
votingBalance: Balance;
vestedBalance: Balance;
vestedClaimable: Balance;
vestingLocked: Balance;
vestingTotal: Balance;
}
+9 -9
View File
@@ -3,15 +3,11 @@
// of the Apache-2.0 license. See the LICENSE file for details.v
import createMemo from 'memoizee';
import { Observable, Observer } from 'rxjs';
import { Observable, Observer, TeardownLogic } from 'rxjs';
import { drr } from '@polkadot/rpc-core/rxjs';
type ObsFn <T> = (...params: any[]) => Observable<T>;
// Normalize via JSON.stringify, allow e.g. AccountId -> ss58
// eslint-disable-next-line @typescript-eslint/unbound-method
const normalizer = JSON.stringify;
// Wraps a derive, doing 2 things to optimize calls -
// 1. creates a memo of the inner fn -> Observable, removing when unsubscribed
// 2. wraps the observable in a drr() (which includes an unsub delay)
@@ -19,15 +15,19 @@ const normalizer = JSON.stringify;
export function memo <T> (inner: ObsFn<T>): ObsFn<T> {
const cached = createMemo(
(...params: any[]): Observable<T> =>
new Observable((observer: Observer<T>): VoidCallback => {
const sub = inner(...params).subscribe(observer);
new Observable((observer: Observer<T>): TeardownLogic => {
const subscription = inner(...params).subscribe(observer);
return (): void => {
cached.delete(...params);
sub.unsubscribe();
subscription.unsubscribe();
};
}).pipe(drr()),
{ normalizer }
{
// Normalize via JSON.stringify, allow e.g. AccountId -> ss58
// eslint-disable-next-line @typescript-eslint/unbound-method
normalizer: JSON.stringify
}
);
return cached;
+13 -13
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/api",
"version": "1.20.1",
"version": "1.24.1",
"description": "Promise and RxJS wrappers around the Polkadot JS RPC",
"main": "index.js",
"keywords": [
@@ -26,21 +26,21 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/api-derive": "1.20.1",
"@polkadot/keyring": "^2.15.1",
"@polkadot/metadata": "1.20.1",
"@polkadot/rpc-core": "1.20.1",
"@polkadot/rpc-provider": "1.20.1",
"@polkadot/types": "1.20.1",
"@polkadot/types-known": "1.20.1",
"@polkadot/util": "^2.15.1",
"@polkadot/util-crypto": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/api-derive": "1.24.1",
"@polkadot/keyring": "^2.18.1",
"@polkadot/metadata": "1.24.1",
"@polkadot/rpc-core": "1.24.1",
"@polkadot/rpc-provider": "1.24.1",
"@polkadot/types": "1.24.1",
"@polkadot/types-known": "1.24.1",
"@polkadot/util": "^2.18.1",
"@polkadot/util-crypto": "^2.18.1",
"bn.js": "^5.1.2",
"eventemitter3": "^4.0.4",
"rxjs": "^6.5.5"
"rxjs": "^6.6.0"
},
"devDependencies": {
"@polkadot/keyring": "^2.15.1"
"@polkadot/keyring": "^2.18.1"
}
}
+9 -9
View File
@@ -6,25 +6,25 @@ import { Option, U8aFixed, Vec } from '@polkadot/types/codec';
import { Bytes, Data, bool, u32, u64 } from '@polkadot/types/primitive';
import { UncleEntryItem } from '@polkadot/types/interfaces/authorship';
import { BabeAuthorityWeight, MaybeRandomness, NextConfigDescriptor, Randomness } from '@polkadot/types/interfaces/babe';
import { AccountData, BalanceLock, ReleasesBalances } from '@polkadot/types/interfaces/balances';
import { AccountData, BalanceLock } from '@polkadot/types/interfaces/balances';
import { ProposalIndex, Votes } from '@polkadot/types/interfaces/collective';
import { AuthorityId } from '@polkadot/types/interfaces/consensus';
import { CodeHash, ContractInfo, PrefabWasmModule, Schedule } from '@polkadot/types/interfaces/contracts';
import { PreimageStatus, PropIndex, Proposal, ReferendumIndex, ReferendumInfo, ReleasesDemocracy, Voting } from '@polkadot/types/interfaces/democracy';
import { PreimageStatus, PropIndex, Proposal, ReferendumIndex, ReferendumInfo, Voting } from '@polkadot/types/interfaces/democracy';
import { VoteThreshold } from '@polkadot/types/interfaces/elections';
import { SetId, StoredPendingChange, StoredState } from '@polkadot/types/interfaces/grandpa';
import { RegistrarInfo, Registration } from '@polkadot/types/interfaces/identity';
import { AuthIndex } from '@polkadot/types/interfaces/imOnline';
import { DeferredOffenceOf, Kind, OffenceDetails, OpaqueTimeSlot, ReportIdOf } from '@polkadot/types/interfaces/offences';
import { ActiveRecovery, RecoveryConfig } from '@polkadot/types/interfaces/recovery';
import { AccountId, AccountIndex, Balance, BalanceOf, BlockNumber, ExtrinsicsWeight, Hash, KeyTypeId, Moment, Perbill, ProxyType, ValidatorId } from '@polkadot/types/interfaces/runtime';
import { AccountId, AccountIndex, Balance, BalanceOf, BlockNumber, ExtrinsicsWeight, Hash, KeyTypeId, Moment, Perbill, ProxyType, Releases, ValidatorId } from '@polkadot/types/interfaces/runtime';
import { Scheduled, TaskAddress } from '@polkadot/types/interfaces/scheduler';
import { Keys, SessionIndex } from '@polkadot/types/interfaces/session';
import { Bid, BidKind, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces/society';
import { ActiveEraInfo, ElectionResult, ElectionScore, ElectionStatus, EraIndex, EraRewardPoints, Exposure, Forcing, Nominations, ReleasesStaking, RewardDestination, SlashingSpans, SpanIndex, SpanRecord, StakingLedger, UnappliedSlash, ValidatorPrefs } from '@polkadot/types/interfaces/staking';
import { ActiveEraInfo, ElectionResult, ElectionScore, ElectionStatus, EraIndex, EraRewardPoints, Exposure, Forcing, Nominations, RewardDestination, SlashingSpans, SpanIndex, SpanRecord, StakingLedger, UnappliedSlash, ValidatorPrefs } from '@polkadot/types/interfaces/staking';
import { AccountInfo, DigestOf, EventIndex, EventRecord, LastRuntimeUpgradeInfo, Phase } from '@polkadot/types/interfaces/system';
import { OpenTip, TreasuryProposal } from '@polkadot/types/interfaces/treasury';
import { Multiplier, PaymentReleases } from '@polkadot/types/interfaces/txpayment';
import { Multiplier } from '@polkadot/types/interfaces/txpayment';
import { Multisig } from '@polkadot/types/interfaces/utility';
import { VestingInfo } from '@polkadot/types/interfaces/vesting';
import { ApiTypes } from '@polkadot/api/types';
@@ -134,7 +134,7 @@ declare module '@polkadot/api/types/storage' {
*
* This is set to v2.0.0 for new networks.
**/
storageVersion: AugmentedQuery<ApiType, () => Observable<ReleasesBalances>> & QueryableStorageEntry<ApiType>;
storageVersion: AugmentedQuery<ApiType, () => Observable<Releases>> & QueryableStorageEntry<ApiType>;
/**
* The total units issued in the system.
**/
@@ -262,7 +262,7 @@ declare module '@polkadot/api/types/storage' {
*
* New networks start with last version.
**/
storageVersion: AugmentedQuery<ApiType, () => Observable<Option<ReleasesDemocracy>>> & QueryableStorageEntry<ApiType>;
storageVersion: AugmentedQuery<ApiType, () => Observable<Option<Releases>>> & QueryableStorageEntry<ApiType>;
/**
* All votes for a particular voter. We store the balance for the number of votes that we
* have recorded. The second item is the total amount of delegations, that will be added.
@@ -752,7 +752,7 @@ declare module '@polkadot/api/types/storage' {
*
* This is set to v3.0.0 for new networks.
**/
storageVersion: AugmentedQuery<ApiType, () => Observable<ReleasesStaking>> & QueryableStorageEntry<ApiType>;
storageVersion: AugmentedQuery<ApiType, () => Observable<Releases>> & QueryableStorageEntry<ApiType>;
/**
* All unapplied slashes that are queued for later.
**/
@@ -903,7 +903,7 @@ declare module '@polkadot/api/types/storage' {
transactionPayment: {
[index: string]: QueryableStorageEntry<ApiType>;
nextFeeMultiplier: AugmentedQuery<ApiType, () => Observable<Multiplier>> & QueryableStorageEntry<ApiType>;
storageVersion: AugmentedQuery<ApiType, () => Observable<PaymentReleases>> & QueryableStorageEntry<ApiType>;
storageVersion: AugmentedQuery<ApiType, () => Observable<Releases>> & QueryableStorageEntry<ApiType>;
};
treasury: {
[index: string]: QueryableStorageEntry<ApiType>;
+2 -2
View File
@@ -9,7 +9,7 @@ import { CodeHash, Gas, Schedule } from '@polkadot/types/interfaces/contracts';
import { AccountVote, Conviction, PropIndex, Proposal, ReferendumIndex } from '@polkadot/types/interfaces/democracy';
import { DefunctVoter, Renouncing } from '@polkadot/types/interfaces/elections';
import { Extrinsic, Signature } from '@polkadot/types/interfaces/extrinsics';
import { EquivocationProof, KeyOwnerProof } from '@polkadot/types/interfaces/grandpa';
import { GrandpaEquivocationProof, KeyOwnerProof } from '@polkadot/types/interfaces/grandpa';
import { IdentityFields, IdentityInfo, IdentityJudgement, RegistrarIndex } from '@polkadot/types/interfaces/identity';
import { Heartbeat } from '@polkadot/types/interfaces/imOnline';
import { AccountId, AccountIndex, Address, Balance, BalanceOf, BlockNumber, Call, ChangesTrieConfiguration, Hash, Header, KeyValue, LookupSource, Moment, Perbill, Percent, ProxyType, Weight } from '@polkadot/types/interfaces/runtime';
@@ -878,7 +878,7 @@ declare module '@polkadot/api/types/submittable' {
* submission of invalid equivocation reports, a mandatory pre-validation of
* the extrinsic is implemented in a `SignedExtension`.
**/
reportEquivocation: AugmentedSubmittable<(equivocationProof: EquivocationProof | { setId?: any; equivocation?: any } | string | Uint8Array, keyOwnerProof: KeyOwnerProof | { session?: any; trieNodes?: any; validatorCount?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
reportEquivocation: AugmentedSubmittable<(equivocationProof: GrandpaEquivocationProof | { setId?: any; equivocation?: any } | string | Uint8Array, keyOwnerProof: KeyOwnerProof | { session?: any; trieNodes?: any; validatorCount?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
};
identity: {
[index: string]: SubmittableExtrinsicFunction<ApiType>;
+29 -28
View File
@@ -145,7 +145,7 @@ export default abstract class Decorate<ApiType extends ApiTypes> extends Events
/**
* @description Creates an instance of a type as registered
*/
public createType <K extends keyof InterfaceTypes> (type: K, ...params: any[]): InterfaceTypes[K] {
public createType <K extends keyof InterfaceTypes> (type: K, ...params: unknown[]): InterfaceTypes[K] {
return this.registry.createType(type, ...params);
}
@@ -320,68 +320,50 @@ export default abstract class Decorate<ApiType extends ApiTypes> extends Events
private _decorateStorageEntry<ApiType extends ApiTypes> (creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>): QueryableStorageEntry<ApiType> {
// get the storage arguments, with DoubleMap as an array entry, otherwise spread
const getArgs = (...args: any[]): any[] => extractStorageArgs(creator, args);
const getArgs = (...args: unknown[]): unknown[] => extractStorageArgs(creator, args);
// Disable this where it occurs for each field we are decorating
/* eslint-disable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */
// FIXME We probably want to be able to query the full list with non-subs as well
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const decorated = this.hasSubscriptions && creator.iterKey && creator.meta.type.isMap && creator.meta.type.asMap.linked.isTrue
? this._decorateStorageLinked(creator, decorateMethod)
: decorateMethod((...args: any[]): Observable<Codec> => (
this.hasSubscriptions
? this._rpcCore.state
// Unfortunately for one-shot calls we also use .subscribeStorage here
.subscribeStorage<[Codec]>([getArgs(...args)])
// state_storage returns an array of values, since we have just subscribed to
// a single entry, we pull that from the array and return it as-is
.pipe(map(([data]): Codec => data))
: this._rpcCore.state.getStorage(getArgs(...args))
), { methodName: creator.method });
: this._decorateStorageCall(creator, decorateMethod);
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
decorated.creator = creator;
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.at = decorateMethod((hash: Hash, arg1?: Arg, arg2?: Arg): Observable<Codec> =>
this._rpcCore.state.getStorage(getArgs(arg1, arg2), hash));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.hash = decorateMethod((arg1?: Arg, arg2?: Arg): Observable<Hash> =>
this._rpcCore.state.getStorageHash(getArgs(arg1, arg2)));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
decorated.key = (arg1?: Arg, arg2?: Arg): string =>
u8aToHex(compactStripLength(creator(creator.meta.type.isDoubleMap ? [arg1, arg2] : arg1))[1]);
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
decorated.keyPrefix = (key1?: Arg): string =>
u8aToHex(creator.keyPrefix(key1));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.range = decorateMethod((range: [Hash, Hash?], arg1?: Arg, arg2?: Arg): Observable<[Hash, Codec][]> =>
this._decorateStorageRange(decorated, [arg1, arg2], range));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.size = decorateMethod((arg1?: Arg, arg2?: Arg): Observable<u64> =>
this._rpcCore.state.getStorageSize(getArgs(arg1, arg2)));
// .keys() & .entries() only available on map types
if (creator.iterKey && (creator.meta.type.isMap || creator.meta.type.isDoubleMap)) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.entries = decorateMethod(
memo((doubleMapArg?: Arg): Observable<[StorageKey, Codec][]> =>
this._retrieveMapEntries(creator, doubleMapArg)));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.entriesPaged = decorateMethod(
memo((opts: PaginationOptions): Observable<[StorageKey, Codec][]> =>
this._retrieveMapEntriesPaged(creator, opts)));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.keys = decorateMethod(
memo((doubleMapArg?: Arg): Observable<StorageKey[]> =>
this._retrieveMapKeys(creator, doubleMapArg)));
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.keysPaged = decorateMethod(
memo((opts: PaginationOptions): Observable<StorageKey[]> =>
this._retrieveMapKeysPaged(creator, opts)));
@@ -390,15 +372,32 @@ export default abstract class Decorate<ApiType extends ApiTypes> extends Events
// only support multi where subs are available
if (this.hasSubscriptions) {
// When using double map storage function, user need to pass double map key as an array
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
decorated.multi = decorateMethod((args: (Arg | Arg[])[]): Observable<Codec[]> =>
this._rpcCore.state.subscribeStorage(
args.map((arg: Arg[] | Arg): [StorageEntry, Arg | Arg[]] => [creator, arg])));
}
/* eslint-enable @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment */
return this._decorateFunctionMeta(creator as any, decorated) as unknown as QueryableStorageEntry<ApiType>;
}
// Decorate the base storage call. In the case or rxjs or promise-without-callback (await)
// we make a subscription, alternatively we push this through a single-shot query
private _decorateStorageCall<ApiType extends ApiTypes> (creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>): ReturnType<DecorateMethod<ApiType>> {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return decorateMethod((...args: unknown[]): Observable<Codec> => {
return this.hasSubscriptions
? this._rpcCore.state.subscribeStorage<[Codec]>([extractStorageArgs(creator, args)]).pipe(
map(([data]) => data) // extract first/only result from list
)
: this._rpcCore.state.getStorage(extractStorageArgs(creator, args));
}, {
methodName: creator.method,
overrideNoSub: (...args: unknown[]) => this._rpcCore.state.getStorage(extractStorageArgs(creator, args))
});
}
private _decorateStorageRange<ApiType extends ApiTypes> (decorated: QueryableStorageEntry<ApiType>, args: [Arg?, Arg?], range: [Hash, Hash?]): Observable<[Hash, Codec][]> {
const outputType = unwrapStorageType(decorated.creator.meta.type, decorated.creator.meta.modifier.isOptional);
@@ -412,6 +411,8 @@ export default abstract class Decorate<ApiType extends ApiTypes> extends Events
));
}
// This is deprecated/removed on substrate - we still have some live chains, eg. Edgeware needing it, so it
// has not been dropped yet. Slated for removal in API 2.0
private _decorateStorageLinked<ApiType extends ApiTypes> (creator: StorageEntry, decorateMethod: DecorateMethod<ApiType>): ReturnType<DecorateMethod<ApiType>> {
const result = new Map<Codec, ITuple<[Codec, Linkage<Codec>]> | null>();
let subject: BehaviorSubject<LinkageResult>;
@@ -477,15 +478,15 @@ export default abstract class Decorate<ApiType extends ApiTypes> extends Events
// this handles the case where the head changes effectively, i.e. a new entry
// appears at the top of the list, the new getNext gets kicked off
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return decorateMethod((...args: any[]): Observable<LinkageResult | [Codec, Linkage<Codec>]> =>
return decorateMethod((...args: unknown[]): Observable<LinkageResult | [Codec, Linkage<Codec>]> =>
args.length
? this._rpcCore.state
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
.subscribeStorage<[[Codec, Linkage<Codec>]]>([[creator, ...args]])
.pipe(map(([data]): [Codec, Linkage<Codec>] => data))
.pipe(map(([data]) => data))
: this._rpcCore.state
.subscribeStorage<[LinkageResult]>([iterKey()])
.pipe(switchMap(([key]): Observable<LinkageResult> => getNext(head = key)))
.pipe(switchMap(([key]) => getNext(head = key)))
);
}
+55 -37
View File
@@ -6,27 +6,26 @@ import { Callback, Codec } from '@polkadot/types/types';
import { ApiOptions, DecorateFn, DecorateMethodOptions, ObsInnerType, StorageEntryPromiseOverloads, UnsubscribePromise, VoidFn } from '../types';
import { EMPTY, Observable, Subscription } from 'rxjs';
import { catchError, first, tap } from 'rxjs/operators';
import { catchError, tap } from 'rxjs/operators';
import { isFunction, assert } from '@polkadot/util';
import ApiBase from '../base';
import Combinator, { CombinatorCallback, CombinatorFunction } from './Combinator';
interface Tracker {
interface Tracker<T> {
reject: (value: Error) => Observable<never>;
resolve: (value: () => void) => void;
resolve: (value: T) => void;
}
// extract the arguments and callback params from a value array possibly containing a callback
function extractArgs (args: any[], needsCallback: boolean): [any[], Callback<Codec> | undefined] {
function extractArgs (args: unknown[], needsCallback: boolean): [unknown[], Callback<Codec> | undefined] {
let callback: Callback<Codec> | undefined;
const actualArgs = args.slice();
// If the last arg is a function, we pop it, put it into callback.
// actualArgs will then hold the actual arguments to be passed to `method`
if (args.length && isFunction(args[args.length - 1])) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
callback = actualArgs.pop();
callback = actualArgs.pop() as Callback<Codec>;
}
// When we need a subscription, ensure that a valid callback is actually passed
@@ -36,56 +35,75 @@ function extractArgs (args: any[], needsCallback: boolean): [any[], Callback<Cod
}
// a Promise completion tracker, wrapping an isComplete variable that ensures the promise only resolves once
function promiseTracker (resolve: (value: VoidFn) => void, reject: (value: Error) => void): Tracker {
function promiseTracker<T> (resolve: (value: T) => void, reject: (value: Error) => void): Tracker<T> {
let isCompleted = false;
// eslint-disable-next-line @typescript-eslint/ban-types
const complete = (fn: Function, value: any): void => {
if (!isCompleted) {
isCompleted = true;
fn(value);
}
};
return {
reject: (error: Error): Observable<never> => {
complete(reject, error);
if (!isCompleted) {
isCompleted = true;
reject(error);
}
return EMPTY;
},
resolve: (value: any): void => {
complete(resolve, value);
resolve: (value: T): void => {
if (!isCompleted) {
isCompleted = true;
resolve(value);
}
}
};
}
// Decorate a call for a single-shot result - retrieve and then immediate unsubscribe
function decorateCall<Method extends DecorateFn<ObsInnerType<ReturnType<Method>>>> (method: Method, actualArgs: unknown[]): Promise<ObsInnerType<ReturnType<Method>>> {
return new Promise((resolve, reject): void => {
// single result tracker - either reject with Error or resolve with Codec result
const tracker = promiseTracker(resolve, reject);
// errors reject immediately, any result unsubscribes and resolves
const subscription: Subscription = method(...actualArgs).pipe(
catchError((error) => tracker.reject(error))
).subscribe((result): void => {
tracker.resolve(result);
setImmediate(() => subscription.unsubscribe());
});
});
}
// Decorate a subscription where we have a result callback specified
function decorateSubscribe<Method extends DecorateFn<ObsInnerType<ReturnType<Method>>>> (method: Method, actualArgs: unknown[], resultCb: Callback<Codec>): UnsubscribePromise {
return new Promise<VoidFn>((resolve, reject): void => {
// either reject with error or resolve with unsubscribe callback
const tracker = promiseTracker(resolve, reject);
// errors reject immediately, the first result resolves with an unsubscribe promise, all results via callback
const subscription: Subscription = method(...actualArgs).pipe(
catchError((error) => tracker.reject(error)),
tap(() => tracker.resolve(() => subscription.unsubscribe()))
).subscribe((result): void => {
// We use setImmediate here to ensure that the Promise above (tracker) has resolved, before returning
// the first result. By putting is back in the queue, the promise above is guarded for first execution
setImmediate(() => resultCb(result) as void);
});
});
}
/**
* @description Decorate method for ApiPromise, where the results are converted to the Promise equivalent
*/
export function decorateMethod<Method extends DecorateFn<ObsInnerType<ReturnType<Method>>>> (method: Method, options?: DecorateMethodOptions): StorageEntryPromiseOverloads {
const needsCallback = options && options.methodName && options.methodName.includes('subscribe');
return function (...args: any[]): Promise<ObsInnerType<ReturnType<Method>>> | UnsubscribePromise {
return function (...args: unknown[]): Promise<ObsInnerType<ReturnType<Method>>> | UnsubscribePromise {
const [actualArgs, resultCb] = extractArgs(args, !!needsCallback);
if (!resultCb) {
return method(...actualArgs).pipe(first()).toPromise();
}
return new Promise<VoidFn>((resolve, reject): void => {
const tracker = promiseTracker(resolve, reject);
const subscription: Subscription = method(...actualArgs).pipe(
// if we find an error (invalid params, etc), reject the promise
catchError((error): Observable<never> => tracker.reject(error)),
// upon the first result, resolve with the unsub function
tap(() => tracker.resolve(() => subscription.unsubscribe()))
).subscribe((result): void => {
// We use setImmediate here to ensure that the Promise above (tracker) has resolved, before returning
// the first result. By putting is back in the queue, the promise above is guarder for first execution
setImmediate(() => resultCb(result) as void);
});
});
return resultCb
? decorateSubscribe(method, actualArgs, resultCb)
: decorateCall((options?.overrideNoSub as Method) || method, actualArgs);
} as StorageEntryPromiseOverloads;
}
+1
View File
@@ -68,6 +68,7 @@ export type MethodResult<ApiType extends ApiTypes, F extends AnyFunction> = ApiT
// information. This describes it.
export interface DecorateMethodOptions {
methodName?: string;
overrideNoSub?: (...args: unknown[]) => Observable<Codec>;
}
export type DecorateFn <T extends Codec> = (...args: any[]) => Observable<T>;
+4 -4
View File
@@ -32,7 +32,7 @@ function extractKeys (src: Record<string, Record<string, any>>, dst: Record<stri
}
function findSectionExcludes (a: string[], b: string[]): string[] {
return a.filter((section): boolean => !b.includes(section));
return a.filter((section) => !b.includes(section));
}
function extractSections (src: Record<string, Record<string, any>>, dst: Record<string, Record<string, any>>): StringsStrings {
@@ -49,15 +49,15 @@ function findMethodExcludes (src: Record<string, Record<string, any>>, dst: Reco
const dstSections = Object.keys(dst);
return dstSections
.filter((section): boolean => srcSections.includes(section))
.filter((section) => srcSections.includes(section))
.reduce((rmMethods: string[], section): string[] => {
const srcMethods = Object.keys(src[section]);
return rmMethods.concat(
...Object
.keys(dst[section])
.filter((method): boolean => !srcMethods.includes(method))
.map((method): string => `${section}.${method}`)
.filter((method) => !srcMethods.includes(method))
.map((method) => `${section}.${method}`)
);
}, []);
}
+1 -1
View File
@@ -24,7 +24,7 @@ export default function filterEvents (extHash: H256, { block: { extrinsics, head
return;
}
return allEvents.filter(({ phase }): boolean =>
return allEvents.filter(({ phase }) =>
// only ApplyExtrinsic has the extrinsic index
phase.isApplyExtrinsic && phase.asApplyExtrinsic.eqn(index)
);
+3 -3
View File
@@ -11,7 +11,7 @@ function sig ({ method, section }: StorageEntry, ...args: Type[]): string {
return `${section}.${method}(${args.join(', ')})`;
}
function doDoubleMap (creator: StorageEntry, args: any[]): [StorageEntry, [any, any]] {
function doDoubleMap (creator: StorageEntry, args: unknown[]): [StorageEntry, [any, any]] {
const { key1, key2 } = creator.meta.type.asDoubleMap;
assert(args.length === 2, `${sig(creator, key1, key2)} is a doublemap, requiring 2 arguments, ${args.length} found`);
@@ -20,7 +20,7 @@ function doDoubleMap (creator: StorageEntry, args: any[]): [StorageEntry, [any,
return [creator, args as [any, any]];
}
function doMap (creator: StorageEntry, args: any[]): [StorageEntry] | [StorageEntry, any] {
function doMap (creator: StorageEntry, args: unknown[]): [StorageEntry] | [StorageEntry, any] {
const { key, linked } = creator.meta.type.asMap;
linked.isTrue
@@ -35,7 +35,7 @@ function doMap (creator: StorageEntry, args: any[]): [StorageEntry] | [StorageEn
// 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
export function extractStorageArgs (creator: StorageEntry, _args: any[]): [StorageEntry, [any, any]] | [StorageEntry] | [StorageEntry, any] {
export function extractStorageArgs (creator: StorageEntry, _args: unknown[]): [StorageEntry, [any, any]] | [StorageEntry] | [StorageEntry, any] {
const args = _args.filter((arg) => !isUndefined(arg));
if (creator.meta.type.isDoubleMap) {
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/metadata",
"version": "1.20.1",
"version": "1.24.1",
"description": "Helpers to extract information from runtime metadata",
"main": "index.js",
"publishConfig": {
@@ -26,14 +26,14 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/type-metadata#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/types": "1.20.1",
"@polkadot/types-known": "1.20.1",
"@polkadot/util": "^2.15.1",
"@polkadot/util-crypto": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/types": "1.24.1",
"@polkadot/types-known": "1.24.1",
"@polkadot/util": "^2.18.1",
"@polkadot/util-crypto": "^2.18.1",
"bn.js": "^5.1.2"
},
"devDependencies": {
"@polkadot/keyring": "^2.15.1"
"@polkadot/keyring": "^2.18.1"
}
}
@@ -1285,7 +1285,7 @@
"name": "StorageVersion",
"modifier": "Default",
"type": {
"Plain": "ReleasesBalances"
"Plain": "Releases"
},
"fallback": "0x00",
"documentation": [
@@ -1595,7 +1595,7 @@
"name": "StorageVersion",
"modifier": "Default",
"type": {
"Plain": "PaymentReleases"
"Plain": "Releases"
},
"fallback": "0x00",
"documentation": []
@@ -2148,7 +2148,7 @@
"name": "StorageVersion",
"modifier": "Default",
"type": {
"Plain": "ReleasesStaking"
"Plain": "Releases"
},
"fallback": "0x03",
"documentation": [
@@ -3625,7 +3625,7 @@
"name": "StorageVersion",
"modifier": "Optional",
"type": {
"Plain": "ReleasesDemocracy"
"Plain": "Releases"
},
"fallback": "0x00",
"documentation": [
@@ -6391,7 +6391,7 @@
"args": [
{
"name": "equivocation_proof",
"type": "EquivocationProof"
"type": "GrandpaEquivocationProof"
},
{
"name": "key_owner_proof",
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/rpc-core",
"version": "1.20.1",
"version": "1.24.1",
"description": "A JavaScript wrapper for the Polkadot JsonRPC interface",
"main": "index.js",
"keywords": [
@@ -26,15 +26,15 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-core#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/metadata": "1.20.1",
"@polkadot/rpc-provider": "1.20.1",
"@polkadot/types": "1.20.1",
"@polkadot/util": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/metadata": "1.24.1",
"@polkadot/rpc-provider": "1.24.1",
"@polkadot/types": "1.24.1",
"@polkadot/util": "^2.18.1",
"memoizee": "^0.4.14",
"rxjs": "^6.5.5"
"rxjs": "^6.6.0"
},
"devDependencies": {
"@polkadot/keyring": "^2.15.1"
"@polkadot/keyring": "^2.18.1"
}
}
+11 -11
View File
@@ -12,7 +12,7 @@ import { combineLatest, from, Observable, Observer, of, throwError } from 'rxjs'
import { catchError, map, publishReplay, refCount, switchMap } from 'rxjs/operators';
import jsonrpc from '@polkadot/types/interfaces/jsonrpc';
import { Option, StorageKey, Vec, createClass, createTypeUnsafe } from '@polkadot/types';
import { assert, hexToU8a, isFunction, isNull, isNumber, isUndefined, logger, u8aToU8a } from '@polkadot/util';
import { assert, hexToU8a, isFunction, isNull, isUndefined, logger, u8aToU8a } from '@polkadot/util';
import { drr } from './rxjs';
@@ -215,7 +215,7 @@ export default class Rpc implements RpcInterface {
}
// create a subscriptor, it subscribes once and resolves with the id as subscribe
private _createSubscriber ({ paramsJson, subName, subType, update }: { subType: string; subName: string; paramsJson: AnyJson[]; update: ProviderInterfaceCallback }, errorHandler: (error: Error) => void): Promise<number> {
private _createSubscriber ({ paramsJson, subName, subType, update }: { subType: string; subName: string; paramsJson: AnyJson[]; update: ProviderInterfaceCallback }, errorHandler: (error: Error) => void): Promise<number | string> {
return new Promise((resolve, reject): void => {
this.provider
.subscribe(subType, subName, paramsJson, update)
@@ -232,11 +232,12 @@ export default class Rpc implements RpcInterface {
const subName = `${section}_${subMethod}`;
const unsubName = `${section}_${unsubMethod}`;
const subType = `${section}_${updateType}`;
let memoized: null | RpcInterfaceMethod & memoizee.Memoized<RpcInterfaceMethod> = null;
const creator = (isRaw: boolean) => (...values: any[]): Observable<any> => {
const creator = (isRaw: boolean) => (...values: unknown[]): Observable<any> => {
return new Observable((observer: Observer<any>): VoidCallback => {
// Have at least an empty promise, as used in the unsubscribe
let subscriptionPromise: Promise<number | void> = Promise.resolve();
let subscriptionPromise: Promise<number | string | null> = Promise.resolve(null);
const errorHandler = (error: Error): void => {
logErrorMessage(method, def, error);
@@ -282,22 +283,21 @@ export default class Rpc implements RpcInterface {
// api.query.system.account(addr1).subscribe(); // will output 6 instead of 7 if we don't clear cache
// // that's because all our observables are replay(1)
// ```
// eslint-disable-next-line @typescript-eslint/no-use-before-define
memoized.delete(...values);
memoized && memoized.delete(...values);
// Unsubscribe from provider
subscriptionPromise
.then((subscriptionId): Promise<boolean> =>
isNumber(subscriptionId)
? this.provider.unsubscribe(subType, unsubName, subscriptionId)
: Promise.resolve(false)
isNull(subscriptionId)
? Promise.resolve(false)
: this.provider.unsubscribe(subType, unsubName, subscriptionId)
)
.catch((error: Error): void => logErrorMessage(method, def, error));
.catch((error: Error) => logErrorMessage(method, def, error));
};
}).pipe(drr());
};
const memoized = memoizee(this._createMethodWithRaw(creator), {
memoized = memoizee(this._createMethodWithRaw(creator), {
// Dynamic length for argument
length: false,
// Normalize args so that different args that should be cached
+6 -4
View File
@@ -2,7 +2,7 @@
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { asapScheduler, ConnectableObservable, MonoTypeOperatorFunction, Observable, Subscription } from 'rxjs';
import { asapScheduler, ConnectableObservable, MonoTypeOperatorFunction, Observable, Subscription, TeardownLogic } from 'rxjs';
const DELAY = 1750;
@@ -11,7 +11,7 @@ function refCountDelayInner <T> (source: Observable<T>): Observable<T> {
// state: 0 = disconnected, 1 = disconnecting, 2 = connecting, 3 = connected
let [state, refCount, connection, scheduler] = [0, 0, Subscription.EMPTY, Subscription.EMPTY];
return new Observable((ob) => {
return new Observable((ob): TeardownLogic => {
source.subscribe(ob);
if (refCount++ === 0) {
@@ -27,12 +27,14 @@ function refCountDelayInner <T> (source: Observable<T>): Observable<T> {
return (): void => {
if (--refCount === 0) {
if (state === 2) {
state = 0; scheduler.unsubscribe();
state = 0;
scheduler.unsubscribe();
} else {
// state === 3
state = 1;
scheduler = asapScheduler.schedule((): void => {
state = 0; connection.unsubscribe();
state = 0;
connection.unsubscribe();
}, DELAY);
}
}
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/rpc-provider",
"version": "1.20.1",
"version": "1.24.1",
"description": "Transport providers for the API",
"main": "index.js",
"keywords": [
@@ -26,19 +26,19 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-provider#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/metadata": "1.20.1",
"@polkadot/types": "1.20.1",
"@polkadot/util": "^2.15.1",
"@polkadot/util-crypto": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/metadata": "1.24.1",
"@polkadot/types": "1.24.1",
"@polkadot/util": "^2.18.1",
"@polkadot/util-crypto": "^2.18.1",
"bn.js": "^5.1.2",
"eventemitter3": "^4.0.4",
"isomorphic-fetch": "^2.2.1",
"websocket": "^1.0.31"
},
"devDependencies": {
"@polkadot/keyring": "^2.15.1",
"@polkadot/keyring": "^2.18.1",
"mock-socket": "^9.0.3",
"nock": "^12.0.3"
"nock": "^13.0.2"
}
}
+2 -2
View File
@@ -49,6 +49,6 @@ export interface ProviderInterface {
isConnected (): boolean;
on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): () => void;
send (method: string, params: any[]): Promise<any>;
subscribe (type: string, method: string, params: any[], cb: ProviderInterfaceCallback): Promise<number>;
unsubscribe (type: string, method: string, id: number): Promise<boolean>;
subscribe (type: string, method: string, params: any[], cb: ProviderInterfaceCallback): Promise<number | string>;
unsubscribe (type: string, method: string, id: number | string): Promise<boolean>;
}
+3 -3
View File
@@ -247,8 +247,8 @@ export default class WsProvider implements WSProviderInterface {
* })
* ```
*/
public async subscribe (type: string, method: string, params: any[], callback: ProviderInterfaceCallback): Promise<number> {
const id = await this.send(method, params, { callback, type }) as Promise<number>;
public async subscribe (type: string, method: string, params: any[], callback: ProviderInterfaceCallback): Promise<number | string> {
const id = await this.send(method, params, { callback, type }) as Promise<number | string>;
return id;
}
@@ -256,7 +256,7 @@ export default class WsProvider implements WSProviderInterface {
/**
* @summary Allows unsubscribing to subscriptions made with [[subscribe]].
*/
public async unsubscribe (type: string, method: string, id: number): Promise<boolean> {
public async unsubscribe (type: string, method: string, id: number | string): Promise<boolean> {
const subscription = `${type}::${id}`;
// FIXME This now could happen with re-subscriptions. The issue is that with a re-sub
+11 -11
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/typegen",
"version": "1.20.1",
"version": "1.24.1",
"description": "Type generation scripts",
"main": "index.js",
"bin": {
@@ -33,20 +33,20 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/typegen#readme",
"dependencies": {
"@babel/core": "^7.10.3",
"@babel/register": "^7.10.3",
"@babel/runtime": "^7.10.3",
"@polkadot/api": "1.20.1",
"@polkadot/metadata": "1.20.1",
"@polkadot/rpc-provider": "1.20.1",
"@polkadot/types": "1.20.1",
"@polkadot/util": "^2.15.1",
"@babel/core": "^7.10.4",
"@babel/register": "^7.10.4",
"@babel/runtime": "^7.10.4",
"@polkadot/api": "1.24.1",
"@polkadot/metadata": "1.24.1",
"@polkadot/rpc-provider": "1.24.1",
"@polkadot/types": "1.24.1",
"@polkadot/util": "^2.18.1",
"handlebars": "^4.7.6",
"websocket": "^1.0.31",
"yargs": "^15.3.1"
"yargs": "^15.4.1"
},
"devDependencies": {
"@types/websocket": "^1.0.0",
"@types/websocket": "^1.0.1",
"@types/yargs": "^15.0.5"
}
}
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/types-known",
"version": "1.20.1",
"version": "1.24.1",
"description": "A JavaScript wrapper for the Polkadot JsonRPC interface",
"main": "index.js",
"keywords": [
@@ -26,9 +26,9 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/types-known#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/types": "1.20.1",
"@polkadot/util": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/types": "1.24.1",
"@polkadot/util": "^2.18.1",
"bn.js": "^5.1.2"
},
"devDependencies": {
+7 -8
View File
@@ -6,8 +6,10 @@ import { OverrideModuleType } from '@polkadot/types/types';
// type overrides for modules (where duplication between modules exist)
const typesModules: Record<string, OverrideModuleType> = {
babe: {
EquivocationProof: 'BabeEquivocationProof'
},
balances: {
Releases: 'ReleasesBalances',
Status: 'BalanceStatus'
},
contract: { // old metadata & naming
@@ -17,8 +19,9 @@ const typesModules: Record<string, OverrideModuleType> = {
contracts: {
StorageKey: 'ContractStorageKey'
},
democracy: {
Releases: 'ReleasesDemocracy'
grandpa: {
Equivocation: 'GrandpaEquivocation',
EquivocationProof: 'GrandpaEquivocationProof'
},
identity: {
Judgement: 'IdentityJudgement'
@@ -31,11 +34,7 @@ const typesModules: Record<string, OverrideModuleType> = {
Vote: 'SocietyVote'
},
staking: {
Compact: 'CompactAssignments',
Releases: 'ReleasesStaking'
},
transactionPayment: {
Releases: 'PaymentReleases'
Compact: 'CompactAssignments'
},
treasury: {
Proposal: 'TreasuryProposal'
+27 -13
View File
@@ -4,6 +4,15 @@
import { OverrideVersionedType } from '@polkadot/types/types';
const sharedTypes = {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
ProxyType: {
_enum: ['Any', 'NonTransfer', 'Governance', 'Staking', 'IdentityJudgement']
}
};
const versioned: OverrideVersionedType[] = [
{
// 1020 is first CC3
@@ -16,6 +25,7 @@ const versioned: OverrideVersionedType[] = [
Keys: 'SessionKeys5',
LookupSource: 'Address',
Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225',
ReferendumInfo: 'ReferendumInfoTo239',
SlashingSpans: 'SlashingSpansTo204',
StakingLedger: 'StakingLedgerTo223',
@@ -32,6 +42,7 @@ const versioned: OverrideVersionedType[] = [
Keys: 'SessionKeys5',
LookupSource: 'Address',
Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225',
ReferendumInfo: 'ReferendumInfoTo239',
SlashingSpans: 'SlashingSpansTo204',
StakingLedger: 'StakingLedgerTo223',
@@ -49,6 +60,7 @@ const versioned: OverrideVersionedType[] = [
Keys: 'SessionKeys5',
LookupSource: 'Address',
Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225',
ReferendumInfo: 'ReferendumInfoTo239',
StakingLedger: 'StakingLedgerTo223',
Votes: 'VotesTo230',
@@ -59,11 +71,10 @@ const versioned: OverrideVersionedType[] = [
minmax: [1046, 1054],
types: {
// Indices optional, not in transaction
Address: 'AccountId',
...sharedTypes,
DispatchInfo: 'DispatchInfoTo244',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225',
ReferendumInfo: 'ReferendumInfoTo239',
StakingLedger: 'StakingLedgerTo240',
Weight: 'u32'
@@ -72,11 +83,10 @@ const versioned: OverrideVersionedType[] = [
{
minmax: [1055, 1056],
types: {
Address: 'AccountId',
...sharedTypes,
DispatchInfo: 'DispatchInfoTo244',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225',
StakingLedger: 'StakingLedgerTo240',
Weight: 'u32'
}
@@ -84,18 +94,22 @@ const versioned: OverrideVersionedType[] = [
{
minmax: [1057, 1061],
types: {
Address: 'AccountId',
...sharedTypes,
DispatchInfo: 'DispatchInfoTo244',
Keys: 'SessionKeys5',
LookupSource: 'AccountId'
OpenTip: 'OpenTipTo225'
}
},
{
minmax: [1062, undefined],
minmax: [1062, 2012],
types: {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId'
...sharedTypes,
OpenTip: 'OpenTipTo225'
}
},
{
minmax: [2013, undefined],
types: {
...sharedTypes
}
}
];
+14 -11
View File
@@ -4,25 +4,28 @@
import { OverrideVersionedType } from '@polkadot/types/types';
const sharedTypes = {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
ProxyType: {
_enum: ['Any', 'NonTransfer', 'Governance', 'Staking', 'SudoBalances', 'IdentityJudgement']
}
};
// these are override types for Polkadot
const versioned: OverrideVersionedType[] = [
{
minmax: [0, 3],
minmax: [0, 12],
types: {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId'
...sharedTypes,
OpenTip: 'OpenTipTo225'
}
},
{
minmax: [4, undefined],
minmax: [13, undefined],
types: {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
ProxyType: {
_enum: ['Any', 'NonTransfer', 'Governance', 'Staking', 'SudoBalances']
}
...sharedTypes
}
}
];
+16 -14
View File
@@ -4,34 +4,36 @@
import { OverrideVersionedType } from '@polkadot/types/types';
const sharedTypes = {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
ProxyType: {
_enum: ['Any', 'NonTransfer', 'Staking', 'SudoBalances', 'IdentityJudgement']
}
};
const versioned: OverrideVersionedType[] = [
{
minmax: [1, 2],
types: {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
...sharedTypes,
Multiplier: 'Fixed64',
OpenTip: 'OpenTipTo225',
Weight: 'u32'
}
},
{
minmax: [3, 19],
minmax: [3, 22],
types: {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId'
...sharedTypes,
OpenTip: 'OpenTipTo225'
}
},
{
minmax: [20, undefined],
minmax: [23, undefined],
types: {
Address: 'AccountId',
Keys: 'SessionKeys5',
LookupSource: 'AccountId',
ProxyType: {
_enum: ['Any', 'NonTransfer', 'Staking', 'SudoBalances']
}
...sharedTypes
}
}
];
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@polkadot/types",
"version": "1.20.1",
"version": "1.24.1",
"description": "Implementation of the Parity codec",
"main": "index.js",
"keywords": [
@@ -26,17 +26,17 @@
},
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/types#readme",
"dependencies": {
"@babel/runtime": "^7.10.3",
"@polkadot/metadata": "1.20.1",
"@polkadot/util": "^2.15.1",
"@polkadot/util-crypto": "^2.15.1",
"@babel/runtime": "^7.10.4",
"@polkadot/metadata": "1.24.1",
"@polkadot/util": "^2.18.1",
"@polkadot/util-crypto": "^2.18.1",
"@types/bn.js": "^4.11.6",
"bn.js": "^5.1.2",
"memoizee": "^0.4.14",
"rxjs": "^6.5.5"
"rxjs": "^6.6.0"
},
"devDependencies": {
"@polkadot/keyring": "^2.15.1",
"@polkadot/keyring": "^2.18.1",
"@types/memoizee": "^0.4.4"
}
}
+37 -33
View File
@@ -7,21 +7,21 @@ import { BlockAttestations, IncludedBlocks, MoreAttestations } from '@polkadot/t
import { RawAuraPreDigest } from '@polkadot/types/interfaces/aura';
import { ExtrinsicOrHash, ExtrinsicStatus } from '@polkadot/types/interfaces/author';
import { UncleEntryItem } from '@polkadot/types/interfaces/authorship';
import { AllowedSlots, BabeAuthorityWeight, BabeBlockWeight, BabeWeight, EpochAuthorship, MaybeRandomness, MaybeVrf, NextConfigDescriptor, NextConfigDescriptorV1, Randomness, RawBabePreDigest, RawBabePreDigestCompat, RawBabePreDigestPrimary, RawBabePreDigestPrimaryTo159, RawBabePreDigestSecondaryPlain, RawBabePreDigestSecondaryTo159, RawBabePreDigestSecondaryVRF, RawBabePreDigestTo159, SlotNumber, VrfData, VrfOutput, VrfProof } from '@polkadot/types/interfaces/babe';
import { AccountData, BalanceLock, BalanceLockTo212, BalanceStatus, Reasons, ReleasesBalances, VestingSchedule, WithdrawReasons } from '@polkadot/types/interfaces/balances';
import { AllowedSlots, BabeAuthorityWeight, BabeBlockWeight, BabeEquivocationProof, BabeWeight, EpochAuthorship, MaybeRandomness, MaybeVrf, NextConfigDescriptor, NextConfigDescriptorV1, Randomness, RawBabePreDigest, RawBabePreDigestCompat, RawBabePreDigestPrimary, RawBabePreDigestPrimaryTo159, RawBabePreDigestSecondaryPlain, RawBabePreDigestSecondaryTo159, RawBabePreDigestSecondaryVRF, RawBabePreDigestTo159, SlotNumber, VrfData, VrfOutput, VrfProof } from '@polkadot/types/interfaces/babe';
import { AccountData, BalanceLock, BalanceLockTo212, BalanceStatus, Reasons, VestingSchedule, WithdrawReasons } from '@polkadot/types/interfaces/balances';
import { BlockHash } from '@polkadot/types/interfaces/chain';
import { PrefixedStorageKey } from '@polkadot/types/interfaces/childstate';
import { EthereumAddress, StatementKind } from '@polkadot/types/interfaces/claims';
import { MemberCount, ProposalIndex, Votes, VotesTo230 } from '@polkadot/types/interfaces/collective';
import { AuthorityId, RawVRFOutput } from '@polkadot/types/interfaces/consensus';
import { AliveContractInfo, CodeHash, ContractCallRequest, ContractExecResult, ContractExecResultSuccess, ContractInfo, ContractStorageKey, Gas, PrefabWasmModule, PrefabWasmModuleReserved, Schedule, ScheduleTo212, SeedOf, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts';
import { AccountVote, AccountVoteSplit, AccountVoteStandard, Conviction, Delegations, PreimageStatus, PreimageStatusAvailable, PriorLock, PropIndex, Proposal, ProxyState, ReferendumIndex, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, ReferendumStatus, ReleasesDemocracy, Tally, Voting, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces/democracy';
import { AccountVote, AccountVoteSplit, AccountVoteStandard, Conviction, Delegations, PreimageStatus, PreimageStatusAvailable, PriorLock, PropIndex, Proposal, ProxyState, ReferendumIndex, ReferendumInfo, ReferendumInfoFinished, ReferendumInfoTo239, ReferendumStatus, Tally, Voting, VotingDelegating, VotingDirect, VotingDirectVote } from '@polkadot/types/interfaces/democracy';
import { ApprovalFlag, DefunctVoter, Renouncing, SetIndex, Vote, VoteIndex, VoteThreshold, VoterInfo } from '@polkadot/types/interfaces/elections';
import { CreatedBlock, ImportedAux } from '@polkadot/types/interfaces/engine';
import { Account, Log, Vicinity } from '@polkadot/types/interfaces/evm';
import { EcdsaSignature, Ed25519Signature, Extrinsic, ExtrinsicEra, ExtrinsicPayload, ExtrinsicPayloadUnknown, ExtrinsicPayloadV1, ExtrinsicPayloadV2, ExtrinsicPayloadV3, ExtrinsicPayloadV4, ExtrinsicSignatureV1, ExtrinsicSignatureV2, ExtrinsicSignatureV3, ExtrinsicSignatureV4, ExtrinsicUnknown, ExtrinsicV1, ExtrinsicV2, ExtrinsicV3, ExtrinsicV4, ImmortalEra, MortalEra, MultiSignature, Signature, SignerPayload, Sr25519Signature } from '@polkadot/types/interfaces/extrinsics';
import { AssetOptions, Owner, PermissionLatest, PermissionVersions, PermissionsV1 } from '@polkadot/types/interfaces/genericAsset';
import { AuthorityIndex, AuthorityList, AuthorityWeight, Equivocation, EquivocationProof, GrandpaEquivocation, GrandpaPrevote, KeyOwnerProof, NextAuthority, PendingPause, PendingResume, Precommits, Prevotes, ReportedRoundStates, RoundState, SetId, StoredPendingChange, StoredState } from '@polkadot/types/interfaces/grandpa';
import { AuthorityIndex, AuthorityList, AuthorityWeight, GrandpaEquivocation, GrandpaEquivocationProof, GrandpaEquivocationValue, GrandpaPrevote, KeyOwnerProof, NextAuthority, PendingPause, PendingResume, Precommits, Prevotes, ReportedRoundStates, RoundState, SetId, StoredPendingChange, StoredState } from '@polkadot/types/interfaces/grandpa';
import { IdentityFields, IdentityInfo, IdentityInfoAdditional, IdentityJudgement, RegistrarIndex, RegistrarInfo, Registration, RegistrationJudgement } from '@polkadot/types/interfaces/identity';
import { AuthIndex, AuthoritySignature, Heartbeat, HeartbeatTo244, OpaqueMultiaddr, OpaqueNetworkState, OpaquePeerId } from '@polkadot/types/interfaces/imOnline';
import { CallMetadataV0, DoubleMapTypeLatest, DoubleMapTypeV10, DoubleMapTypeV11, DoubleMapTypeV3, DoubleMapTypeV4, DoubleMapTypeV5, DoubleMapTypeV6, DoubleMapTypeV7, DoubleMapTypeV8, DoubleMapTypeV9, ErrorMetadataV10, ErrorMetadataV11, ErrorMetadataV8, ErrorMetadataV9, EventMetadataLatest, EventMetadataV0, EventMetadataV1, EventMetadataV10, EventMetadataV11, EventMetadataV2, EventMetadataV3, EventMetadataV4, EventMetadataV5, EventMetadataV6, EventMetadataV7, EventMetadataV8, EventMetadataV9, ExtrinsicMetadataLatest, ExtrinsicMetadataV11, FunctionArgumentMetadataLatest, FunctionArgumentMetadataV0, FunctionArgumentMetadataV1, FunctionArgumentMetadataV10, FunctionArgumentMetadataV11, FunctionArgumentMetadataV2, FunctionArgumentMetadataV3, FunctionArgumentMetadataV4, FunctionArgumentMetadataV5, FunctionArgumentMetadataV6, FunctionArgumentMetadataV7, FunctionArgumentMetadataV8, FunctionArgumentMetadataV9, FunctionMetadataLatest, FunctionMetadataV0, FunctionMetadataV1, FunctionMetadataV10, FunctionMetadataV11, FunctionMetadataV2, FunctionMetadataV3, FunctionMetadataV4, FunctionMetadataV5, FunctionMetadataV6, FunctionMetadataV7, FunctionMetadataV8, FunctionMetadataV9, MapTypeLatest, MapTypeV0, MapTypeV10, MapTypeV11, MapTypeV2, MapTypeV3, MapTypeV4, MapTypeV5, MapTypeV6, MapTypeV7, MapTypeV8, MapTypeV9, MetadataAll, MetadataLatest, MetadataV0, MetadataV1, MetadataV10, MetadataV11, MetadataV2, MetadataV3, MetadataV4, MetadataV5, MetadataV6, MetadataV7, MetadataV8, MetadataV9, ModuleConstantMetadataLatest, ModuleConstantMetadataV10, ModuleConstantMetadataV11, ModuleConstantMetadataV6, ModuleConstantMetadataV7, ModuleConstantMetadataV8, ModuleConstantMetadataV9, ModuleMetadataLatest, ModuleMetadataV0, ModuleMetadataV1, ModuleMetadataV10, ModuleMetadataV11, ModuleMetadataV2, ModuleMetadataV3, ModuleMetadataV4, ModuleMetadataV5, ModuleMetadataV6, ModuleMetadataV7, ModuleMetadataV8, ModuleMetadataV9, OuterDispatchCallV0, OuterDispatchMetadataV0, OuterEventEventMetadataEventsV0, OuterEventEventMetadataV0, OuterEventMetadataV0, PlainTypeLatest, PlainTypeV0, PlainTypeV10, PlainTypeV11, PlainTypeV2, PlainTypeV3, PlainTypeV4, PlainTypeV5, PlainTypeV6, PlainTypeV7, PlainTypeV8, PlainTypeV9, RuntimeModuleMetadataV0, StorageEntryMetadataLatest, StorageEntryMetadataV10, StorageEntryMetadataV11, StorageEntryMetadataV6, StorageEntryMetadataV7, StorageEntryMetadataV8, StorageEntryMetadataV9, StorageEntryModifierLatest, StorageEntryModifierV10, StorageEntryModifierV11, StorageEntryModifierV6, StorageEntryModifierV7, StorageEntryModifierV8, StorageEntryModifierV9, StorageEntryTypeLatest, StorageEntryTypeV10, StorageEntryTypeV11, StorageEntryTypeV6, StorageEntryTypeV7, StorageEntryTypeV8, StorageEntryTypeV9, StorageFunctionMetadataV0, StorageFunctionMetadataV1, StorageFunctionMetadataV2, StorageFunctionMetadataV3, StorageFunctionMetadataV4, StorageFunctionMetadataV5, StorageFunctionModifierV0, StorageFunctionModifierV1, StorageFunctionModifierV2, StorageFunctionModifierV3, StorageFunctionModifierV4, StorageFunctionModifierV5, StorageFunctionTypeV0, StorageFunctionTypeV1, StorageFunctionTypeV2, StorageFunctionTypeV3, StorageFunctionTypeV4, StorageFunctionTypeV5, StorageHasher, StorageHasherV10, StorageHasherV11, StorageHasherV4, StorageHasherV5, StorageHasherV6, StorageHasherV7, StorageHasherV8, StorageHasherV9, StorageMetadataLatest, StorageMetadataV0, StorageMetadataV10, StorageMetadataV11, StorageMetadataV7, StorageMetadataV8, StorageMetadataV9 } from '@polkadot/types/interfaces/metadata';
@@ -29,18 +29,19 @@ import { StorageKind } from '@polkadot/types/interfaces/offchain';
import { DeferredOffenceOf, Kind, OffenceDetails, Offender, OpaqueTimeSlot, ReportIdOf, Reporter } from '@polkadot/types/interfaces/offences';
import { AbridgedCandidateReceipt, AttestedCandidate, AuctionIndex, Bidder, CandidateCommitments, CandidateReceipt, CollatorId, CollatorSignature, DoubleVoteReport, DownwardMessage, GlobalValidationSchedule, HeadData, IncomingParachain, IncomingParachainDeploy, IncomingParachainFixed, LeasePeriod, LeasePeriodOf, LocalValidationData, NewBidder, ParaId, ParaInfo, ParaPastCodeMeta, ParaScheduling, ParachainDispatchOrigin, Remark, Retriable, Scheduling, SigningContext, SlotRange, Statement, SubId, UpwardMessage, ValidationCode, ValidatorSignature, ValidityAttestation, WinningData, WinningDataEntry } from '@polkadot/types/interfaces/parachains';
import { RuntimeDispatchInfo } from '@polkadot/types/interfaces/payment';
import { Approvals } from '@polkadot/types/interfaces/poll';
import { ActiveRecovery, RecoveryConfig } from '@polkadot/types/interfaces/recovery';
import { RpcMethods } from '@polkadot/types/interfaces/rpc';
import { AccountId, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, Call, ChangesTrieConfiguration, Consensus, ConsensusEngineId, Digest, DigestItem, ExtrinsicsWeight, Fixed128, Fixed64, H160, H256, H512, Hash, Header, Index, Justification, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, Origin, Pays, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, ProxyType, RuntimeDbWeight, Seal, SealV0, SignedBlock, StorageData, ValidatorId, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime';
import { AccountId, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, Call, ChangesTrieConfiguration, Consensus, ConsensusEngineId, Digest, DigestItem, ExtrinsicsWeight, Fixed128, Fixed64, H160, H256, H512, Hash, Header, Index, Justification, KeyTypeId, KeyValue, LockIdentifier, LookupSource, LookupTarget, ModuleId, Moment, OpaqueCall, Origin, Pays, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, ProxyType, Releases, RuntimeDbWeight, Seal, SealV0, SignedBlock, StorageData, ValidatorId, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime';
import { Period, Priority, SchedulePeriod, SchedulePriority, Scheduled, TaskAddress } from '@polkadot/types/interfaces/scheduler';
import { FullIdentification, IdentificationTuple, Keys, MembershipProof, SessionIndex, SessionKeys1, SessionKeys2, SessionKeys3, SessionKeys4, SessionKeys5, SessionKeys6, ValidatorCount } from '@polkadot/types/interfaces/session';
import { Bid, BidKind, SocietyJudgement, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces/society';
import { ActiveEraInfo, CompactAssignments, CompactScore, ElectionCompute, ElectionResult, ElectionScore, ElectionSize, ElectionStatus, EraIndex, EraPoints, EraRewardPoints, EraRewards, Exposure, Forcing, IndividualExposure, KeyType, MomentOf, Nominations, NominatorIndex, OffchainAccuracy, PerU16, PhragmenScore, Points, ReleasesStaking, RewardDestination, RewardPoint, SlashJournalEntry, SlashingSpans, SlashingSpansTo204, SpanIndex, SpanRecord, StakingLedger, StakingLedgerTo223, StakingLedgerTo240, UnappliedSlash, UnappliedSlashOther, UnlockChunk, ValidatorIndex, ValidatorPrefs, ValidatorPrefsTo145, ValidatorPrefsTo196 } from '@polkadot/types/interfaces/staking';
import { ActiveEraInfo, CompactAssignments, CompactScore, ElectionCompute, ElectionResult, ElectionScore, ElectionSize, ElectionStatus, EraIndex, EraPoints, EraRewardPoints, EraRewards, Exposure, Forcing, IndividualExposure, KeyType, MomentOf, Nominations, NominatorIndex, OffchainAccuracy, PerU16, PhragmenScore, Points, RewardDestination, RewardPoint, SlashJournalEntry, SlashingSpans, SlashingSpansTo204, SpanIndex, SpanRecord, StakingLedger, StakingLedgerTo223, StakingLedgerTo240, UnappliedSlash, UnappliedSlashOther, UnlockChunk, ValidatorIndex, ValidatorPrefs, ValidatorPrefsTo145, ValidatorPrefsTo196 } from '@polkadot/types/interfaces/staking';
import { ApiId, KeyValueOption, ReadProof, RuntimeVersion, RuntimeVersionApi, StorageChangeSet } from '@polkadot/types/interfaces/state';
import { WeightToFeeCoefficient } from '@polkadot/types/interfaces/support';
import { AccountInfo, ApplyExtrinsicResult, ChainProperties, ChainType, DigestOf, DispatchClass, DispatchError, DispatchErrorModule, DispatchErrorTo198, DispatchInfo, DispatchInfoTo190, DispatchInfoTo244, DispatchOutcome, DispatchResult, DispatchResultOf, DispatchResultTo198, Event, EventId, EventIndex, EventRecord, EventRecordTo76, Health, InvalidTransaction, Key, LastRuntimeUpgradeInfo, NetworkState, NetworkStatePeerset, NetworkStatePeersetInfo, NodeRole, NotConnectedPeer, Peer, PeerEndpoint, PeerEndpointAddr, PeerInfo, PeerPing, Phase, RefCount, TransactionValidityError, UnknownTransaction } from '@polkadot/types/interfaces/system';
import { OpenTip, OpenTipFinder, OpenTipTip, TreasuryProposal } from '@polkadot/types/interfaces/treasury';
import { Multiplier, PaymentReleases } from '@polkadot/types/interfaces/txpayment';
import { OpenTip, OpenTipFinderTo225, OpenTipTip, OpenTipTo225, TreasuryProposal } from '@polkadot/types/interfaces/treasury';
import { Multiplier } from '@polkadot/types/interfaces/txpayment';
import { CallHash, Multisig, Timepoint } from '@polkadot/types/interfaces/utility';
import { VestingInfo } from '@polkadot/types/interfaces/vesting';
@@ -225,6 +226,9 @@ declare module '@polkadot/types/types/registry' {
'Compact<Moment>': Compact<Moment>;
'Option<Moment>': Option<Moment>;
'Vec<Moment>': Vec<Moment>;
OpaqueCall: OpaqueCall;
'Option<OpaqueCall>': Option<OpaqueCall>;
'Vec<OpaqueCall>': Vec<OpaqueCall>;
Origin: Origin;
'Option<Origin>': Option<Origin>;
'Vec<Origin>': Vec<Origin>;
@@ -256,6 +260,9 @@ declare module '@polkadot/types/types/registry' {
ProxyType: ProxyType;
'Option<ProxyType>': Option<ProxyType>;
'Vec<ProxyType>': Vec<ProxyType>;
Releases: Releases;
'Option<Releases>': Option<Releases>;
'Vec<Releases>': Vec<Releases>;
RuntimeDbWeight: RuntimeDbWeight;
'Option<RuntimeDbWeight>': Option<RuntimeDbWeight>;
'Vec<RuntimeDbWeight>': Vec<RuntimeDbWeight>;
@@ -304,16 +311,19 @@ declare module '@polkadot/types/types/registry' {
'Compact<BabeBlockWeight>': Compact<BabeBlockWeight>;
'Option<BabeBlockWeight>': Option<BabeBlockWeight>;
'Vec<BabeBlockWeight>': Vec<BabeBlockWeight>;
BabeEquivocationProof: BabeEquivocationProof;
'Option<BabeEquivocationProof>': Option<BabeEquivocationProof>;
'Vec<BabeEquivocationProof>': Vec<BabeEquivocationProof>;
BabeWeight: BabeWeight;
'Compact<BabeWeight>': Compact<BabeWeight>;
'Option<BabeWeight>': Option<BabeWeight>;
'Vec<BabeWeight>': Vec<BabeWeight>;
MaybeRandomness: MaybeRandomness;
'Option<MaybeRandomness>': Option<MaybeRandomness>;
'Vec<MaybeRandomness>': Vec<MaybeRandomness>;
MaybeVrf: MaybeVrf;
'Option<MaybeVrf>': Option<MaybeVrf>;
'Vec<MaybeVrf>': Vec<MaybeVrf>;
BabeWeight: BabeWeight;
'Compact<BabeWeight>': Compact<BabeWeight>;
'Option<BabeWeight>': Option<BabeWeight>;
'Vec<BabeWeight>': Vec<BabeWeight>;
EpochAuthorship: EpochAuthorship;
'Option<EpochAuthorship>': Option<EpochAuthorship>;
'Vec<EpochAuthorship>': Vec<EpochAuthorship>;
@@ -375,9 +385,6 @@ declare module '@polkadot/types/types/registry' {
BalanceStatus: BalanceStatus;
'Option<BalanceStatus>': Option<BalanceStatus>;
'Vec<BalanceStatus>': Vec<BalanceStatus>;
ReleasesBalances: ReleasesBalances;
'Option<ReleasesBalances>': Option<ReleasesBalances>;
'Vec<ReleasesBalances>': Vec<ReleasesBalances>;
Reasons: Reasons;
'Option<Reasons>': Option<Reasons>;
'Vec<Reasons>': Vec<Reasons>;
@@ -503,9 +510,6 @@ declare module '@polkadot/types/types/registry' {
ReferendumStatus: ReferendumStatus;
'Option<ReferendumStatus>': Option<ReferendumStatus>;
'Vec<ReferendumStatus>': Vec<ReferendumStatus>;
ReleasesDemocracy: ReleasesDemocracy;
'Option<ReleasesDemocracy>': Option<ReleasesDemocracy>;
'Vec<ReleasesDemocracy>': Vec<ReleasesDemocracy>;
Tally: Tally;
'Option<Tally>': Option<Tally>;
'Vec<Tally>': Vec<Tally>;
@@ -664,15 +668,15 @@ declare module '@polkadot/types/types/registry' {
'Compact<AuthorityWeight>': Compact<AuthorityWeight>;
'Option<AuthorityWeight>': Option<AuthorityWeight>;
'Vec<AuthorityWeight>': Vec<AuthorityWeight>;
Equivocation: Equivocation;
'Option<Equivocation>': Option<Equivocation>;
'Vec<Equivocation>': Vec<Equivocation>;
EquivocationProof: EquivocationProof;
'Option<EquivocationProof>': Option<EquivocationProof>;
'Vec<EquivocationProof>': Vec<EquivocationProof>;
GrandpaEquivocation: GrandpaEquivocation;
'Option<GrandpaEquivocation>': Option<GrandpaEquivocation>;
'Vec<GrandpaEquivocation>': Vec<GrandpaEquivocation>;
GrandpaEquivocationProof: GrandpaEquivocationProof;
'Option<GrandpaEquivocationProof>': Option<GrandpaEquivocationProof>;
'Vec<GrandpaEquivocationProof>': Vec<GrandpaEquivocationProof>;
GrandpaEquivocationValue: GrandpaEquivocationValue;
'Option<GrandpaEquivocationValue>': Option<GrandpaEquivocationValue>;
'Vec<GrandpaEquivocationValue>': Vec<GrandpaEquivocationValue>;
GrandpaPrevote: GrandpaPrevote;
'Option<GrandpaPrevote>': Option<GrandpaPrevote>;
'Vec<GrandpaPrevote>': Vec<GrandpaPrevote>;
@@ -933,9 +937,6 @@ declare module '@polkadot/types/types/registry' {
PhragmenScore: PhragmenScore;
'Option<PhragmenScore>': Option<PhragmenScore>;
'Vec<PhragmenScore>': Vec<PhragmenScore>;
ReleasesStaking: ReleasesStaking;
'Option<ReleasesStaking>': Option<ReleasesStaking>;
'Vec<ReleasesStaking>': Vec<ReleasesStaking>;
RewardDestination: RewardDestination;
'Option<RewardDestination>': Option<RewardDestination>;
'Vec<RewardDestination>': Vec<RewardDestination>;
@@ -1115,9 +1116,12 @@ declare module '@polkadot/types/types/registry' {
OpenTip: OpenTip;
'Option<OpenTip>': Option<OpenTip>;
'Vec<OpenTip>': Vec<OpenTip>;
OpenTipFinder: OpenTipFinder;
'Option<OpenTipFinder>': Option<OpenTipFinder>;
'Vec<OpenTipFinder>': Vec<OpenTipFinder>;
OpenTipTo225: OpenTipTo225;
'Option<OpenTipTo225>': Option<OpenTipTo225>;
'Vec<OpenTipTo225>': Vec<OpenTipTo225>;
OpenTipFinderTo225: OpenTipFinderTo225;
'Option<OpenTipFinderTo225>': Option<OpenTipFinderTo225>;
'Vec<OpenTipFinderTo225>': Vec<OpenTipFinderTo225>;
OpenTipTip: OpenTipTip;
'Option<OpenTipTip>': Option<OpenTipTip>;
'Vec<OpenTipTip>': Vec<OpenTipTip>;
@@ -1127,9 +1131,6 @@ declare module '@polkadot/types/types/registry' {
Multiplier: Multiplier;
'Option<Multiplier>': Option<Multiplier>;
'Vec<Multiplier>': Vec<Multiplier>;
PaymentReleases: PaymentReleases;
'Option<PaymentReleases>': Option<PaymentReleases>;
'Vec<PaymentReleases>': Vec<PaymentReleases>;
CallHash: CallHash;
'Option<CallHash>': Option<CallHash>;
'Vec<CallHash>': Vec<CallHash>;
@@ -1271,6 +1272,9 @@ declare module '@polkadot/types/types/registry' {
WinningDataEntry: WinningDataEntry;
'Option<WinningDataEntry>': Option<WinningDataEntry>;
'Vec<WinningDataEntry>': Vec<WinningDataEntry>;
Approvals: Approvals;
'Option<Approvals>': Option<Approvals>;
'Vec<Approvals>': Vec<Approvals>;
CallMetadataV0: CallMetadataV0;
'Option<CallMetadataV0>': Option<CallMetadataV0>;
'Vec<CallMetadataV0>': Vec<CallMetadataV0>;
+3 -2
View File
@@ -6,7 +6,7 @@ import { H256 } from '../interfaces/runtime';
import { AnyNumber, Codec, Registry } from '../types';
import BN from 'bn.js';
import { assert, bnToBn, bnToHex, bnToU8a, formatBalance, formatNumber, hexToBn, isHex, isString, isU8a, u8aToBn } from '@polkadot/util';
import { BN_ZERO, assert, bnToBn, bnToHex, bnToU8a, formatBalance, formatNumber, hexToBn, isHex, isString, isU8a, u8aToBn } from '@polkadot/util';
import { blake2AsU8a } from '@polkadot/util-crypto';
import Raw from './Raw';
@@ -77,6 +77,7 @@ export default abstract class AbstractInt extends BN implements Codec {
this.#isHexJson = isHexJson;
this.#isSigned = isSigned;
assert(isSigned || this.gte(BN_ZERO), `${this.toRawType()}: Negative number passed to unsigned type`);
assert(super.bitLength() <= bitLength, `${this.toRawType()}: Input too large. Found input with ${super.bitLength()} bits, expected ${bitLength}`);
}
@@ -161,7 +162,7 @@ export default abstract class AbstractInt extends BN implements Codec {
* @description Converts the Object to to a human-friendly JSON, with additional fields, expansion and formatting of information
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public toHuman (isExpanded?: boolean): any {
public toHuman (isExpanded?: boolean): string {
// FIXME we need proper expansion here
return this instanceof this.registry.createClass('Balance')
? this.isMax()
+1 -1
View File
@@ -171,7 +171,7 @@ export default class BTreeSet<V extends Codec = Codec> extends Set<V> implements
* @description Returns the base runtime type name for this instance
*/
public toRawType (): string {
return `BTreeSet<${new this.#ValClass(this.registry).toRawType()}>`;
return `BTreeSet<${this.registry.getClassName(this.#ValClass) || new this.#ValClass(this.registry).toRawType()}>`;
}
/**
+72 -15
View File
@@ -2,15 +2,17 @@
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { AnyNumber, Codec, Constructor, ICompact, InterfaceTypes, Registry } from '../types';
import { H256 } from '@polkadot/types/interfaces';
import { AnyJson, AnyNumber, Codec, Constructor, ICompact, InterfaceTypes, Registry } from '../types';
import BN from 'bn.js';
import { compactAddLength, compactFromU8a, compactStripLength, compactToU8a, isBigInt, isBn, isNumber, isString } from '@polkadot/util';
import { DEFAULT_BITLENGTH } from '@polkadot/util/compact/defaults';
import { blake2AsU8a } from '@polkadot/util-crypto';
import typeToConstructor from './utils/typeToConstructor';
import { UIntBitLength } from './AbstractInt';
import Base from './Base';
import Raw from './Raw';
export interface CompactEncodable extends Codec {
bitLength (): number;
@@ -26,11 +28,17 @@ export interface CompactEncodable extends Codec {
* used by other types to add length-prefixed encoding, or in the case of wrapped types, taking
* a number and making the compact representation thereof
*/
export default class Compact<T extends CompactEncodable> extends Base<T> implements ICompact<T> {
export default class Compact<T extends CompactEncodable> implements ICompact<T> {
public readonly registry: Registry;
readonly #Type: Constructor<T>;
readonly #raw: T;
constructor (registry: Registry, Type: Constructor<T> | keyof InterfaceTypes, value: Compact<T> | AnyNumber = 0) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
super(registry, Compact.decodeCompact<T>(registry, typeToConstructor(registry, Type), value));
this.registry = registry;
this.#Type = typeToConstructor(registry, Type);
this.#raw = Compact.decodeCompact<T>(registry, this.#Type, value) as T;
}
public static with<T extends CompactEncodable> (Type: Constructor<T> | keyof InterfaceTypes): Constructor<Compact<T>> {
@@ -61,7 +69,7 @@ export default class Compact<T extends CompactEncodable> extends Base<T> impleme
/** @internal */
public static decodeCompact<T extends CompactEncodable> (registry: Registry, Type: Constructor<T>, value: Compact<T> | AnyNumber): CompactEncodable {
if (value instanceof Compact) {
return new Type(registry, value._raw);
return new Type(registry, value.#raw);
} else if (isString(value) || isNumber(value) || isBn(value) || isBigInt(value)) {
return new Type(registry, value);
}
@@ -71,20 +79,41 @@ export default class Compact<T extends CompactEncodable> extends Base<T> impleme
return new Type(registry, _value);
}
/**
* @description The length of the value when encoded as a Uint8Array
*/
public get encodedLength (): number {
return this.toU8a().length;
}
/**
* @description returns a hash of the contents
*/
public get hash (): H256 {
return new Raw(this.registry, blake2AsU8a(this.toU8a(), 256));
}
/**
* @description Checks if the value is an empty value
*/
public get isEmpty (): boolean {
return this.#raw.isEmpty;
}
/**
* @description Returns the number of bits in the value
*/
public bitLength (): number {
return this._raw.bitLength();
return this.#raw.bitLength();
}
/**
* @description Compares the value of the input to see if there is a match
*/
public eq (other?: unknown): boolean {
return this._raw.eq(
return this.#raw.eq(
other instanceof Compact
? other._raw
? other.#raw
: other
);
}
@@ -93,21 +122,49 @@ export default class Compact<T extends CompactEncodable> extends Base<T> impleme
* @description Returns the BN representation of the number
*/
public toBn (): BN {
return this._raw.toBn();
return this.#raw.toBn();
}
/**
* @description Returns a hex string representation of the value. isLe returns a LE (number-only) representation
*/
public toHex (isLe?: boolean): string {
return this.#raw.toHex(isLe);
}
/**
* @description Converts the Object to to a human-friendly JSON, with additional fields, expansion and formatting of information
*/
public toHuman (isExtended?: boolean): AnyJson {
return this.#raw.toHuman(isExtended);
}
/**
* @description Converts the Object to JSON, typically used for RPC transfers
*/
public toJSON (): AnyJson {
return this.#raw.toJSON();
}
/**
* @description Returns the number representation for the value
*/
public toNumber (): number {
return this._raw.toNumber();
return this.#raw.toNumber();
}
/**
* @description Returns the base runtime type name for this instance
*/
public toRawType (): string {
return `Compact<${this._raw.toRawType()}>`;
return `Compact<${this.registry.getClassName(this.#Type) || this.#raw.toRawType()}>`;
}
/**
* @description Returns the string representation of the value
*/
public toString (): string {
return this.#raw.toString();
}
/**
@@ -116,13 +173,13 @@ export default class Compact<T extends CompactEncodable> extends Base<T> impleme
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public toU8a (isBare?: boolean): Uint8Array {
return Compact.encodeU8a(this._raw.toBn());
return Compact.encodeU8a(this.#raw.toBn());
}
/**
* @description Returns the embedded [[UInt]] or [[Moment]] value
*/
public unwrap (): T {
return this._raw;
return this.#raw;
}
}
+51 -31
View File
@@ -2,13 +2,15 @@
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { H256 } from '@polkadot/types/interfaces';
import { AnyJson, Codec, Constructor, InterfaceTypes, Registry } from '../types';
import { assert, hexToU8a, isHex, isNumber, isObject, isString, isU8a, isUndefined, stringCamelCase, stringUpperFirst, u8aConcat, u8aToHex } from '@polkadot/util';
import { blake2AsU8a } from '@polkadot/util-crypto';
import Null from '../primitive/Null';
import { mapToTypeMap } from './utils';
import Base from './Base';
import Raw from './Raw';
import Struct from './Struct';
// export interface, this is used in Enum.with, so required as public by TS
@@ -114,25 +116,29 @@ function decodeEnum (registry: Registry, def: TypesDef, value?: any, index?: num
// TODO:
// - As per Enum, actually use TS enum
// - It should rather probably extend Enum instead of copying code
export default class Enum extends Base<Codec> {
private _def: TypesDef;
export default class Enum implements Codec {
public readonly registry: Registry;
private _index: number;
readonly #def: TypesDef;
private _indexes: number[];
readonly #index: number;
private _isBasic: boolean;
readonly #indexes: number[];
readonly #isBasic: boolean;
readonly #raw: Codec;
constructor (registry: Registry, def: Record<string, keyof InterfaceTypes | Constructor> | string[], value?: unknown, index?: number) {
const defInfo = extractDef(registry, def);
const decoded = decodeEnum(registry, defInfo.def, value, index);
super(registry, decoded.value);
this._def = defInfo.def;
this._isBasic = defInfo.isBasic;
this._indexes = Object.keys(defInfo.def).map((_, index): number => index);
this._index = this._indexes.indexOf(decoded.index) || 0;
this.registry = registry;
this.#def = defInfo.def;
this.#isBasic = defInfo.isBasic;
this.#indexes = Object.keys(defInfo.def).map((_, index): number => index);
this.#index = this.#indexes.indexOf(decoded.index) || 0;
this.#raw = decoded.value;
}
public static with (Types: Record<string, keyof InterfaceTypes | Constructor> | string[]): EnumConstructor<Enum> {
@@ -140,7 +146,7 @@ export default class Enum extends Base<Codec> {
constructor (registry: Registry, value?: unknown, index?: number) {
super(registry, Types, value, index);
Object.keys(this._def).forEach((_key): void => {
Object.keys(this.#def).forEach((_key): void => {
const name = stringUpperFirst(stringCamelCase(_key.replace(' ', '_')));
const askey = `as${name}`;
const iskey = `is${name}`;
@@ -175,21 +181,35 @@ export default class Enum extends Base<Codec> {
* @description The length of the value when encoded as a Uint8Array
*/
public get encodedLength (): number {
return 1 + this._raw.encodedLength;
return 1 + this.#raw.encodedLength;
}
/**
* @description returns a hash of the contents
*/
public get hash (): H256 {
return new Raw(this.registry, blake2AsU8a(this.toU8a(), 256));
}
/**
* @description The index of the metadata value
*/
public get index (): number {
return this._index;
return this.#index;
}
/**
* @description true if this is a basic enum (no values)
*/
public get isBasic (): boolean {
return this._isBasic;
return this.#isBasic;
}
/**
* @description Checks if the value is an empty value
*/
public get isEmpty (): boolean {
return this.#raw.isEmpty;
}
/**
@@ -203,35 +223,35 @@ export default class Enum extends Base<Codec> {
* @description Checks if the Enum points to a [[Null]] type (deprecated, use isNone)
*/
public get isNull (): boolean {
return this._raw instanceof Null;
return this.#raw instanceof Null;
}
/**
* @description The available keys for this enum
*/
public get defEntries (): string[] {
return Object.keys(this._def);
return Object.keys(this.#def);
}
/**
* @description The available keys for this enum
*/
public get defKeys (): string[] {
return Object.keys(this._def);
return Object.keys(this.#def);
}
/**
* @description The name of the type this enum value represents
*/
public get type (): string {
return this.defKeys[this._index];
return this.defKeys[this.#index];
}
/**
* @description The value of the enum
*/
public get value (): Codec {
return this._raw;
return this.#raw;
}
/**
@@ -241,7 +261,7 @@ export default class Enum extends Base<Codec> {
// cater for the case where we only pass the enum index
if (isNumber(other)) {
return this.toNumber() === other;
} else if (this._isBasic && isString(other)) {
} else if (this.#isBasic && isString(other)) {
return this.type === other;
} else if (isU8a(other)) {
return !this.toU8a().some((entry, index): boolean => entry !== other[index]);
@@ -268,34 +288,34 @@ export default class Enum extends Base<Codec> {
* @description Converts the Object to to a human-friendly JSON, with additional fields, expansion and formatting of information
*/
public toHuman (isExtended?: boolean): AnyJson {
return this._isBasic
return this.#isBasic
? this.type
: { [this.type]: this._raw.toHuman(isExtended) };
: { [this.type]: this.#raw.toHuman(isExtended) };
}
/**
* @description Converts the Object to JSON, typically used for RPC transfers
*/
public toJSON (): AnyJson {
return this._isBasic
return this.#isBasic
? this.type
: { [this.type]: this._raw.toJSON() };
: { [this.type]: this.#raw.toJSON() };
}
/**
* @description Returns the number representation for the value
*/
public toNumber (): number {
return this._index;
return this.#index;
}
/**
* @description Returns a raw struct representation of the enum types
*/
protected _toRawStruct (): string[] | Record<string, string> {
return this._isBasic
return this.#isBasic
? this.defKeys
: Struct.typesToMap(this.registry, this._def);
: Struct.typesToMap(this.registry, this.#def);
}
/**
@@ -319,11 +339,11 @@ export default class Enum extends Base<Codec> {
* @param isBare true when the value has none of the type-specific prefixes (internal)
*/
public toU8a (isBare?: boolean): Uint8Array {
const index = this._indexes[this._index];
const index = this.#indexes[this.#index];
return u8aConcat(
new Uint8Array([index]),
this._raw.toU8a(isBare)
this.#raw.toU8a(isBare)
);
}
}
+1 -1
View File
@@ -180,7 +180,7 @@ export default class CodecMap<K extends Codec = Codec, V extends Codec = Codec>
* @description Returns the base runtime type name for this instance
*/
public toRawType (): string {
return `${this.#type}<${new this.#KeyClass(this.registry).toRawType()},${new this.#ValClass(this.registry).toRawType()}>`;
return `${this.#type}<${this.registry.getClassName(this.#KeyClass) || new this.#KeyClass(this.registry).toRawType()},${this.registry.getClassName(this.#ValClass) || new this.#ValClass(this.registry).toRawType()}>`;
}
/**
+46 -14
View File
@@ -2,13 +2,15 @@
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
import { Codec, Constructor, InterfaceTypes, Registry } from '../types';
import { H256 } from '@polkadot/types/interfaces';
import { AnyJson, Codec, Constructor, InterfaceTypes, Registry } from '../types';
import { isNull, isU8a, isUndefined, u8aToHex } from '@polkadot/util';
import { blake2AsU8a } from '@polkadot/util-crypto';
import Null from '../primitive/Null';
import { typeToConstructor } from './utils';
import Base from './Base';
import Raw from './Raw';
/** @internal */
function decodeOptionU8a (registry: Registry, Type: Constructor, value: Uint8Array): Codec {
@@ -48,15 +50,17 @@ function decodeOption (registry: Registry, typeName: Constructor | keyof Interfa
* implements that - decodes, checks for optionality and wraps the required structure
* with a value if/as required/found.
*/
export default class Option<T extends Codec> extends Base<T> {
export default class Option<T extends Codec> implements Codec {
public readonly registry: Registry;
readonly #Type: Constructor<T>;
constructor (registry: Registry, typeName: Constructor<T> | keyof InterfaceTypes, value?: unknown) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
super(registry, decodeOption(registry, typeName, value));
readonly #raw: T;
constructor (registry: Registry, typeName: Constructor<T> | keyof InterfaceTypes, value?: unknown) {
this.registry = registry;
this.#Type = typeToConstructor(registry, typeName);
this.#raw = decodeOption(registry, typeName, value) as T;
}
public static with<O extends Codec> (Type: Constructor<O> | keyof InterfaceTypes): Constructor<Option<O>> {
@@ -72,7 +76,14 @@ export default class Option<T extends Codec> extends Base<T> {
*/
public get encodedLength (): number {
// boolean byte (has value, doesn't have) along with wrapped length
return 1 + this._raw.encodedLength;
return 1 + this.#raw.encodedLength;
}
/**
* @description returns a hash of the contents
*/
public get hash (): H256 {
return new Raw(this.registry, blake2AsU8a(this.toU8a(), 256));
}
/**
@@ -86,7 +97,7 @@ export default class Option<T extends Codec> extends Base<T> {
* @description Checks if the Option has no value
*/
public get isNone (): boolean {
return this._raw instanceof Null;
return this.#raw instanceof Null;
}
/**
@@ -100,7 +111,7 @@ export default class Option<T extends Codec> extends Base<T> {
* @description The actual value for the Option
*/
public get value (): Codec {
return this._raw;
return this.#raw;
}
/**
@@ -125,31 +136,52 @@ export default class Option<T extends Codec> extends Base<T> {
: u8aToHex(this.toU8a().subarray(1));
}
/**
* @description Converts the Object to to a human-friendly JSON, with additional fields, expansion and formatting of information
*/
public toHuman (isExtended?: boolean): AnyJson {
return this.#raw.toHuman(isExtended);
}
/**
* @description Converts the Object to JSON, typically used for RPC transfers
*/
public toJSON (): AnyJson {
return this.#raw.toJSON();
}
/**
* @description Returns the base runtime type name for this instance
*/
public toRawType (isBare?: boolean): string {
const wrapped = new this.#Type(this.registry).toRawType();
const wrapped = this.registry.getClassName(this.#Type) || new this.#Type(this.registry).toRawType();
return isBare
? wrapped
: `Option<${wrapped}>`;
}
/**
* @description Returns the string representation of the value
*/
public toString (): string {
return this.#raw.toString();
}
/**
* @description Encodes the value as a Uint8Array as per the SCALE specifications
* @param isBare true when the value has none of the type-specific prefixes (internal)
*/
public toU8a (isBare?: boolean): Uint8Array {
if (isBare) {
return this._raw.toU8a(true);
return this.#raw.toU8a(true);
}
const u8a = new Uint8Array(this.encodedLength);
if (this.isSome) {
u8a.set([1]);
u8a.set(this._raw.toU8a(), 1);
u8a.set(this.#raw.toU8a(), 1);
}
return u8a;
@@ -163,7 +195,7 @@ export default class Option<T extends Codec> extends Base<T> {
throw new Error('Option: unwrapping a None value');
}
return this._raw;
return this.#raw;
}
/**
+17 -1
View File
@@ -23,7 +23,7 @@ const testEncode = (to: CodecTo, expected: any): void =>
expect(e[to]()).toEqual(expected);
});
describe('U8a', (): void => {
describe('Raw', (): void => {
let u8a: Raw;
beforeEach((): void => {
@@ -74,5 +74,21 @@ describe('U8a', (): void => {
it('compares against hex inputs', (): void => {
expect(u8a.eq('0x0102030405')).toBe(true);
});
it('has valid isAscii', (): void => {
expect(u8a.isAscii).toBe(false);
expect(new Raw(registry, '0x2021222324').isAscii).toBe(true);
});
it('has valid toUtf8', (): void => {
expect(new Raw(registry, 'Приветствую, ми').toUtf8()).toEqual('Приветствую, ми');
expect(new Raw(registry, '0xe4bda0e5a5bd').toUtf8()).toEqual('你好');
});
it('throws on invalid utf8', (): void => {
expect(
() => new Raw(registry, '0x7f07b1f87709608bee603bbc79a0dfc29cd315c1351a83aa31adf7458d7d3003').toUtf8()
).toThrow(/The character sequence is not a valid Utf8 string/);
});
});
});
+26 -3
View File
@@ -5,7 +5,7 @@
import { H256 } from '../interfaces/runtime';
import { AnyJson, AnyU8a, IU8a, Registry } from '../types';
import { isU8a, isUndefined, u8aToHex, u8aToU8a } from '@polkadot/util';
import { assert, isAscii, isU8a, isUndefined, isUtf8, u8aToHex, u8aToString, u8aToU8a } from '@polkadot/util';
import { blake2AsU8a } from '@polkadot/util-crypto';
/** @internal */
@@ -49,11 +49,25 @@ export default class Raw extends Uint8Array implements IU8a {
return new Raw(this.registry, blake2AsU8a(this.toU8a(), 256));
}
/**
* @description Returns true if the wrapped value contains only ASCII printable characters
*/
public get isAscii (): boolean {
return isAscii(this);
}
/**
* @description Returns true if the type wraps an empty/default all-0 value
*/
public get isEmpty (): boolean {
return !this.length || isUndefined(this.find((value): boolean => !!value));
return !this.length || isUndefined(this.find((value) => !!value));
}
/**
* @description Returns true if the wrapped value contains only utf8 characters
*/
public get isUtf8 (): boolean {
return isUtf8(this);
}
/**
@@ -77,7 +91,7 @@ export default class Raw extends Uint8Array implements IU8a {
public eq (other?: unknown): boolean {
if (other instanceof Uint8Array) {
return (this.length === other.length) &&
!this.some((value, index): boolean => value !== other[index]);
!this.some((value, index) => value !== other[index]);
}
return this.eq(decodeU8a(other));
@@ -135,4 +149,13 @@ export default class Raw extends Uint8Array implements IU8a {
public toU8a (isBare?: boolean): Uint8Array {
return Uint8Array.from(this);
}
/**
* @description Returns the wrapped data as a UTF-8 string
*/
public toUtf8 (): string {
assert(this.isUtf8, 'The character sequence is not a valid Utf8 string');
return u8aToString(this);
}
}
+1 -1
View File
@@ -58,6 +58,6 @@ describe('Result', (): void => {
});
it('returns a proper raw typedef rom a built-in', (): void => {
expect(registry.createType('DispatchResult').toRawType()).toEqual('Result<(),{"_enum":{"Other":"Null","CannotLookup":"Null","BadOrigin":"Null","Module":"{\\"index\\":\\"u8\\",\\"error\\":\\"u8\\"}"}}>');
expect(registry.createType('DispatchResult').toRawType()).toEqual('Result<(),DispatchError>');
});
});
+1 -1
View File
@@ -50,7 +50,7 @@ export default class Result<O extends Codec, E extends Codec> extends Enum {
* @description Checks if the Result has no value
*/
public get isEmpty (): boolean {
return this.isOk && this._raw.isEmpty;
return this.isOk && this.value.isEmpty;
}
/**
+6 -7
View File
@@ -5,7 +5,6 @@
/* eslint-disable sort-keys */
import { TypeRegistry } from '../create';
import AccountId from '../generic/AccountId';
import Text from '../primitive/Text';
import U32 from '../primitive/U32';
import { CodecTo } from '../types';
@@ -221,20 +220,20 @@ describe('Struct', (): void => {
it('generates sane toRawType', (): void => {
expect(
new Struct(registry, {
accountId: AccountId,
accountId: 'AccountId',
balanceCompact: registry.createClass('Compact<Balance>'),
blockNumber: registry.createClass('BlockNumber'),
compactNumber: registry.createClass('Compact<BlockNumber>'),
optionNumber: registry.createClass('Option<BlockNumber>'),
counter: U32,
vector: Vec.with(AccountId)
vector: Vec.with('AccountId')
}).toRawType()
).toEqual(JSON.stringify({
accountId: 'AccountId',
balanceCompact: 'Compact<Balance>', // Override in Uint
blockNumber: 'u32',
compactNumber: 'Compact<u32>',
optionNumber: 'Option<u32>',
blockNumber: 'BlockNumber',
compactNumber: 'Compact<BlockNumber>',
optionNumber: 'Option<BlockNumber>',
counter: 'u32',
vector: 'Vec<AccountId>'
}));
@@ -242,7 +241,7 @@ describe('Struct', (): void => {
it('generates sane toRawType (via with)', (): void => {
const Type = Struct.with({
accountId: AccountId,
accountId: 'AccountId',
balance: registry.createClass('Balance')
});
+3 -3
View File
@@ -267,11 +267,11 @@ export default class Struct<
}
public static typesToMap (registry: Registry, Types: Record<string, Constructor>): Record<string, string> {
return Object.entries(Types).reduce((result, [key, Type]): Record<string, string> => {
result[key] = new Type(registry).toRawType();
return Object.entries(Types).reduce((result: Record<string, string>, [key, Type]): Record<string, string> => {
result[key] = registry.getClassName(Type) || new Type(registry).toRawType();
return result;
}, {} as Record<string, string>);
}, {});
}
/**
+2 -2
View File
@@ -131,14 +131,14 @@ describe('Tuple', (): void => {
it('generates sane value with array types', (): void => {
expect(
new Tuple(registry, [U128, registry.createClass('BlockNumber')]).toRawType()
).toEqual('(u128,u32)');
).toEqual('(u128,BlockNumber)');
});
it('generates sane value with object types', (): void => {
expect(
// eslint-disable-next-line sort-keys
new Tuple(registry, { number: U128, blockNumber: registry.createClass('BlockNumber') }).toRawType()
).toEqual('(u128,u32)');
).toEqual('(u128,BlockNumber)');
});
});
});
+3 -1
View File
@@ -101,7 +101,9 @@ export default class Tuple extends AbstractArray<Codec> {
Array.isArray(this._Types)
? this._Types
: Object.values(this._Types)
).map((Type): string => new Type(this.registry).toRawType());
).map((Type) =>
this.registry.getClassName(Type) || new Type(this.registry).toRawType()
);
return `(${types.join(',')})`;
}
+3 -2
View File
@@ -8,10 +8,11 @@ import { isString, u8aToU8a } from '@polkadot/util';
import Raw from './Raw';
// The 520 here is a weird one - it is explicitly for a [u8; 65] as found as a EcdsaSignature
// The 520 here is a weird one - it is explicitly for a [u8; 65] as found as a EcdsaSignature,
// and 264 here is explicity for a [u8; 33] as found as EcdsaPublic key.
// Likewise 160 is for [u8; 20], which is also a H160, i.e. an Ethereum address. Both these are
// as a result of the Polkadot claims module. (Technically we don't need the 520 in here)
export type BitLength = 8 | 16 | 32 | 64 | 128 | 160 | 256 | 512 | 520 | 1024 | 2048;
export type BitLength = 8 | 16 | 32 | 64 | 128 | 160 | 256 | 264 | 512 | 520 | 1024 | 2048;
/** @internal */
function decodeU8aFixed (value: AnyU8a, bitLength: BitLength): AnyU8a {
+6
View File
@@ -16,6 +16,12 @@ describe('UInt', (): void => {
).toThrow('u32: Input too large. Found input with 164 bits, expected 32');
});
it('fails on negative numbers', (): void => {
expect(
(): UInt => new UInt(registry, -123, 32)
).toThrow('u32: Negative number passed to unsigned type');
});
it('allows for construction via BigInt', (): void => {
expect(
new UInt(registry, 123456789123456789123456789n, 128).toHuman()
+1 -1
View File
@@ -92,6 +92,6 @@ export default class Vec<T extends Codec> extends AbstractArray<T> {
* @description Returns the base runtime type name for this instance
*/
public toRawType (): string {
return `Vec<${new this._Type(this.registry).toRawType()}>`;
return `Vec<${this.registry.getClassName(this._Type) || new this._Type(this.registry).toRawType()}>`;
}
}
+29 -1
View File
@@ -4,7 +4,7 @@
import { TypeDef, TypeDefInfo } from './types';
import { getTypeDef } from '.';
import { TypeRegistry, getTypeDef } from '.';
describe('getTypeDef', (): void => {
it('does not allow invalid tuples, end )', (): void => {
@@ -290,4 +290,32 @@ describe('getTypeDef', (): void => {
type: '[[u8;32];3]'
});
});
it('creates recursive structures', (): void => {
const registry = new TypeRegistry();
registry.register({
Recursive: {
data: 'Vec<Recursive>'
}
});
const raw = registry.createType('Recursive' as 'u32').toRawType();
expect(
getTypeDef(raw)
).toEqual({
info: TypeDefInfo.Struct,
sub: [{
info: TypeDefInfo.Vec,
name: 'data',
sub: {
info: TypeDefInfo.Plain,
type: 'Recursive'
},
type: 'Vec<Recursive>'
}],
type: '{"data":"Vec<Recursive>"}'
});
});
});
+33 -20
View File
@@ -9,10 +9,17 @@ import { assert } from '@polkadot/util';
import sanitize from './sanitize';
import { typeSplit } from './typeSplit';
interface TypeDefOptions {
name?: string;
displayName?: string;
}
const MAX_NESTED = 64;
// decode an enum of either of the following forms
// { _enum: ['A', 'B', 'C'] }
// { _enum: { A: AccountId, B: Balance, C: u32 } }
function _decodeEnum (value: TypeDef, details: string[] | Record<string, string>): TypeDef {
function _decodeEnum (value: TypeDef, details: string[] | Record<string, string>, count: number): TypeDef {
value.info = TypeDefInfo.Enum;
// not as pretty, but remain compatible with oo7 for both struct and Array types
@@ -24,7 +31,7 @@ function _decodeEnum (value: TypeDef, details: string[] | Record<string, string>
}))
: Object.entries(details).map(([name, type]): TypeDef =>
// eslint-disable-next-line @typescript-eslint/no-use-before-define
getTypeDef(type || 'Null', { name })
getTypeDef(type || 'Null', { name }, count)
);
return value;
@@ -50,13 +57,13 @@ function _decodeSet (value: TypeDef, details: Record<string, number>): TypeDef {
// decode a struct, set or enum
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function _decodeStruct (value: TypeDef, type: string, _: string): TypeDef {
function _decodeStruct (value: TypeDef, type: string, _: string, count: number): TypeDef {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const parsed: Record<string, any> = JSON.parse(type);
const keys = Object.keys(parsed);
if (keys.length === 1 && keys[0] === '_enum') {
return _decodeEnum(value, parsed[keys[0]]);
return _decodeEnum(value, parsed[keys[0]], count);
} else if (keys.length === 1 && keys[0] === '_set') {
return _decodeSet(value, parsed[keys[0]]);
}
@@ -66,7 +73,7 @@ function _decodeStruct (value: TypeDef, type: string, _: string): TypeDef {
: undefined;
value.sub = keys.filter((name) => !['_alias'].includes(name)).map((name): TypeDef =>
// eslint-disable-next-line @typescript-eslint/no-use-before-define
getTypeDef(parsed[name], { name })
getTypeDef(parsed[name], { name }, count)
);
return value;
@@ -74,7 +81,7 @@ function _decodeStruct (value: TypeDef, type: string, _: string): TypeDef {
// decode a fixed vector, e.g. [u8;32]
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function _decodeFixedVec (value: TypeDef, type: string, _: string): TypeDef {
function _decodeFixedVec (value: TypeDef, type: string, _: string, count: number): TypeDef {
const [vecType, strLength, displayName] = type.substr(1, type.length - 2).split(';');
const length = parseInt(strLength.trim(), 10);
@@ -84,18 +91,18 @@ function _decodeFixedVec (value: TypeDef, type: string, _: string): TypeDef {
value.displayName = displayName;
value.length = length;
// eslint-disable-next-line @typescript-eslint/no-use-before-define
value.sub = getTypeDef(vecType);
value.sub = getTypeDef(vecType, {}, count);
return value;
}
// decode a tuple
function _decodeTuple (value: TypeDef, _: string, subType: string): TypeDef {
function _decodeTuple (value: TypeDef, _: string, subType: string, count: number): TypeDef {
value.sub = subType.length === 0
? []
: typeSplit(subType).map((inner): TypeDef =>
// eslint-disable-next-line @typescript-eslint/no-use-before-define
getTypeDef(inner)
getTypeDef(inner, {}, count)
);
return value;
@@ -103,7 +110,7 @@ function _decodeTuple (value: TypeDef, _: string, subType: string): TypeDef {
// decode a Int/UInt<bitLength[, name]>
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function _decodeInt (value: TypeDef, type: string, _: string, clazz: 'Int' | 'UInt' = 'Int'): TypeDef {
function _decodeAnyInt (value: TypeDef, type: string, _: string, clazz: 'Int' | 'UInt'): TypeDef {
const [strLength, displayName] = type.substr(clazz.length + 1, type.length - clazz.length - 1 - 1).split(',');
const length = parseInt(strLength.trim(), 10);
@@ -116,8 +123,12 @@ function _decodeInt (value: TypeDef, type: string, _: string, clazz: 'Int' | 'UI
return value;
}
function _decodeInt (value: TypeDef, type: string, subType: string): TypeDef {
return _decodeAnyInt(value, type, subType, 'Int');
}
function _decodeUInt (value: TypeDef, type: string, subType: string): TypeDef {
return _decodeInt(value, type, subType, 'UInt');
return _decodeAnyInt(value, type, subType, 'UInt');
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -139,7 +150,7 @@ function hasWrapper (type: string, [start, end]: [string, string, TypeDefInfo, a
return true;
}
const nestedExtraction: [string, string, TypeDefInfo, (value: TypeDef, type: string, subType: string) => TypeDef][] = [
const nestedExtraction: [string, string, TypeDefInfo, (value: TypeDef, type: string, subType: string, count: number) => TypeDef][] = [
['[', ']', TypeDefInfo.VecFixed, _decodeFixedVec],
['{', '}', TypeDefInfo.Struct, _decodeStruct],
['(', ')', TypeDefInfo.Tuple, _decodeTuple],
@@ -164,15 +175,17 @@ function extractSubType (type: string, [start, end]: [string, string, TypeDefInf
return type.substr(start.length, type.length - start.length - end.length);
}
interface TypeDefOptions {
name?: string;
displayName?: string;
}
export function getTypeDef (_type: string, { displayName, name }: TypeDefOptions = {}): TypeDef {
export function getTypeDef (_type: string, { displayName, name }: TypeDefOptions = {}, count = 0): TypeDef {
// create the type via Type, allowing types to be sanitized
const type = sanitize(_type);
const value: TypeDef = { displayName, info: TypeDefInfo.Plain, name, type };
if (++count === MAX_NESTED) {
console.warn('getTypeDef: Maximum nested limit reached');
return value;
}
const nested = nestedExtraction.find((nested): boolean =>
hasWrapper(type, nested)
);
@@ -180,7 +193,7 @@ export function getTypeDef (_type: string, { displayName, name }: TypeDefOptions
if (nested) {
value.info = nested[2];
return nested[3](value, type, extractSubType(type, nested));
return nested[3](value, type, extractSubType(type, nested), count);
}
const wrapped = wrappedExtraction.find((wrapped): boolean =>
@@ -189,7 +202,7 @@ export function getTypeDef (_type: string, { displayName, name }: TypeDefOptions
if (wrapped) {
value.info = wrapped[2];
value.sub = getTypeDef(extractSubType(type, wrapped));
value.sub = getTypeDef(extractSubType(type, wrapped), {}, count);
}
return value;
+29 -1
View File
@@ -76,7 +76,35 @@ describe('TypeRegistry', (): void => {
expect((first as any).next.unwrap().next.isSome).toBe(false);
});
it('can register cross-referencing types ()', (): void => {
it('can register non-embedded recursive types', (): void => {
registry.register({
Operation: {
data: 'OperationData'
},
OperationData: {
ops: 'Vec<Operation>'
},
Rule: {
data: 'RuleData'
},
RuleData: {
ops: 'Vec<Operation>'
}
});
expect(registry.hasDef('Rule')).toBe(true);
expect(registry.hasClass('Rule')).toBe(false);
const Rule = registry.getOrThrow('Rule');
expect(registry.hasClass('Rule')).toBe(true);
const instance = new Rule(registry);
expect(instance.toRawType()).toEqual('{"data":"RuleData"}');
});
it('can register cross-referencing types', (): void => {
registry.register({
A: {
next: 'B'
+9 -1
View File
@@ -153,7 +153,7 @@ export class TypeRegistry implements Registry {
/**
* @description Creates an instance of a type as registered
*/
public createType <K extends keyof InterfaceTypes> (type: K, ...params: any[]): InterfaceTypes[K] {
public createType <K extends keyof InterfaceTypes> (type: K, ...params: unknown[]): InterfaceTypes[K] {
return createType(this, type, ...params);
}
@@ -225,6 +225,14 @@ export class TypeRegistry implements Registry {
return this.#chainProperties;
}
public getClassName (clazz: Constructor): string | undefined {
const entry = [...this.#classes.entries()].find(([, test]) => test === clazz);
return entry
? entry[0]
: undefined;
}
public getDefinition (name: string): string | undefined {
return this.#definitions.get(name);
}
@@ -0,0 +1,8 @@
// Copyright 2017-2020 @polkadot/types authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
export default {
extra: {},
types: {}
};
@@ -4,29 +4,13 @@
import { ExtDef } from './types';
import EmptyCheck from './emptyCheck';
export default {
LimitParathreadCommits: {
extra: {},
types: {}
},
OnlyStakingAndClaims: {
extra: {},
types: {}
},
PrevalidateAttests: {
extra: {},
types: {}
},
RestrictFunctionality: {
extra: {},
types: {}
},
TransactionCallFilter: {
extra: {},
types: {}
},
ValidateDoubleVoteReports: {
extra: {},
types: {}
}
LimitParathreadCommits: EmptyCheck,
OnlyStakingAndClaims: EmptyCheck,
PrevalidateAttests: EmptyCheck,
RestrictFunctionality: EmptyCheck,
TransactionCallFilter: EmptyCheck,
ValidateDoubleVoteReports: EmptyCheck
} as ExtDef;
@@ -4,6 +4,17 @@
import { ExtDef } from './types';
import EmptyCheck from './emptyCheck';
const CheckMortality = {
extra: {
blockHash: 'Hash'
},
types: {
era: 'ExtrinsicEra'
}
};
export default {
ChargeTransactionPayment: {
extra: {},
@@ -11,24 +22,15 @@ export default {
tip: 'Compact<Balance>'
}
},
CheckBlockGasLimit: {
extra: {},
types: {}
},
CheckEra: {
extra: {
blockHash: 'Hash'
},
types: {
era: 'ExtrinsicEra'
}
},
CheckBlockGasLimit: EmptyCheck,
CheckEra: CheckMortality,
CheckGenesis: {
extra: {
genesisHash: 'Hash'
},
types: {}
},
CheckMortality,
CheckNonce: {
extra: {},
types: {
@@ -53,16 +55,7 @@ export default {
},
types: {}
},
CheckWeight: {
extra: {},
types: {}
},
LockStakingStatus: {
extra: {},
types: {}
},
ValidateEquivocationReport: {
extra: {},
types: {}
}
CheckWeight: EmptyCheck,
LockStakingStatus: EmptyCheck,
ValidateEquivocationReport: EmptyCheck
} as ExtDef;
+1 -9
View File
@@ -24,15 +24,7 @@ describe('Block', (): void => {
).toEqual(
// each of the containing structures have been stringified on their own
JSON.stringify({
header: JSON.stringify({
parentHash: 'H256',
number: 'Compact<u32>',
stateRoot: 'H256',
extrinsicsRoot: 'H256',
digest: JSON.stringify({
logs: 'Vec<{"_enum":{"Other":"Bytes","AuthoritiesChange":"Vec<AccountId>","ChangesTrieRoot":"H256","SealV0":"(u64,H512)","Consensus":"(u32,Bytes)","Seal":"(u32,Bytes)","PreRuntime":"(u32,Bytes)"}}>'
})
}),
header: 'Header',
extrinsics: 'Vec<Extrinsic>'
})
);
@@ -21,10 +21,15 @@ export default {
},
BabeAuthorityWeight: 'u64',
BabeBlockWeight: 'u32',
BabeEquivocationProof: {
offender: 'AuthorityId',
slotNumber: 'SlotNumber',
firstHeader: 'Header',
secondHeader: 'Header'
},
BabeWeight: 'u64',
MaybeRandomness: 'Option<Randomness>',
MaybeVrf: 'Option<VrfData>',
// TODO Remove as soon as merged and metadata static updated
BabeWeight: 'u64',
EpochAuthorship: {
primary: 'Vec<u64>',
secondary: 'Vec<u64>'
+10 -1
View File
@@ -4,7 +4,8 @@
import { ITuple } from '@polkadot/types/types';
import { Enum, Option, Struct, U8aFixed, Vec } from '@polkadot/types/codec';
import { u32, u64 } from '@polkadot/types/primitive';
import { Hash } from '@polkadot/types/interfaces/runtime';
import { AuthorityId } from '@polkadot/types/interfaces/consensus';
import { Hash, Header } from '@polkadot/types/interfaces/runtime';
/** @name AllowedSlots */
export interface AllowedSlots extends Enum {
@@ -19,6 +20,14 @@ export interface BabeAuthorityWeight extends u64 {}
/** @name BabeBlockWeight */
export interface BabeBlockWeight extends u32 {}
/** @name BabeEquivocationProof */
export interface BabeEquivocationProof extends Struct {
readonly offender: AuthorityId;
readonly slotNumber: SlotNumber;
readonly firstHeader: Header;
readonly secondHeader: Header;
}
/** @name BabeWeight */
export interface BabeWeight extends u64 {}
@@ -30,9 +30,6 @@ export default {
BalanceStatus: {
_enum: ['Free', 'Reserved']
},
ReleasesBalances: {
_enum: ['V1_0_0', 'V2_0_0']
},
Reasons: {
_enum: ['Fee', 'Misc', 'All']
},
@@ -40,12 +40,6 @@ export interface Reasons extends Enum {
readonly isAll: boolean;
}
/** @name ReleasesBalances */
export interface ReleasesBalances extends Enum {
readonly isV100: boolean;
readonly isV200: boolean;
}
/** @name VestingSchedule */
export interface VestingSchedule extends Struct {
readonly offset: Balance;
@@ -39,6 +39,7 @@ export { default as vesting } from './vesting/definitions';
export { default as attestations } from './attestations/definitions';
export { default as claims } from './claims/definitions';
export { default as parachains } from './parachains/definitions';
export { default as poll } from './poll/definitions';
// pull in metadata & rpc last, assuming that is uses info from above
export { default as metadata } from './metadata/definitions';
@@ -96,9 +96,6 @@ export default {
delay: 'BlockNumber',
tally: 'Tally'
},
ReleasesDemocracy: {
_enum: ['V1']
},
Tally: {
ayes: 'Balance',
nays: 'Balance',
@@ -112,11 +112,6 @@ export interface ReferendumStatus extends Struct {
readonly tally: Tally;
}
/** @name ReleasesDemocracy */
export interface ReleasesDemocracy extends Enum {
readonly isV1: boolean;
}
/** @name Tally */
export interface Tally extends Struct {
readonly ayes: Balance;
@@ -19,17 +19,17 @@ export default {
AuthorityIndex: 'u64',
AuthorityList: 'Vec<NextAuthority>',
AuthorityWeight: 'u64',
Equivocation: {
GrandpaEquivocation: {
_enum: {
Prevote: 'GrandpaEquivocation',
Precommit: 'GrandpaEquivocation'
Prevote: 'GrandpaEquivocationValue',
Precommit: 'GrandpaEquivocationValue'
}
},
EquivocationProof: {
GrandpaEquivocationProof: {
setId: 'SetId',
equivocation: 'Equivocation'
equivocation: 'GrandpaEquivocation'
},
GrandpaEquivocation: {
GrandpaEquivocationValue: {
roundNumber: 'u64',
identity: 'AuthorityId',
first: '(GrandpaPrevote, AuthoritySignature)',
+15 -15
View File
@@ -18,22 +18,22 @@ export interface AuthorityList extends Vec<NextAuthority> {}
/** @name AuthorityWeight */
export interface AuthorityWeight extends u64 {}
/** @name Equivocation */
export interface Equivocation extends Enum {
readonly isPrevote: boolean;
readonly asPrevote: GrandpaEquivocation;
readonly isPrecommit: boolean;
readonly asPrecommit: GrandpaEquivocation;
}
/** @name EquivocationProof */
export interface EquivocationProof extends Struct {
readonly setId: SetId;
readonly equivocation: Equivocation;
}
/** @name GrandpaEquivocation */
export interface GrandpaEquivocation extends Struct {
export interface GrandpaEquivocation extends Enum {
readonly isPrevote: boolean;
readonly asPrevote: GrandpaEquivocationValue;
readonly isPrecommit: boolean;
readonly asPrecommit: GrandpaEquivocationValue;
}
/** @name GrandpaEquivocationProof */
export interface GrandpaEquivocationProof extends Struct {
readonly setId: SetId;
readonly equivocation: GrandpaEquivocation;
}
/** @name GrandpaEquivocationValue */
export interface GrandpaEquivocationValue extends Struct {
readonly roundNumber: u64;
readonly identity: AuthorityId;
readonly first: ITuple<[GrandpaPrevote, AuthoritySignature]>;
@@ -0,0 +1,15 @@
// Copyright 2017-2020 @polkadot/types authors & contributors
// This software may be modified and distributed under the terms
// of the Apache-2.0 license. See the LICENSE file for details.
// order important in structs... :)
/* eslint-disable sort-keys */
import { Definitions } from '../../types';
export default {
rpc: {},
types: {
Approvals: '[bool; 4]'
}
} as Definitions;
@@ -0,0 +1,4 @@
// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
/* eslint-disable */
export * from './types';
@@ -0,0 +1,10 @@
// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
/* eslint-disable */
import { Vec } from '@polkadot/types/codec';
import { bool } from '@polkadot/types/primitive';
/** @name Approvals */
export interface Approvals extends Vec<bool> {}
export type PHANTOM_POLL = 'poll';
@@ -65,6 +65,7 @@ export default {
LookupTarget: 'AccountId',
ModuleId: 'LockIdentifier',
Moment: 'u64',
OpaqueCall: 'Bytes',
Origin: 'DoNotConstruct<Origin>',
Pays: {
_enum: ['Yes', 'No']
@@ -78,6 +79,9 @@ export default {
ProxyType: {
_enum: ['Any', 'NonTransfer', 'Governance', 'Staking']
},
Releases: {
_enum: ['V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10']
},
RuntimeDbWeight: {
read: 'Weight',
write: 'Weight'
@@ -133,6 +133,9 @@ export interface ModuleId extends LockIdentifier {}
/** @name Moment */
export interface Moment extends u64 {}
/** @name OpaqueCall */
export interface OpaqueCall extends Bytes {}
/** @name Origin */
export interface Origin extends DoNotConstruct {}
@@ -171,6 +174,20 @@ export interface ProxyType extends Enum {
readonly isStaking: boolean;
}
/** @name Releases */
export interface Releases extends Enum {
readonly isV1: boolean;
readonly isV2: boolean;
readonly isV3: boolean;
readonly isV4: boolean;
readonly isV5: boolean;
readonly isV6: boolean;
readonly isV7: boolean;
readonly isV8: boolean;
readonly isV9: boolean;
readonly isV10: boolean;
}
/** @name RuntimeDbWeight */
export interface RuntimeDbWeight extends Struct {
readonly read: Weight;
@@ -100,9 +100,6 @@ export default {
PerU16: 'u16',
PhragmenScore: '[u128; 3]',
Points: 'u32',
ReleasesStaking: {
_enum: ['V1_0_0', 'V2_0_0', 'V3_0_0', 'V4_0_0']
},
RewardDestination: {
_enum: [
'Staked',
@@ -136,14 +136,6 @@ export interface PhragmenScore extends Vec<u128> {}
/** @name Points */
export interface Points extends u32 {}
/** @name ReleasesStaking */
export interface ReleasesStaking extends Enum {
readonly isV100: boolean;
readonly isV200: boolean;
readonly isV300: boolean;
readonly isV400: boolean;
}
/** @name RewardDestination */
export interface RewardDestination extends Enum {
readonly isStaked: boolean;
@@ -13,11 +13,20 @@ export default {
OpenTip: {
reason: 'Hash',
who: 'AccountId',
finder: 'Option<OpenTipFinder>',
finder: 'AccountId',
deposit: 'Balance',
closes: 'Option<BlockNumber>',
tips: 'Vec<OpenTipTip>',
findersFee: 'bool'
},
OpenTipTo225: {
reason: 'Hash',
who: 'AccountId',
finder: 'Option<OpenTipFinderTo225>',
closes: 'Option<BlockNumber>',
tips: 'Vec<OpenTipTip>'
},
OpenTipFinder: '(AccountId, Balance)',
OpenTipFinderTo225: '(AccountId, Balance)',
OpenTipTip: '(AccountId, Balance)',
TreasuryProposal: {
proposer: 'AccountId',
@@ -3,23 +3,35 @@
import { ITuple } from '@polkadot/types/types';
import { Option, Struct, Vec } from '@polkadot/types/codec';
import { bool } from '@polkadot/types/primitive';
import { AccountId, Balance, BlockNumber, Hash } from '@polkadot/types/interfaces/runtime';
/** @name OpenTip */
export interface OpenTip extends Struct {
readonly reason: Hash;
readonly who: AccountId;
readonly finder: Option<OpenTipFinder>;
readonly finder: AccountId;
readonly deposit: Balance;
readonly closes: Option<BlockNumber>;
readonly tips: Vec<OpenTipTip>;
readonly findersFee: bool;
}
/** @name OpenTipFinder */
export interface OpenTipFinder extends ITuple<[AccountId, Balance]> {}
/** @name OpenTipFinderTo225 */
export interface OpenTipFinderTo225 extends ITuple<[AccountId, Balance]> {}
/** @name OpenTipTip */
export interface OpenTipTip extends ITuple<[AccountId, Balance]> {}
/** @name OpenTipTo225 */
export interface OpenTipTo225 extends Struct {
readonly reason: Hash;
readonly who: AccountId;
readonly finder: Option<OpenTipFinderTo225>;
readonly closes: Option<BlockNumber>;
readonly tips: Vec<OpenTipTip>;
}
/** @name TreasuryProposal */
export interface TreasuryProposal extends Struct {
readonly proposer: AccountId;
@@ -7,9 +7,6 @@ import { Definitions } from '../../types';
export default {
rpc: {},
types: {
Multiplier: 'Fixed128',
PaymentReleases: {
_enum: ['V1Ancient', 'V2']
}
Multiplier: 'Fixed128'
}
} as Definitions;
@@ -1,16 +1,9 @@
// Auto-generated via `yarn polkadot-types-from-defs`, do not edit
/* eslint-disable */
import { Enum } from '@polkadot/types/codec';
import { Fixed128 } from '@polkadot/types/interfaces/runtime';
/** @name Multiplier */
export interface Multiplier extends Fixed128 {}
/** @name PaymentReleases */
export interface PaymentReleases extends Enum {
readonly isV1Ancient: boolean;
readonly isV2: boolean;
}
export type PHANTOM_TXPAYMENT = 'txpayment';
+1
View File
@@ -33,6 +33,7 @@ export * from './vesting/types';
export * from './attestations/types';
export * from './claims/types';
export * from './parachains/types';
export * from './poll/types';
export * from './metadata/types';
export * from './rpc/types';
export * from './author/types';
+4 -4
View File
@@ -67,11 +67,11 @@ export default class Data extends Enum {
}
get asRaw (): Bytes {
return this._raw as Bytes;
return this.value as Bytes;
}
get asSha256 (): H256 {
return this._raw as H256;
return this.value as H256;
}
get isRaw (): boolean {
@@ -97,7 +97,7 @@ export default class Data extends Enum {
return new Uint8Array(1);
} else if (this.index === 1) {
// don't add the length, just the data
const data = this._raw.toU8a(true);
const data = this.value.toU8a(true);
const length = Math.min(data.length, 32);
const u8a = new Uint8Array(length + 1);
@@ -111,7 +111,7 @@ export default class Data extends Enum {
const u8a = new Uint8Array(33);
u8a.set([this.index + 32], 0);
u8a.set(this._raw.toU8a(), 1);
u8a.set(this.value.toU8a(), 1);
return u8a;
}
+2 -1
View File
@@ -121,9 +121,10 @@ export interface Registry {
findMetaEvent (eventIndex: Uint8Array): Constructor<any>;
createClass <K extends keyof InterfaceTypes> (type: K): Constructor<InterfaceTypes[K]>;
createType <K extends keyof InterfaceTypes> (type: K, ...params: any[]): InterfaceTypes[K];
createType <K extends keyof InterfaceTypes> (type: K, ...params: unknown[]): InterfaceTypes[K];
get <T extends Codec = Codec> (name: string, withUnknown?: boolean): Constructor<T> | undefined;
getChainProperties (): ChainProperties | undefined;
getClassName (clazz: Constructor): string | undefined;
getDefinition (name: string): string | undefined;
getOrThrow <T extends Codec = Codec> (name: string, msg?: string): Constructor<T>;
getOrUnknown <T extends Codec = Codec> (name: string): Constructor<T>;
+1376 -1337
View File
File diff suppressed because it is too large Load Diff