Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc181e2cc3 | ||
|
|
1b8ba41715 | ||
|
|
648be9aecb | ||
|
|
292af97dc9 | ||
|
|
bcdd537214 | ||
|
|
514c5e4825 | ||
|
|
9b9581487d | ||
|
|
d443f31a9a | ||
|
|
3951da5df3 | ||
|
|
5f3a1e5b24 | ||
|
|
b1a6ccd425 | ||
|
|
adc40e581f | ||
|
|
c6b0b0c161 | ||
|
|
bf5b14580b | ||
|
|
088c02862b | ||
|
|
a05980900e | ||
|
|
77019def08 | ||
|
|
ae6a3307b1 | ||
|
|
8cb15c6a87 | ||
|
|
389dbb58a9 | ||
|
|
2d02f61fa7 | ||
|
|
7497ac723f | ||
|
|
711a145e1e |
@@ -0,0 +1,17 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '4 20 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
with:
|
||||
repo-token: ${{ secrets.GH_PAT_BOT }}
|
||||
stale-issue-message: 'This issue has been open for 21 days with no activity and is not labelled as an enhancement. It will be closed in 7 days.'
|
||||
stale-issue-label: 'stale'
|
||||
exempt-issue-labels: '-size-l,-size-m,-size-s,-size-xl,-size-xs,[bug]'
|
||||
days-before-stale: 21
|
||||
days-before-close: 7
|
||||
@@ -1,5 +1,24 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 4.12.1 May 30, 2021
|
||||
|
||||
Upgrade priority: Low. Internal adjustment only, no major external usage changes.
|
||||
|
||||
Changelog:
|
||||
|
||||
- Update `FundInfo` type with Polkadot (Thanks to https://github.com/arjanz)
|
||||
|
||||
Changes:
|
||||
|
||||
- Allow storage queries with default keys values
|
||||
- Align identity `Data` to limit to 32 bytes in the `Raw` enum (as per Substrate)
|
||||
- Align static (test & docs-only) metadata with latest Substrate master
|
||||
- Added 9030 upgrade blocks for Kusama & Westend
|
||||
- Cleanup of Eth pallet RPC definitions
|
||||
- Cleanup README for `@polkadot/rpc-core` (recommended for internal-usage only)
|
||||
- Cleanup internal tests (no dangling handles, cater for Jest 27)
|
||||
|
||||
|
||||
## 4.11.2 May 24, 2021
|
||||
|
||||
Upgrade priority: Low. Recommended where users are having TS mismatches with type definitions created on older versions.
|
||||
|
||||
+5
-5
@@ -20,19 +20,19 @@
|
||||
"lint": "polkadot-dev-run-lint",
|
||||
"clean": "polkadot-dev-clean-build",
|
||||
"postinstall": "polkadot-dev-yarn-only",
|
||||
"test": "polkadot-dev-run-test --coverage --runInBand --testPathIgnorePatterns e2e",
|
||||
"test:one": "polkadot-dev-run-test",
|
||||
"test": "polkadot-dev-run-test --coverage --detectOpenHandles --runInBand --testPathIgnorePatterns e2e",
|
||||
"test:one": "polkadot-dev-run-test --detectOpenHandles",
|
||||
"test:watch": "polkadot-dev-run-test --watch"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.14.3",
|
||||
"@babel/register": "^7.13.16",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/dev": "^0.62.16",
|
||||
"@polkadot/ts": "^0.3.66",
|
||||
"@polkadot/dev": "^0.62.21",
|
||||
"@polkadot/ts": "^0.3.70",
|
||||
"@polkadot/typegen": "workspace:packages/typegen",
|
||||
"@types/jest": "^26.0.23",
|
||||
"copyfiles": "^2.4.1"
|
||||
},
|
||||
"version": "4.11.2"
|
||||
"version": "4.12.1"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/api-contract",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Interfaces for interacting with contracts and contract ABIs",
|
||||
"main": "index.js",
|
||||
@@ -20,10 +20,10 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-contract#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/api": "4.11.2",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/x-rxjs": "^6.5.1",
|
||||
"@polkadot/api": "4.12.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/x-rxjs": "^6.6.1",
|
||||
"bn.js": "^4.11.9"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/api-contract', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/api-contract', version: '4.12.1' };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/api-derive",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Common functions used across Polkadot, derived from RPC calls and storage queries.",
|
||||
"main": "index.js",
|
||||
@@ -20,16 +20,16 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-derive#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/api": "4.11.2",
|
||||
"@polkadot/rpc-core": "4.11.2",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/util-crypto": "^6.5.1",
|
||||
"@polkadot/x-rxjs": "^6.5.1",
|
||||
"@polkadot/api": "4.12.1",
|
||||
"@polkadot/rpc-core": "4.12.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/util-crypto": "^6.6.1",
|
||||
"@polkadot/x-rxjs": "^6.6.1",
|
||||
"bn.js": "^4.11.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/keyring": "^6.5.1",
|
||||
"@polkadot/rpc-provider": "4.11.2"
|
||||
"@polkadot/keyring": "^6.6.1",
|
||||
"@polkadot/rpc-provider": "4.12.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,10 @@ describe('derive', (): void => {
|
||||
api.isReady.subscribe(() => done());
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await api.disconnect();
|
||||
});
|
||||
|
||||
testFunction(api)('accounts', 'idAndIndex', []);
|
||||
testFunction(api)('accounts', 'idToIndex', []);
|
||||
testFunction(api)('accounts', 'indexes', []);
|
||||
@@ -80,7 +84,11 @@ describe('derive', (): void => {
|
||||
});
|
||||
|
||||
beforeAll((done): void => {
|
||||
api.isReady.subscribe((): void => done());
|
||||
api.isReady.subscribe(() => done());
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await api.disconnect();
|
||||
});
|
||||
|
||||
// override
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/api-derive', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/api-derive', version: '4.12.1' };
|
||||
|
||||
+11
-11
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/api",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Promise and RxJS wrappers around the Polkadot JS RPC",
|
||||
"main": "index.js",
|
||||
@@ -20,16 +20,16 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/api#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/api-derive": "4.11.2",
|
||||
"@polkadot/keyring": "^6.5.1",
|
||||
"@polkadot/metadata": "4.11.2",
|
||||
"@polkadot/rpc-core": "4.11.2",
|
||||
"@polkadot/rpc-provider": "4.11.2",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/types-known": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/util-crypto": "^6.5.1",
|
||||
"@polkadot/x-rxjs": "^6.5.1",
|
||||
"@polkadot/api-derive": "4.12.1",
|
||||
"@polkadot/keyring": "^6.6.1",
|
||||
"@polkadot/metadata": "4.12.1",
|
||||
"@polkadot/rpc-core": "4.12.1",
|
||||
"@polkadot/rpc-provider": "4.12.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/types-known": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/util-crypto": "^6.6.1",
|
||||
"@polkadot/x-rxjs": "^6.6.1",
|
||||
"bn.js": "^4.11.9",
|
||||
"eventemitter3": "^4.0.7"
|
||||
}
|
||||
|
||||
@@ -364,14 +364,20 @@ declare module '@polkadot/api/types/consts' {
|
||||
/**
|
||||
* The base amount of currency needed to reserve for creating a multisig execution or to store
|
||||
* a dispatch call for later.
|
||||
*
|
||||
* This is held for an additional storage item whose value size is
|
||||
* `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is
|
||||
* `32 + sizeof(AccountId)` bytes.
|
||||
**/
|
||||
depositBase: BalanceOf & AugmentedConst<ApiType>;
|
||||
/**
|
||||
* The amount of currency needed per unit threshold when creating a multisig execution.
|
||||
*
|
||||
* This is held for adding 32 bytes more into a pre-existing storage value.
|
||||
**/
|
||||
depositFactor: BalanceOf & AugmentedConst<ApiType>;
|
||||
/**
|
||||
* The maximum amount of signatories allowed for a given multisig.
|
||||
* The maximum amount of signatories allowed in the multisig.
|
||||
**/
|
||||
maxSignatories: u16 & AugmentedConst<ApiType>;
|
||||
/**
|
||||
|
||||
@@ -205,6 +205,13 @@ declare module '@polkadot/api/types/errors' {
|
||||
* current schedule.
|
||||
**/
|
||||
CodeTooLarge: AugmentedError<ApiType>;
|
||||
/**
|
||||
* A tombstone exist at the specified address.
|
||||
*
|
||||
* Tombstone cannot be called. Anyone can use `seal_restore_to` in order to revive
|
||||
* the contract, though.
|
||||
**/
|
||||
ContractIsTombstone: AugmentedError<ApiType>;
|
||||
/**
|
||||
* A contract could not be evicted because it has enough balance to pay rent.
|
||||
*
|
||||
@@ -212,6 +219,10 @@ declare module '@polkadot/api/types/errors' {
|
||||
* contract has enough balance to pay for its rent.
|
||||
**/
|
||||
ContractNotEvictable: AugmentedError<ApiType>;
|
||||
/**
|
||||
* No contract was found at the specified address.
|
||||
**/
|
||||
ContractNotFound: AugmentedError<ApiType>;
|
||||
/**
|
||||
* Contract trapped during execution.
|
||||
**/
|
||||
@@ -284,11 +295,6 @@ declare module '@polkadot/api/types/errors' {
|
||||
* is rejected.
|
||||
**/
|
||||
NoChainExtension: AugmentedError<ApiType>;
|
||||
/**
|
||||
* The contract that was called is either no contract at all (a plain account)
|
||||
* or is a tombstone.
|
||||
**/
|
||||
NotCallable: AugmentedError<ApiType>;
|
||||
/**
|
||||
* A buffer outside of sandbox memory was passed to a contract API function.
|
||||
**/
|
||||
@@ -311,6 +317,15 @@ declare module '@polkadot/api/types/errors' {
|
||||
* of a tombstone.
|
||||
**/
|
||||
ReentranceDenied: AugmentedError<ApiType>;
|
||||
/**
|
||||
* The called contract does not have enough balance to pay for its storage.
|
||||
*
|
||||
* The contract ran out of balance and is therefore eligible for eviction into a
|
||||
* tombstone. Anyone can evict the contract by submitting a `claim_surcharge`
|
||||
* extrinsic. Alternatively, a plain balance transfer can be used in order to
|
||||
* increase the contracts funds so that it can be called again.
|
||||
**/
|
||||
RentNotPaid: AugmentedError<ApiType>;
|
||||
/**
|
||||
* A storage modification exhausted the 32bit type that holds the storage size.
|
||||
*
|
||||
|
||||
@@ -24,7 +24,7 @@ import type { AccountId, AccountIndex, AssetId, Balance, BalanceOf, BlockNumber,
|
||||
import type { Scheduled, TaskAddress } from '@polkadot/types/interfaces/scheduler';
|
||||
import type { Keys, SessionIndex } from '@polkadot/types/interfaces/session';
|
||||
import type { Bid, BidKind, SocietyVote, StrikeCount, VouchingStatus } from '@polkadot/types/interfaces/society';
|
||||
import type { ActiveEraInfo, ElectionPhase, EraIndex, EraRewardPoints, Exposure, Forcing, Nominations, ReadySolution, RewardDestination, RoundSnapshot, SeatHolder, SlashingSpans, SolutionOrSnapshotSize, SpanIndex, SpanRecord, StakingLedger, UnappliedSlash, ValidatorPrefs, Voter } from '@polkadot/types/interfaces/staking';
|
||||
import type { ActiveEraInfo, ElectionPhase, ElectionScore, EraIndex, EraRewardPoints, Exposure, Forcing, Nominations, ReadySolution, RewardDestination, RoundSnapshot, SeatHolder, SlashingSpans, SolutionOrSnapshotSize, SpanIndex, SpanRecord, StakingLedger, UnappliedSlash, ValidatorPrefs, Voter } from '@polkadot/types/interfaces/staking';
|
||||
import type { AccountInfo, ConsumedWeight, DigestOf, EventIndex, EventRecord, LastRuntimeUpgradeInfo, Phase } from '@polkadot/types/interfaces/system';
|
||||
import type { Bounty, BountyIndex, OpenTip, TreasuryProposal } from '@polkadot/types/interfaces/treasury';
|
||||
import type { Multiplier } from '@polkadot/types/interfaces/txpayment';
|
||||
@@ -378,6 +378,13 @@ declare module '@polkadot/api/types/storage' {
|
||||
* Only exists when [`Snapshot`] is present.
|
||||
**/
|
||||
desiredTargets: AugmentedQuery<ApiType, () => Observable<Option<u32>>, []> & QueryableStorageEntry<ApiType, []>;
|
||||
/**
|
||||
* The minimum score that each 'untrusted' solution must attain in order to be considered
|
||||
* feasible.
|
||||
*
|
||||
* Can be set via `set_minimum_untrusted_score`.
|
||||
**/
|
||||
minimumUntrustedScore: AugmentedQuery<ApiType, () => Observable<Option<ElectionScore>>, []> & QueryableStorageEntry<ApiType, []>;
|
||||
/**
|
||||
* Current best solution, signed or unsigned, queued to be returned upon `elect`.
|
||||
**/
|
||||
|
||||
@@ -153,7 +153,7 @@ declare module '@polkadot/rpc-core/types.jsonrpc' {
|
||||
**/
|
||||
accounts: AugmentedRpc<() => Observable<Vec<H160>>>;
|
||||
/**
|
||||
* Returns balance of the given account.
|
||||
* Returns the blockNumber
|
||||
**/
|
||||
blockNumber: AugmentedRpc<() => Observable<U256>>;
|
||||
/**
|
||||
|
||||
@@ -19,7 +19,7 @@ import type { AccountId, AccountIndex, AssetId, Balance, BalanceOf, BlockNumber,
|
||||
import type { Period, Priority } from '@polkadot/types/interfaces/scheduler';
|
||||
import type { Keys } from '@polkadot/types/interfaces/session';
|
||||
import type { SocietyJudgement } from '@polkadot/types/interfaces/society';
|
||||
import type { EraIndex, RawSolution, RewardDestination, SolutionOrSnapshotSize, ValidatorPrefs } from '@polkadot/types/interfaces/staking';
|
||||
import type { ElectionScore, EraIndex, RawSolution, RewardDestination, SolutionOrSnapshotSize, ValidatorPrefs } from '@polkadot/types/interfaces/staking';
|
||||
import type { Key } from '@polkadot/types/interfaces/system';
|
||||
import type { BountyIndex } from '@polkadot/types/interfaces/treasury';
|
||||
import type { Timepoint } from '@polkadot/types/interfaces/utility';
|
||||
@@ -699,7 +699,7 @@ declare module '@polkadot/api/types/submittable' {
|
||||
* producer fails to do so, a regular users will be allowed to claim the reward.
|
||||
*
|
||||
* In case of a successful eviction no fees are charged from the sender. However, the
|
||||
* reward is capped by the total amount of rent that was payed by the contract while
|
||||
* reward is capped by the total amount of rent that was paid by the contract while
|
||||
* it was alive.
|
||||
*
|
||||
* If contract is not evicted as a result of this call, [`Error::ContractNotEvictable`]
|
||||
@@ -1222,6 +1222,14 @@ declare module '@polkadot/api/types/submittable' {
|
||||
[key: string]: SubmittableExtrinsicFunction<ApiType>;
|
||||
};
|
||||
electionProviderMultiPhase: {
|
||||
/**
|
||||
* Set a new value for `MinimumUntrustedScore`.
|
||||
*
|
||||
* Dispatch origin must be aligned with `T::ForceOrigin`.
|
||||
*
|
||||
* This check can be turned off by setting the value to `None`.
|
||||
**/
|
||||
setMinimumUntrustedScore: AugmentedSubmittable<(maybeNextScore: Option<ElectionScore> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [Option<ElectionScore>]>;
|
||||
/**
|
||||
* Submit a solution for the unsigned phase.
|
||||
*
|
||||
|
||||
@@ -349,13 +349,12 @@ export abstract class Init<ApiType extends ApiTypes> extends Decorate<ApiType> {
|
||||
}
|
||||
|
||||
this.#healthTimer = setInterval((): void => {
|
||||
this._rpcCore.system.health().toPromise().catch((error) => l.warn(`Health keepalive check failed: ${(error as Error).message}`));
|
||||
this._rpcCore.system.health().toPromise().catch(() => undefined);
|
||||
}, KEEPALIVE_INTERVAL);
|
||||
} catch (_error) {
|
||||
const error = new Error(`FATAL: Unable to initialize the API: ${(_error as Error).message}`);
|
||||
|
||||
l.error(error);
|
||||
l.error(_error);
|
||||
|
||||
this.emit('error', error);
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/api', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/api', version: '4.12.1' };
|
||||
|
||||
@@ -48,6 +48,10 @@ describe('ApiPromise', (): void => {
|
||||
provider = new MockProvider(registry);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
describe('initialization', (): void => {
|
||||
it('Create API instance with metadata map and makes the runtime, rpc, state & extrinsics available', async (): Promise<void> => {
|
||||
const rpcData = await provider.send<string>('state_getMetadata', []);
|
||||
@@ -62,6 +66,8 @@ describe('ApiPromise', (): void => {
|
||||
expect(api.query).toBeDefined();
|
||||
expect(api.tx).toBeDefined();
|
||||
expect(api.derive).toBeDefined();
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
|
||||
it('Create API instance without metadata and makes the runtime, rpc, state & extrinsics available', async (): Promise<void> => {
|
||||
@@ -75,6 +81,8 @@ describe('ApiPromise', (): void => {
|
||||
expect(api.query).toBeDefined();
|
||||
expect(api.tx).toBeDefined();
|
||||
expect(api.derive).toBeDefined();
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
|
||||
it('Create API instance will error on failure to await ready', async (): Promise<void> => {
|
||||
@@ -88,12 +96,17 @@ describe('ApiPromise', (): void => {
|
||||
}
|
||||
}
|
||||
|
||||
const api = new ErrorApiPromise();
|
||||
|
||||
try {
|
||||
await new ErrorApiPromise().isReadyOrError;
|
||||
await api.isReadyOrError;
|
||||
|
||||
fail('Expected an error but none occurred.');
|
||||
} catch {
|
||||
// Pass
|
||||
}
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -103,31 +116,35 @@ describe('ApiPromise', (): void => {
|
||||
const SIG = '0x659effefbbe5ab4d7136ebb5084b959eb424e32b862307371be4721ac2c46334245af4f1476c36c5e5aff04396c2fdd2ce561ec90382821d4aa071b559b1db0f';
|
||||
|
||||
it('signs data using a specified keyring', async (): Promise<void> => {
|
||||
const api = new ApiPromise({ provider, registry });
|
||||
const api = await ApiPromise.create({ provider, registry });
|
||||
const sig = await api.sign(aliceEd, TEST);
|
||||
|
||||
expect(
|
||||
await api.sign(aliceEd, TEST)
|
||||
).toEqual(SIG);
|
||||
expect(sig).toEqual(SIG);
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
|
||||
it('signs data using an external signer', async (): Promise<void> => {
|
||||
const api = new ApiPromise({
|
||||
const api = await ApiPromise.create({
|
||||
provider,
|
||||
registry,
|
||||
signer: new SingleAccountSigner(registry, aliceEd)
|
||||
});
|
||||
const sig = await api.sign(ADDR, TEST);
|
||||
|
||||
expect(
|
||||
await api.sign(ADDR, TEST)
|
||||
).toEqual(SIG);
|
||||
expect(sig).toEqual(SIG);
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
});
|
||||
|
||||
describe('decorator.signAsync', (): void => {
|
||||
it('signs a transfer using an external signer', async (): Promise<void> => {
|
||||
const { transfer } = await createTransfer();
|
||||
const { api, transfer } = await createTransfer();
|
||||
|
||||
expect(transfer.signature.toHex()).toEqual(TRANSFER_SIG);
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -137,6 +154,8 @@ describe('ApiPromise', (): void => {
|
||||
|
||||
expect(api.tx(transfer.toHex()).signature.toHex()).toEqual(TRANSFER_SIG);
|
||||
expect(api.tx(transfer).signature.toHex()).toEqual(TRANSFER_SIG);
|
||||
|
||||
await api.disconnect();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
// Copyright 2017-2021 @polkadot/api authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { Observable } from '@polkadot/x-rxjs';
|
||||
import type { SubmittableExtrinsic } from '../submittable/types';
|
||||
|
||||
import { createTestPairs } from '@polkadot/keyring/testingPairs';
|
||||
import { MockProvider } from '@polkadot/rpc-provider/mock';
|
||||
import { TypeRegistry } from '@polkadot/types/create';
|
||||
import { map, switchMap } from '@polkadot/x-rxjs/operators';
|
||||
|
||||
import { SingleAccountSigner } from '../../test/util';
|
||||
import { ApiRx } from '.';
|
||||
|
||||
describe('ApiRx', (): void => {
|
||||
const registry = new TypeRegistry();
|
||||
const keyring = createTestPairs({ type: 'ed25519' });
|
||||
let provider: MockProvider;
|
||||
|
||||
beforeEach((): void => {
|
||||
jest.setTimeout(3000000);
|
||||
provider = new MockProvider(registry);
|
||||
});
|
||||
|
||||
describe('decorator.signAsync', (): void => {
|
||||
it('signs a transfer using an external signer', (): void => {
|
||||
const signer = new SingleAccountSigner(registry, keyring.alice_session);
|
||||
|
||||
ApiRx.create({ provider, registry, signer }).pipe(
|
||||
switchMap((api: ApiRx): Observable<SubmittableExtrinsic<'rxjs'>> =>
|
||||
api.tx.balances
|
||||
.transfer(keyring.eve.address, 12345)
|
||||
.signAsync(keyring.alice_session, {})
|
||||
),
|
||||
map((tx: SubmittableExtrinsic<'rxjs'>): void => {
|
||||
expect(tx.signature.toHex()).toEqual(
|
||||
'0x97f3cfe5088fcd575313e983f45d02b0f630e7b94ff9a3ac50e20cd096a8f554fda73d42ead891b5a1d3ce5607d83f20b0c6570b555e949cfb5763d0abcd590b'
|
||||
);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('allows the second argument to signAsync to be omitted', () => {
|
||||
const signer = new SingleAccountSigner(registry, keyring.alice_session);
|
||||
|
||||
ApiRx.create({ provider, registry, signer }).pipe(
|
||||
switchMap((api: ApiRx): Observable<SubmittableExtrinsic<'rxjs'>> =>
|
||||
api.tx.balances
|
||||
.transfer(keyring.eve.address, 12345)
|
||||
.signAsync(keyring.alice_session)
|
||||
),
|
||||
map((tx: SubmittableExtrinsic<'rxjs'>): void => {
|
||||
expect(tx.signature.toHex()).toEqual(
|
||||
'0x97f3cfe5088fcd575313e983f45d02b0f630e7b94ff9a3ac50e20cd096a8f554fda73d42ead891b5a1d3ce5607d83f20b0c6570b555e949cfb5763d0abcd590b'
|
||||
);
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -3,21 +3,24 @@
|
||||
|
||||
import { ApiPromise, WsProvider } from '@polkadot/api';
|
||||
|
||||
function createApi (): Promise<ApiPromise> {
|
||||
jest.setTimeout(30000);
|
||||
process.env.NODE_ENV = 'test';
|
||||
describe('misc online tests', (): void => {
|
||||
let api: ApiPromise;
|
||||
|
||||
const provider = new WsProvider('wss://kusama-rpc.polkadot.io');
|
||||
// const provider = new WsProvider('wss://westend-rpc.polkadot.io/');
|
||||
// const provider = new WsProvider('ws://127.0.0.1:9944/');
|
||||
beforeEach(async () => {
|
||||
jest.setTimeout(30000);
|
||||
process.env.NODE_ENV = 'test';
|
||||
|
||||
return new ApiPromise({ provider }).isReady;
|
||||
}
|
||||
// const provider = new WsProvider('wss://kusama-rpc.polkadot.io');
|
||||
const provider = new WsProvider('wss://westend-rpc.polkadot.io/');
|
||||
|
||||
api = await ApiPromise.create({ provider });
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await api.disconnect();
|
||||
});
|
||||
|
||||
describe('misc quick tests', (): void => {
|
||||
it.skip('retrieves balances correctly', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
|
||||
console.error(JSON.stringify(
|
||||
await api.query.system.account('FPzukZw2mphWsXDqdkNzLaxnanjZEWH9i2vqwobTdtde5me')
|
||||
));
|
||||
@@ -27,8 +30,6 @@ describe('misc quick tests', (): void => {
|
||||
});
|
||||
|
||||
it.skip('handles map keys', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
|
||||
console.time('map.keys');
|
||||
|
||||
const keys = await api.query.system.account.keys();
|
||||
@@ -39,8 +40,6 @@ describe('misc quick tests', (): void => {
|
||||
});
|
||||
|
||||
it.skip('handles map entries', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
|
||||
console.time('map.entries');
|
||||
|
||||
const entries = await api.query.system.account.entries(); // api.query.indices.accounts.entries();
|
||||
@@ -51,7 +50,6 @@ describe('misc quick tests', (): void => {
|
||||
});
|
||||
|
||||
it.skip('handles doublemap entries', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
const activeEra = await api.query.staking.activeEra();
|
||||
|
||||
console.error(JSON.stringify(
|
||||
@@ -60,26 +58,12 @@ describe('misc quick tests', (): void => {
|
||||
});
|
||||
|
||||
it.skip('does something in society', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
|
||||
console.error(JSON.stringify(
|
||||
await api.query.society.defenderVotes('Dab4bfYTZRUDMWjYAUQuFbDreQ9mt7nULWu3Dw7jodbzVe9')
|
||||
));
|
||||
});
|
||||
|
||||
it.skip('allows for range queries', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
const header = await api.rpc.chain.getHeader();
|
||||
|
||||
console.error(JSON.stringify(
|
||||
(await api.query.staking.activeEra.range([header.parentHash, header.hash], 'Dab4bfYTZRUDMWjYAUQuFbDreQ9mt7nULWu3Dw7jodbzVe9'))
|
||||
.map(([block, value]) => [block, value.toRawType(), value.toHuman()])
|
||||
));
|
||||
});
|
||||
|
||||
it('expose rpc and rx definition', async (): Promise<void> => {
|
||||
const api = await createApi();
|
||||
|
||||
it('expose rpc and rx definition', (): void => {
|
||||
console.error(api.rpc.payment.queryFeeDetails.meta);
|
||||
|
||||
console.error(api.rx.rpc.chain.getBlock.meta);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/metadata",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Helpers to extract information from runtime metadata",
|
||||
"main": "index.js",
|
||||
@@ -20,13 +20,13 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/type-metadata#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/types-known": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/util-crypto": "^6.5.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/types-known": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/util-crypto": "^6.6.1",
|
||||
"bn.js": "^4.11.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/keyring": "^6.5.1"
|
||||
"@polkadot/keyring": "^6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright 2017-2021 @polkadot/metadata authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import type { StorageEntryMetadataLatest } from '@polkadot/types/interfaces/metadata';
|
||||
import type { StorageEntryMetadataLatest, StorageHasher } from '@polkadot/types/interfaces/metadata';
|
||||
import type { StorageEntry } from '@polkadot/types/primitive/types';
|
||||
import type { Codec, Registry } from '@polkadot/types/types';
|
||||
|
||||
@@ -9,7 +9,7 @@ import BN from 'bn.js';
|
||||
|
||||
import { Raw } from '@polkadot/types/codec';
|
||||
import { StorageKey, Type } from '@polkadot/types/primitive';
|
||||
import { assert, compactAddLength, compactStripLength, isNull, isUndefined, stringCamelCase, stringify, stringLowerFirst, u8aConcat, u8aToU8a } from '@polkadot/util';
|
||||
import { assert, compactAddLength, compactStripLength, isUndefined, stringCamelCase, stringLowerFirst, u8aConcat, u8aToU8a } from '@polkadot/util';
|
||||
import { xxhashAsU8a } from '@polkadot/util-crypto';
|
||||
|
||||
import { getHasher } from './getHasher';
|
||||
@@ -31,33 +31,27 @@ interface IterFn {
|
||||
meta: StorageEntryMetadataLatest;
|
||||
}
|
||||
|
||||
type CreateArgType = boolean | string | number | null | BN | BigInt | Uint8Array | Codec;
|
||||
|
||||
type U8aHasher = (input: Uint8Array) => Uint8Array;
|
||||
|
||||
function createPrefixedKey ({ method, prefix }: CreateItemFn): Uint8Array {
|
||||
return u8aConcat(xxhashAsU8a(prefix, 128), xxhashAsU8a(method, 128));
|
||||
}
|
||||
|
||||
function createKeyRaw (registry: Registry, itemFn: CreateItemFn, keys: Type[], hashers: U8aHasher[], args: CreateArgType[]): Uint8Array {
|
||||
const { method, section } = itemFn;
|
||||
type Arg = boolean | string | number | null | BN | BigInt | Uint8Array | Codec;
|
||||
|
||||
/** @internal */
|
||||
function createKeyRaw (registry: Registry, itemFn: CreateItemFn, keys: Type[], hashers: StorageHasher[], args: Arg[]): Uint8Array {
|
||||
return u8aConcat(
|
||||
createPrefixedKey(itemFn),
|
||||
...keys.map((type, index): Uint8Array => {
|
||||
const arg = args[index];
|
||||
|
||||
assert(!isUndefined(arg) && !isNull(arg), () => `Call to ${stringCamelCase(section || 'unknown')}.${stringCamelCase(method || 'unknown')} has a null or undefined argument at position ${index}`);
|
||||
|
||||
return hashers[index](registry.createType(type.toString() as 'Raw', arg).toU8a());
|
||||
})
|
||||
xxhashAsU8a(itemFn.prefix, 128),
|
||||
xxhashAsU8a(itemFn.method, 128),
|
||||
...keys.map((type, index) =>
|
||||
getHasher(hashers[index])(
|
||||
registry.createType(type.toString() as 'Raw', args[index]).toU8a()
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function createKey (registry: Registry, itemFn: CreateItemFn, keys: Type[], hashers: U8aHasher[], args: CreateArgType[]): Uint8Array {
|
||||
/** @internal */
|
||||
function createKey (registry: Registry, itemFn: CreateItemFn, keys: Type[], hashers: StorageHasher[], args: Arg[]): Uint8Array {
|
||||
const { method, section } = itemFn;
|
||||
|
||||
assert(Array.isArray(args) && args.length === keys.length, () => `Call to ${stringCamelCase(section || 'unknown')}.${stringCamelCase(method || 'unknown')} needs ${keys.length} arguments, found ${stringify(args)}`);
|
||||
assert(Array.isArray(args), () => `Call to ${stringCamelCase(section || 'unknown')}.${stringCamelCase(method || 'unknown')} needs ${keys.length} arguments, provided in tuple format`);
|
||||
assert(args.filter((a) => !isUndefined(a)).length === keys.length, () => `Call to ${stringCamelCase(section || 'unknown')}.${stringCamelCase(method || 'unknown')} needs ${keys.length} arguments, found [${args.join(', ')}]`);
|
||||
|
||||
// as per createKey, always add the length prefix (underlying it is Bytes)
|
||||
return compactAddLength(
|
||||
@@ -65,9 +59,8 @@ function createKey (registry: Registry, itemFn: CreateItemFn, keys: Type[], hash
|
||||
);
|
||||
}
|
||||
|
||||
// attach the metadata to expand to a StorageFunction
|
||||
/** @internal */
|
||||
function expandWithMeta ({ meta, method, prefix, section }: CreateItemFn, _storageFn: (arg?: CreateArgType | CreateArgType[]) => Uint8Array): StorageEntry {
|
||||
function expandWithMeta ({ meta, method, prefix, section }: CreateItemFn, _storageFn: (arg?: Arg | Arg[]) => Uint8Array): StorageEntry {
|
||||
const storageFn = _storageFn as StorageEntry;
|
||||
|
||||
storageFn.meta = meta;
|
||||
@@ -107,7 +100,6 @@ function extendHeadMeta (registry: Registry, { meta: { documentation, name, type
|
||||
registry.createType('StorageKey', iterFn(...args), { method, section });
|
||||
}
|
||||
|
||||
// attach the full list hashing for prefixed maps
|
||||
/** @internal */
|
||||
function extendPrefixedMap (registry: Registry, itemFn: CreateItemFn, storageFn: StorageEntry): StorageEntry {
|
||||
const { meta: { type }, method, section } = itemFn;
|
||||
@@ -124,16 +116,16 @@ function extendPrefixedMap (registry: Registry, itemFn: CreateItemFn, storageFn:
|
||||
|
||||
if (args.length) {
|
||||
if (type.isDoubleMap) {
|
||||
return new Raw(registry, createKeyRaw(registry, itemFn, [type.asDoubleMap.key1], [getHasher(type.asDoubleMap.hasher)], args as CreateArgType[]));
|
||||
return new Raw(registry, createKeyRaw(registry, itemFn, [type.asDoubleMap.key1], [type.asDoubleMap.hasher], args as Arg[]));
|
||||
} else if (type.isNMap) {
|
||||
const keys = [...type.asNMap.keyVec];
|
||||
const hashers = type.asNMap.hashers.map((h) => getHasher(h));
|
||||
const hashers = [...type.asNMap.hashers];
|
||||
|
||||
// remove the last entry
|
||||
keys.pop();
|
||||
hashers.pop();
|
||||
|
||||
return new Raw(registry, createKeyRaw(registry, itemFn, keys, hashers, args as CreateArgType[]));
|
||||
return new Raw(registry, createKeyRaw(registry, itemFn, keys, hashers, args as Arg[]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,16 +143,16 @@ export function createFunction (registry: Registry, itemFn: CreateItemFn, option
|
||||
// - storage.system.account(address)
|
||||
// - storage.timestamp.blockPeriod()
|
||||
// For higher-map queries the params are passed in as an tuple, [key1, key2]
|
||||
const storageFn = expandWithMeta(itemFn, (arg?: CreateArgType | CreateArgType[]) =>
|
||||
const storageFn = expandWithMeta(itemFn, (arg?: Arg | Arg[]) =>
|
||||
type.isPlain
|
||||
? options.skipHashing
|
||||
? compactAddLength(u8aToU8a(options.key))
|
||||
: createKey(registry, itemFn, [], [], [])
|
||||
: type.isMap
|
||||
? createKey(registry, itemFn, [type.asMap.key], [getHasher(type.asMap.hasher)], [arg as CreateArgType])
|
||||
? createKey(registry, itemFn, [type.asMap.key], [type.asMap.hasher], [arg as Arg])
|
||||
: type.isDoubleMap
|
||||
? createKey(registry, itemFn, [type.asDoubleMap.key1, type.asDoubleMap.key2], [getHasher(type.asDoubleMap.hasher), getHasher(type.asDoubleMap.key2Hasher)], arg as CreateArgType[])
|
||||
: createKey(registry, itemFn, type.asNMap.keyVec, type.asNMap.hashers.map((h) => getHasher(h)), arg as CreateArgType[])
|
||||
? createKey(registry, itemFn, [type.asDoubleMap.key1, type.asDoubleMap.key2], [type.asDoubleMap.hasher, type.asDoubleMap.key2Hasher], arg as Arg[])
|
||||
: createKey(registry, itemFn, type.asNMap.keyVec, type.asNMap.hashers, arg as Arg[])
|
||||
);
|
||||
|
||||
if (type.isMap || type.isDoubleMap || type.isNMap) {
|
||||
|
||||
@@ -12,34 +12,36 @@ import { decorateStorage } from '..';
|
||||
const keyring = createTestPairs({ type: 'ed25519' });
|
||||
|
||||
describe('decorateStorage', (): void => {
|
||||
describe('latest', (): void => {
|
||||
const registry = new TypeRegistry();
|
||||
const metadata = new Metadata(registry, rpcMetadata);
|
||||
const registry = new TypeRegistry();
|
||||
const metadata = new Metadata(registry, rpcMetadata);
|
||||
|
||||
registry.setMetadata(metadata);
|
||||
registry.setMetadata(metadata);
|
||||
|
||||
const query = decorateStorage(registry, metadata.asLatest, metadata.version);
|
||||
const query = decorateStorage(registry, metadata.asLatest, metadata.version);
|
||||
|
||||
it('should throw if the storage function expects an argument', (): void => {
|
||||
expect(() => query.balances.account()).toThrowError('Call to balances.account has a null or undefined argument at position 0');
|
||||
});
|
||||
it('should throw if the storage function expects an argument', (): void => {
|
||||
expect(() => query.balances.account()).toThrowError('Call to balances.account needs 1 arguments, found []');
|
||||
});
|
||||
|
||||
it('should throw if the storage function expects multiple arguments', (): void => {
|
||||
expect(() => query.staking.erasStakers([1])).toThrowError('Call to staking.erasStakers needs 2 arguments, found [1]');
|
||||
});
|
||||
it('should throw if the storage function expects multiple arguments', (): void => {
|
||||
expect(() => query.staking.erasStakers([1])).toThrowError('Call to staking.erasStakers needs 2 arguments, found [1]');
|
||||
});
|
||||
|
||||
it('should return a value if the storage function does not expect an argument', (): void => {
|
||||
expect(() => query.timestamp.now()).not.toThrow();
|
||||
});
|
||||
it('should throw if the storage function expects tuple arguments', (): void => {
|
||||
expect(() => query.staking.erasStakers(1)).toThrowError('Call to staking.erasStakers needs 2 arguments, provided in tuple format');
|
||||
});
|
||||
|
||||
it('should return the correct length-prefixed storage key', (): void => {
|
||||
expect(
|
||||
u8aToHex(
|
||||
query.system.account(keyring.alice.address)
|
||||
)
|
||||
).toEqual(
|
||||
'0x410126aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
|
||||
);
|
||||
});
|
||||
it('should return a value if the storage function does not expect an argument', (): void => {
|
||||
expect(() => query.timestamp.now()).not.toThrow();
|
||||
});
|
||||
|
||||
it('should return the correct length-prefixed storage key', (): void => {
|
||||
expect(
|
||||
u8aToHex(
|
||||
query.system.account(keyring.alice.address)
|
||||
)
|
||||
).toEqual(
|
||||
'0x410126aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/metadata', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/metadata', version: '4.12.1' };
|
||||
|
||||
@@ -1898,6 +1898,20 @@
|
||||
"",
|
||||
" Only exists when [`Snapshot`] is present."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "MinimumUntrustedScore",
|
||||
"modifier": "Optional",
|
||||
"type": {
|
||||
"plain": "ElectionScore"
|
||||
},
|
||||
"fallback": "0x00",
|
||||
"documentation": [
|
||||
" The minimum score that each 'untrusted' solution must attain in order to be considered",
|
||||
" feasible.",
|
||||
"",
|
||||
" Can be set via `set_minimum_untrusted_score`."
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1930,6 +1944,22 @@
|
||||
"",
|
||||
" No deposit or reward is associated with this submission."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "set_minimum_untrusted_score",
|
||||
"args": [
|
||||
{
|
||||
"name": "maybe_next_score",
|
||||
"type": "Option<ElectionScore>"
|
||||
}
|
||||
],
|
||||
"documentation": [
|
||||
" Set a new value for `MinimumUntrustedScore`.",
|
||||
"",
|
||||
" Dispatch origin must be aligned with `T::ForceOrigin`.",
|
||||
"",
|
||||
" This check can be turned off by setting the value to `None`."
|
||||
]
|
||||
}
|
||||
],
|
||||
"events": [
|
||||
@@ -6460,7 +6490,7 @@
|
||||
{
|
||||
"name": "Grandpa",
|
||||
"storage": {
|
||||
"prefix": "GrandpaFinality",
|
||||
"prefix": "Grandpa",
|
||||
"items": [
|
||||
{
|
||||
"name": "State",
|
||||
@@ -7136,7 +7166,7 @@
|
||||
" producer fails to do so, a regular users will be allowed to claim the reward.",
|
||||
"",
|
||||
" In case of a successful eviction no fees are charged from the sender. However, the",
|
||||
" reward is capped by the total amount of rent that was payed by the contract while",
|
||||
" reward is capped by the total amount of rent that was paid by the contract while",
|
||||
" it was alive.",
|
||||
"",
|
||||
" If contract is not evicted as a result of this call, [`Error::ContractNotEvictable`]",
|
||||
@@ -7262,7 +7292,7 @@
|
||||
{
|
||||
"name": "Schedule",
|
||||
"type": "Schedule",
|
||||
"value": "0x040000000002000000010000800000001000000000100000000100002000000020000000004000000000020002000000bb060000c70c0200ea16030019160000571d0000940d0000c7190000f7290000520000000c59010050810200930b000027070000e7070000cd0500008c160000b819000022070000e757b50798060000490600008f090000ca0700009e050000de050000fa050000f9080000d3080000d2080000b1080000aa080000b2080000a1080000f60800001c0900009f0800006f080000af080000320800008d210000ff1d0000b2210000221e0000ca080000d6080000810800008c090000be090000b6090000a40a0000dc080000ae032600000000007a79250000000000bab224000000000056db500000000000469024000000000002ed2400000000008088240000000000d4c02400000000005e8224000000000004aa240000000000f6c1470000000000162d120000000000384b680000000000ef0000000000000060cf430000000000e20200000000000098ca9f20000000005b20000000000000202a872900000000f21c000000000000410d000000000000eafaac0900000000c6eb5c0000000000e4ba88000000000090bcc907000000007e09000000000000e08e1300000000002aea1800000000007e98cb0900000000b802000000000000bad9360800000000f2040c0200000000d505000000000000baa9960a00000000c021eb0f00000000ee0e00000000000000d47808000000005202000000000000080300000000000014c314230000000059200000000000005802000000000000290300000000000009090000000000005abf220000000000db12000000000000202a240000000000f50c00000000000024c61f00000000000c060000000000009a821f0000000000e30500000000000006eb360000000000",
|
||||
"value": "0x0400000000020000000100008000000010000000001000000001000020000000200000000040000000000200020000008e060000e2fc0100cd0f030009170000861d0000030c00001f1800005629000082000000b059010055810200c00b000029070000590800003b060000b8160000a61a0000600700000de8b607b10600007d060000e6090000dc070000d5050000d70500005b06000043090000390900001c0900004d0900001d09000030090000180900004109000038090000680900007d080000f80800008e08000003220000371e0000fd210000e71d0000a6080000ab080000d5080000db090000d8090000190a00001e0b00000c09000052f72400000000006ee52400000000009c212400000000003039500000000000702a240000000000644f240000000000ce3a240000000000dc54240000000000f0182400000000001e31240000000000b0c14700000000009a12120000000000c0406d0000000000f4000000000000007854420000000000e302000000000000f03a7d2000000000672000000000000040a9e729000000002c1e000000000000650f000000000000ac13aa09000000006c835b0000000000c229870000000000dad6c907000000009409000000000000c0681300000000007c0b1900000000000210b20900000000b502000000000000fee1300800000000c274080200000000db050000000000006c548a0a00000000aab1da0f00000000f50e000000000000608b390800000000500200000000000002030000000000008e63f022000000007e2100000000000067020000000000002c030000000000002909000000000000a41f230000000000c3120000000000007ca6230000000000020d00000000000000bd1f00000000001506000000000000a6a81f0000000000fc05000000000000",
|
||||
"documentation": [
|
||||
" Cost schedule and limits."
|
||||
]
|
||||
@@ -7348,7 +7378,7 @@
|
||||
{
|
||||
"name": "DeletionQueueDepth",
|
||||
"type": "u32",
|
||||
"value": "0x71040000",
|
||||
"value": "0x85040000",
|
||||
"documentation": [
|
||||
" The maximum number of tries that can be queued for deletion."
|
||||
]
|
||||
@@ -7443,10 +7473,29 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "NotCallable",
|
||||
"name": "ContractNotFound",
|
||||
"documentation": [
|
||||
" The contract that was called is either no contract at all (a plain account)",
|
||||
" or is a tombstone."
|
||||
" No contract was found at the specified address."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ContractIsTombstone",
|
||||
"documentation": [
|
||||
" A tombstone exist at the specified address.",
|
||||
"",
|
||||
" Tombstone cannot be called. Anyone can use `seal_restore_to` in order to revive",
|
||||
" the contract, though."
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "RentNotPaid",
|
||||
"documentation": [
|
||||
" The called contract does not have enough balance to pay for its storage.",
|
||||
"",
|
||||
" The contract ran out of balance and is therefore eligible for eviction into a",
|
||||
" tombstone. Anyone can evict the contract by submitting a `claim_surcharge`",
|
||||
" extrinsic. Alternatively, a plain balance transfer can be used in order to",
|
||||
" increase the contracts funds so that it can be called again."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -11619,7 +11668,11 @@
|
||||
"value": "0x00f01c0adbed01000000000000000000",
|
||||
"documentation": [
|
||||
" The base amount of currency needed to reserve for creating a multisig execution or to store",
|
||||
" a dispatch call for later."
|
||||
" a dispatch call for later.",
|
||||
"",
|
||||
" This is held for an additional storage item whose value size is",
|
||||
" `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is",
|
||||
" `32 + sizeof(AccountId)` bytes."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -11627,7 +11680,9 @@
|
||||
"type": "BalanceOf",
|
||||
"value": "0x0000cc7b9fae00000000000000000000",
|
||||
"documentation": [
|
||||
" The amount of currency needed per unit threshold when creating a multisig execution."
|
||||
" The amount of currency needed per unit threshold when creating a multisig execution.",
|
||||
"",
|
||||
" This is held for adding 32 bytes more into a pre-existing storage value."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -11635,7 +11690,7 @@
|
||||
"type": "u16",
|
||||
"value": "0x6400",
|
||||
"documentation": [
|
||||
" The maximum amount of signatories allowed for a given multisig."
|
||||
" The maximum amount of signatories allowed in the multisig."
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,72 +1,3 @@
|
||||
# @polkadot/rpc-core
|
||||
|
||||
This library provides a clean wrapper around all the methods exposed by a Polkadot network client.
|
||||
|
||||
## Usage
|
||||
|
||||
Installation -
|
||||
|
||||
```
|
||||
yarn add @polkadot/rpc-core
|
||||
```
|
||||
|
||||
Initialization -
|
||||
|
||||
```js
|
||||
import Rpc from '@polkadot/rpc-core';
|
||||
import { WsProvider } from '@polkadot/rpc-provider/ws';
|
||||
|
||||
const provider = new WsProvider('http://127.0.0.1:9944');
|
||||
const rpc = new Rpc(provider);
|
||||
```
|
||||
|
||||
Retrieving the block header object for a given block header hash (a 0x-prefixed hex string with length of 64) -
|
||||
|
||||
```js
|
||||
rpc.chain
|
||||
.getHeader('0x1234567890')
|
||||
.subscribe(
|
||||
(header) => console.log(header),
|
||||
(error) => console.error('error:', error)
|
||||
);
|
||||
```
|
||||
|
||||
Retrieving the best block number, parent hash, state root hash, extrinsics root hash, and digest (once-off) -
|
||||
|
||||
```js
|
||||
rpc.chain
|
||||
.getHead()
|
||||
.pipe(
|
||||
switchMap((headerHash) => {
|
||||
return rpc.chain.getHeader(headerHash);
|
||||
})
|
||||
)
|
||||
.subscribe(
|
||||
(header) => {
|
||||
console.log(`best #${header.number.toString()}`);
|
||||
console.log(`parentHash: ${header.parentHash.toString()}`);
|
||||
console.log(`stateRoot: ${header.stateRoot.toString()}`);
|
||||
console.log(`extrinsicsRoot: ${header.extrinsicsRoot.toString()}`);
|
||||
console.log(`digest: ${header.digest.toString()}`);
|
||||
},
|
||||
(error) => {
|
||||
console.error('error:', error);
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
Retrieving best header via subscription -
|
||||
|
||||
```js
|
||||
api.chain
|
||||
rpc
|
||||
.subscribeNewHeads()
|
||||
.subscribe(
|
||||
(header) => {
|
||||
console.log(`best #${header.number}`);
|
||||
},
|
||||
(error) => {
|
||||
console.error('error subscribing:', error);
|
||||
}
|
||||
);
|
||||
```
|
||||
This library provides a clean wrapper around all the methods exposed by a Polkadot network client. It is only used internally to the API.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/rpc-core",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "A JavaScript wrapper for the Polkadot JsonRPC interface",
|
||||
"main": "index.js",
|
||||
@@ -20,13 +20,13 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-core#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/metadata": "4.11.2",
|
||||
"@polkadot/rpc-provider": "4.11.2",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/x-rxjs": "^6.5.1"
|
||||
"@polkadot/metadata": "4.12.1",
|
||||
"@polkadot/rpc-provider": "4.12.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/x-rxjs": "^6.6.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/keyring": "^6.5.1"
|
||||
"@polkadot/keyring": "^6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,10 +12,16 @@ import { RpcCore } from '.';
|
||||
describe('Cached Observables', (): void => {
|
||||
const registry = new TypeRegistry();
|
||||
let rpc: RpcCore & RpcInterface;
|
||||
let provider: MockProvider;
|
||||
const keyring = createTestPairs();
|
||||
|
||||
beforeEach((): void => {
|
||||
rpc = new RpcCore('123', registry, new MockProvider(registry)) as (RpcCore & RpcInterface);
|
||||
provider = new MockProvider(registry);
|
||||
rpc = new RpcCore('123', registry, provider) as (RpcCore & RpcInterface);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('creates a single observable for subscriptions (multiple calls)', (): void => {
|
||||
|
||||
@@ -16,8 +16,9 @@ describe('Api', (): void => {
|
||||
).toThrow(/Expected Provider/);
|
||||
});
|
||||
|
||||
it('allows for the definition of user RPCs', (): void => {
|
||||
const rpc = new RpcCore('567', registry, new MockProvider(registry), {
|
||||
it('allows for the definition of user RPCs', async () => {
|
||||
const provider = new MockProvider(registry);
|
||||
const rpc = new RpcCore('567', registry, provider, {
|
||||
testing: {
|
||||
foo: {
|
||||
description: 'foo',
|
||||
@@ -42,5 +43,7 @@ describe('Api', (): void => {
|
||||
section: 'testing',
|
||||
type: 'Balance'
|
||||
});
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/rpc-core', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/rpc-core', version: '4.12.1' };
|
||||
|
||||
@@ -13,9 +13,15 @@ import { RpcCore } from '.';
|
||||
describe('replay', (): void => {
|
||||
const registry = new TypeRegistry();
|
||||
let rpc: RpcCore & RpcInterface;
|
||||
let provider: MockProvider;
|
||||
|
||||
beforeEach((): void => {
|
||||
rpc = new RpcCore('653', registry, new MockProvider(registry)) as (RpcCore & RpcInterface);
|
||||
provider = new MockProvider(registry);
|
||||
rpc = new RpcCore('653', registry, provider) as (RpcCore & RpcInterface);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('subscribes via the rpc section', (done): void => {
|
||||
|
||||
@@ -6,28 +6,39 @@ import { of, timer } from '@polkadot/x-rxjs';
|
||||
import { drr } from '.';
|
||||
|
||||
describe('drr', (): void => {
|
||||
beforeEach((): void => {
|
||||
jest.setTimeout(15000);
|
||||
});
|
||||
|
||||
it('should not fire twice the same value', (done): void => {
|
||||
let count = 0;
|
||||
|
||||
of(1, 1).pipe(drr()).subscribe((): void => { ++count; });
|
||||
const sub = of(1, 1).pipe(drr({ delay: 500 })).subscribe((): void => { ++count; });
|
||||
|
||||
setTimeout((): void => {
|
||||
expect(count).toBe(1);
|
||||
done();
|
||||
sub.unsubscribe();
|
||||
|
||||
setTimeout(done, 2000);
|
||||
}, 50);
|
||||
});
|
||||
|
||||
it('should be a ReplaySubject(1)', (done): void => {
|
||||
const obs = timer(0, 100).pipe(drr()); // Starts at 0, increments every 100ms
|
||||
const obs = timer(0, 100).pipe(drr({ delay: 500 })); // Starts at 0, increments every 100ms
|
||||
|
||||
obs.subscribe(); // Fire the observable
|
||||
const sub = obs.subscribe(); // Fire the observable
|
||||
|
||||
// Subscribe another time after some time, i.e. after the observable has fired
|
||||
setTimeout((): void => {
|
||||
obs.subscribe((value): void => {
|
||||
const sub = obs.subscribe((value): void => {
|
||||
expect(value > 1).toBe(true);
|
||||
done();
|
||||
|
||||
setTimeout(done, 2000);
|
||||
});
|
||||
|
||||
sub.unsubscribe();
|
||||
}, 500);
|
||||
|
||||
sub.unsubscribe();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/rpc-provider",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Transport providers for the API",
|
||||
"main": "index.js",
|
||||
@@ -20,18 +20,18 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-provider#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/util-crypto": "^6.5.1",
|
||||
"@polkadot/x-fetch": "^6.5.1",
|
||||
"@polkadot/x-global": "^6.5.1",
|
||||
"@polkadot/x-ws": "^6.5.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/util-crypto": "^6.6.1",
|
||||
"@polkadot/x-fetch": "^6.6.1",
|
||||
"@polkadot/x-global": "^6.6.1",
|
||||
"@polkadot/x-ws": "^6.6.1",
|
||||
"bn.js": "^4.11.9",
|
||||
"eventemitter3": "^4.0.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/keyring": "^6.5.1",
|
||||
"@polkadot/metadata": "4.11.2",
|
||||
"@polkadot/keyring": "^6.6.1",
|
||||
"@polkadot/metadata": "4.12.1",
|
||||
"mock-socket": "^9.0.3",
|
||||
"nock": "^13.0.11"
|
||||
}
|
||||
|
||||
@@ -45,6 +45,8 @@ export class MockProvider implements ProviderInterface {
|
||||
|
||||
private emitter = new EventEmitter();
|
||||
|
||||
private intervalId?: NodeJS.Timeout | null;
|
||||
|
||||
public isUpdating = true;
|
||||
|
||||
private registry: Registry;
|
||||
@@ -104,8 +106,12 @@ export class MockProvider implements ProviderInterface {
|
||||
// noop
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/require-await
|
||||
public async disconnect (): Promise<void> {
|
||||
// noop
|
||||
if (this.intervalId) {
|
||||
clearInterval(this.intervalId);
|
||||
this.intervalId = null;
|
||||
}
|
||||
}
|
||||
|
||||
public get isConnected (): boolean {
|
||||
@@ -175,7 +181,7 @@ export class MockProvider implements ProviderInterface {
|
||||
const query = decorateStorage(this.registry, metadata.asLatest, metadata.version);
|
||||
|
||||
// Do something every 1 seconds
|
||||
setInterval((): void => {
|
||||
this.intervalId = setInterval((): void => {
|
||||
if (!this.isUpdating) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,10 @@ describe('on', (): void => {
|
||||
mock = new MockProvider(registry);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await mock.disconnect();
|
||||
});
|
||||
|
||||
it('it emits both connected and disconnected events', (done): void => {
|
||||
const events: Record<string, boolean> = { connected: false, disconnected: false };
|
||||
|
||||
|
||||
@@ -13,6 +13,10 @@ describe('send', (): void => {
|
||||
mock = new MockProvider(registry);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await mock.disconnect();
|
||||
});
|
||||
|
||||
it('fails on non-supported methods', (): Promise<any> => {
|
||||
return mock
|
||||
.send('something_invalid', [])
|
||||
|
||||
@@ -13,6 +13,10 @@ describe('subscribe', (): void => {
|
||||
mock = new MockProvider(registry);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await mock.disconnect();
|
||||
});
|
||||
|
||||
it('fails on unknown methods', (): Promise<number | void> => {
|
||||
return mock
|
||||
.subscribe('test', 'test_notFound')
|
||||
@@ -29,28 +33,28 @@ describe('subscribe', (): void => {
|
||||
});
|
||||
});
|
||||
|
||||
it('calls back with the last known value', (done): Promise<number> => {
|
||||
it('calls back with the last known value', (done): void => {
|
||||
mock.isUpdating = false;
|
||||
mock.subscriptions.chain_subscribeNewHead.lastValue = 'testValue';
|
||||
|
||||
return mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, value: string): void => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, value: string): void => {
|
||||
expect(value).toEqual('testValue');
|
||||
done();
|
||||
});
|
||||
}).catch(console.error);
|
||||
});
|
||||
|
||||
it('calls back with new headers', (done): Promise<number> => {
|
||||
return mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
it('calls back with new headers', (done): void => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
if (header.number === 4) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
}).catch(console.error);
|
||||
});
|
||||
|
||||
it('handles errors withing callbacks gracefully', (done): Promise<number> => {
|
||||
it('handles errors withing callbacks gracefully', (done): void => {
|
||||
let hasThrown = false;
|
||||
|
||||
return mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
mock.subscribe('chain_newHead', 'chain_subscribeNewHead', (_: any, header: { number: number }): void => {
|
||||
if (!hasThrown) {
|
||||
hasThrown = true;
|
||||
|
||||
@@ -60,6 +64,6 @@ describe('subscribe', (): void => {
|
||||
if (header.number === 3) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
}).catch(console.error);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -20,6 +20,10 @@ describe('unsubscribe', (): void => {
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await mock.disconnect();
|
||||
});
|
||||
|
||||
it('fails on unknown ids', (): Promise<boolean> => {
|
||||
return mock
|
||||
.unsubscribe('chain_newHead', 'chain_subscribeNewHead', 5)
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/rpc-provider', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/rpc-provider', version: '4.12.1' };
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
|
||||
import type { Mock } from './../mock/types';
|
||||
|
||||
import { mockWs, TEST_WS_URL } from '../../test/mockWs';
|
||||
import { mockWs } from '../../test/mockWs';
|
||||
import { WsProvider } from './';
|
||||
|
||||
const TEST_WS_URL = 'ws://localhost-connect.spec.ts:9988';
|
||||
|
||||
function sleepMs (ms = 0): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
@@ -15,7 +17,7 @@ describe('onConnect', (): void => {
|
||||
|
||||
beforeEach((): void => {
|
||||
jest.setTimeout(30000);
|
||||
mocks = [mockWs([])];
|
||||
mocks = [mockWs([], TEST_WS_URL)];
|
||||
});
|
||||
|
||||
afterEach((): void => {
|
||||
@@ -27,9 +29,19 @@ describe('onConnect', (): void => {
|
||||
});
|
||||
});
|
||||
|
||||
it('Does not connect when autoConnect is false', (): void => {
|
||||
it('Does not connect when autoConnect is false', async () => {
|
||||
const provider: WsProvider = new WsProvider(TEST_WS_URL, 0);
|
||||
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
expect(provider.isConnected).toBe(false);
|
||||
|
||||
await provider.connect();
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
expect(provider.isConnected).toBe(true);
|
||||
|
||||
await provider.disconnect();
|
||||
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
expect(provider.isConnected).toBe(false);
|
||||
});
|
||||
|
||||
@@ -38,6 +50,8 @@ describe('onConnect', (): void => {
|
||||
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
expect(provider.isConnected).toBe(true);
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('Creates a new WebSocket instance by calling the connect() method', async () => {
|
||||
@@ -50,7 +64,9 @@ describe('onConnect', (): void => {
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
|
||||
expect(provider.isConnected).toBe(true);
|
||||
expect(mocks[0].server.clients().length).toBe(1);
|
||||
expect(mocks[0].server.clients()).toHaveLength(1);
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('Connects to first endpoint when an array is given', async () => {
|
||||
@@ -60,22 +76,26 @@ describe('onConnect', (): void => {
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
|
||||
expect(provider.isConnected).toBe(true);
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('Connects to the second endpoint when the first is unreachable', async () => {
|
||||
/* eslint-disable @typescript-eslint/no-empty-function */
|
||||
jest.spyOn(console, 'error').mockImplementation((): void => {});
|
||||
|
||||
const endpoints: string[] = ['ws://localhost:9956', TEST_WS_URL];
|
||||
const endpoints: string[] = ['ws://localhost-connect.spec.ts:9956', TEST_WS_URL];
|
||||
const provider: WsProvider = new WsProvider(endpoints, 1);
|
||||
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
|
||||
expect(provider.isConnected).toBe(true);
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('Connects to the second endpoint when the first is dropped', async () => {
|
||||
const endpoints: string[] = [TEST_WS_URL, 'ws://localhost:9957'];
|
||||
const endpoints: string[] = [TEST_WS_URL, 'ws://localhost-connect.spec.ts:9957'];
|
||||
|
||||
mocks.push(mockWs([], endpoints[1]));
|
||||
|
||||
@@ -83,26 +103,27 @@ describe('onConnect', (): void => {
|
||||
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
// Check that first server is connected
|
||||
expect(mocks[0].server.clients().length).toBe(1);
|
||||
expect(mocks[1].server.clients().length).toBe(0);
|
||||
expect(mocks[0].server.clients()).toHaveLength(1);
|
||||
expect(mocks[1].server.clients()).toHaveLength(0);
|
||||
|
||||
// Close connection from first server
|
||||
mocks[0].server.clients()[0].close();
|
||||
await sleepMs(100);
|
||||
|
||||
// Check that second server is connected
|
||||
expect(mocks[1].server.clients().length).toBe(1);
|
||||
expect(mocks[1].server.clients()).toHaveLength(1);
|
||||
expect(provider.isConnected).toBe(true);
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
|
||||
it('Round-robin of endpoints on WsProvider', async () => {
|
||||
const rounds = 5;
|
||||
const endpoints: string[] = [
|
||||
TEST_WS_URL,
|
||||
'ws://localhost:9956',
|
||||
'ws://localhost:9957',
|
||||
'ws://invalid:9956',
|
||||
'ws://localhost:9958'
|
||||
'ws://localhost-connect.spec.ts:9956',
|
||||
'ws://localhost-connect.spec.ts:9957',
|
||||
'ws://invalid-connect.spec.ts:9956',
|
||||
'ws://localhost-connect.spec.ts:9958'
|
||||
];
|
||||
|
||||
mocks.push(mockWs([], endpoints[1]));
|
||||
@@ -117,18 +138,20 @@ describe('onConnect', (): void => {
|
||||
];
|
||||
const provider: WsProvider = new WsProvider(endpoints, 1);
|
||||
|
||||
for (let round = 0; round < rounds; round++) {
|
||||
for (let index = 0; index < mocks.length; index++) {
|
||||
for (let round = 0; round < 5; round++) {
|
||||
for (let mock = 0; mock < mocks.length; mock++) {
|
||||
await sleepMs(100); // Hack to give the provider time to connect
|
||||
|
||||
// Check that first server is connected and the next one isn't
|
||||
expect(mocks[index].server.clients().length).toBe(1);
|
||||
expect(mockNext[index].server.clients().length).toBe(0);
|
||||
expect(mocks[mock].server.clients()).toHaveLength(1);
|
||||
expect(mockNext[mock].server.clients()).toHaveLength(0);
|
||||
expect(provider.isConnected).toBe(true);
|
||||
|
||||
// Close connection from first server
|
||||
mocks[index].server.clients()[0].close();
|
||||
mocks[mock].server.clients()[0].close();
|
||||
}
|
||||
}
|
||||
|
||||
await provider.disconnect();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,25 +1,32 @@
|
||||
// Copyright 2017-2021 @polkadot/rpc-provider authors & contributors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import { mockWs, TEST_WS_URL } from '../../test/mockWs';
|
||||
import { mockWs } from '../../test/mockWs';
|
||||
import { Mock } from './../mock/types';
|
||||
import { WsProvider } from './';
|
||||
|
||||
let ws: WsProvider;
|
||||
const TEST_WS_URL = 'ws://localhost-index.spec.ts:9977';
|
||||
|
||||
let provider: WsProvider | null;
|
||||
let mock: Mock;
|
||||
|
||||
function createWs (requests: any[], autoConnect: number | undefined = 1000): WsProvider {
|
||||
mock = mockWs(requests);
|
||||
ws = new WsProvider(TEST_WS_URL, autoConnect);
|
||||
function createWs (requests: any[], autoConnect = 1000, headers?: Record<string, string>): WsProvider {
|
||||
mock = mockWs(requests, TEST_WS_URL);
|
||||
provider = new WsProvider(TEST_WS_URL, autoConnect, headers);
|
||||
|
||||
return ws;
|
||||
return provider;
|
||||
}
|
||||
|
||||
describe('Ws', (): void => {
|
||||
afterEach((): void => {
|
||||
afterEach(async () => {
|
||||
if (mock) {
|
||||
mock.done();
|
||||
}
|
||||
|
||||
if (provider) {
|
||||
await provider.disconnect();
|
||||
provider = null;
|
||||
}
|
||||
});
|
||||
|
||||
it('returns the connected state', (): void => {
|
||||
@@ -28,10 +35,8 @@ describe('Ws', (): void => {
|
||||
).toEqual(false);
|
||||
});
|
||||
|
||||
it('allows you to initialize the provider with custom headers', (): void => {
|
||||
expect(
|
||||
(): WsProvider => new WsProvider(TEST_WS_URL, 1000, { foo: 'bar' })
|
||||
).not.toThrow();
|
||||
it('allows you to initialize the provider with custom headers', () => {
|
||||
createWs([], 100, { foo: 'bar' });
|
||||
});
|
||||
});
|
||||
|
||||
@@ -42,10 +47,9 @@ describe('Endpoint Parsing', (): void => {
|
||||
});
|
||||
|
||||
it('Throws when WsProvider endpoint is an invalid string', () => {
|
||||
expect(() => {
|
||||
/* eslint-disable no-new */
|
||||
new WsProvider('http://127.0.0.1:9955', 0);
|
||||
}).toThrowError(/^Endpoint should start with /);
|
||||
expect(
|
||||
() => new WsProvider('http://127.0.0.1:9955', 0)
|
||||
).toThrowError(/^Endpoint should start with /);
|
||||
});
|
||||
|
||||
it('Succeeds when WsProvider endpoint is a valid array', () => {
|
||||
@@ -58,18 +62,16 @@ describe('Endpoint Parsing', (): void => {
|
||||
it('Throws when WsProvider endpoint is an empty array', () => {
|
||||
const endpoints: string[] = [];
|
||||
|
||||
expect(() => {
|
||||
/* eslint-disable no-new */
|
||||
new WsProvider(endpoints, 0);
|
||||
}).toThrowError('WsProvider requires at least one Endpoint');
|
||||
expect(
|
||||
() => new WsProvider(endpoints, 0)
|
||||
).toThrowError('WsProvider requires at least one Endpoint');
|
||||
});
|
||||
|
||||
it('Throws when WsProvider endpoint is an invalid array', () => {
|
||||
const endpoints: string[] = ['ws://127.0.0.1:9955', 'http://bad.co:9944', 'ws://mychain.com:9933'];
|
||||
|
||||
expect(() => {
|
||||
/* eslint-disable no-new */
|
||||
new WsProvider(endpoints, 0);
|
||||
}).toThrowError(/^Endpoint should start with /);
|
||||
expect(
|
||||
() => new WsProvider(endpoints, 0)
|
||||
).toThrowError(/^Endpoint should start with /);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,17 +3,19 @@
|
||||
|
||||
import type { Constructor } from '@polkadot/types/types';
|
||||
|
||||
import { mockWs, TEST_WS_URL } from '../../test/mockWs';
|
||||
import { mockWs } from '../../test/mockWs';
|
||||
import { Global, Mock } from './../mock/types';
|
||||
import { WsProvider } from './';
|
||||
|
||||
declare const global: Global;
|
||||
|
||||
let provider: WsProvider;
|
||||
const TEST_WS_URL = 'ws://localhost-send.spec.ts:9965';
|
||||
|
||||
let provider: WsProvider | null;
|
||||
let mock: Mock;
|
||||
|
||||
function createMock (requests: any[]): void {
|
||||
mock = mockWs(requests);
|
||||
mock = mockWs(requests, TEST_WS_URL);
|
||||
}
|
||||
|
||||
function createWs (autoConnect = 1000): Promise<WsProvider> {
|
||||
@@ -29,12 +31,17 @@ describe('send', (): void => {
|
||||
globalWs = global.WebSocket;
|
||||
});
|
||||
|
||||
afterEach((): void => {
|
||||
afterEach(async () => {
|
||||
global.WebSocket = globalWs;
|
||||
|
||||
if (mock) {
|
||||
mock.done();
|
||||
}
|
||||
|
||||
if (provider) {
|
||||
await provider.disconnect();
|
||||
provider = null;
|
||||
}
|
||||
});
|
||||
|
||||
it('handles internal errors', (): Promise<any> => {
|
||||
|
||||
@@ -6,13 +6,13 @@ import { WsProvider } from './';
|
||||
describe('state', (): void => {
|
||||
it('requires an ws:// prefixed endpoint', (): void => {
|
||||
expect(
|
||||
(): WsProvider => new WsProvider('http://', 0)
|
||||
() => new WsProvider('http://', 0)
|
||||
).toThrow(/with 'ws/);
|
||||
});
|
||||
|
||||
it('allows wss:// endpoints', (): void => {
|
||||
expect(
|
||||
(): WsProvider => new WsProvider('wss://', 0)
|
||||
() => new WsProvider('wss://', 0)
|
||||
).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,23 +3,25 @@
|
||||
|
||||
import type { Constructor } from '@polkadot/types/types';
|
||||
|
||||
import { mockWs, TEST_WS_URL } from '../../test/mockWs';
|
||||
import { mockWs } from '../../test/mockWs';
|
||||
import { Global, Mock } from './../mock/types';
|
||||
import { WsProvider } from './';
|
||||
|
||||
declare const global: Global;
|
||||
|
||||
let ws: WsProvider;
|
||||
const TEST_WS_URL = 'ws://localhost-subscribe.test.ts:9933';
|
||||
|
||||
let provider: WsProvider | null;
|
||||
let mock: Mock;
|
||||
|
||||
function createMock (requests: any[]): void {
|
||||
mock = mockWs(requests);
|
||||
mock = mockWs(requests, TEST_WS_URL);
|
||||
}
|
||||
|
||||
function createWs (autoConnect = 1000): Promise<WsProvider> {
|
||||
ws = new WsProvider(TEST_WS_URL, autoConnect);
|
||||
provider = new WsProvider(TEST_WS_URL, autoConnect);
|
||||
|
||||
return ws.isReady;
|
||||
return provider.isReady;
|
||||
}
|
||||
|
||||
describe('subscribe', (): void => {
|
||||
@@ -29,12 +31,17 @@ describe('subscribe', (): void => {
|
||||
globalWs = global.WebSocket;
|
||||
});
|
||||
|
||||
afterEach((): void => {
|
||||
afterEach(async () => {
|
||||
global.WebSocket = globalWs;
|
||||
|
||||
if (mock) {
|
||||
mock.done();
|
||||
}
|
||||
|
||||
if (provider) {
|
||||
await provider.disconnect();
|
||||
provider = null;
|
||||
}
|
||||
});
|
||||
|
||||
it('adds subscriptions', (): Promise<void> => {
|
||||
|
||||
@@ -3,23 +3,25 @@
|
||||
|
||||
import type { Constructor } from '@polkadot/types/types';
|
||||
|
||||
import { mockWs, TEST_WS_URL } from '../../test/mockWs';
|
||||
import { mockWs } from '../../test/mockWs';
|
||||
import { Global, Mock } from './../mock/types';
|
||||
import { WsProvider } from './';
|
||||
|
||||
declare const global: Global;
|
||||
|
||||
let ws: WsProvider;
|
||||
const TEST_WS_URL = 'ws://localhost-unsubscribe.test.ts:9933';
|
||||
|
||||
let provider: WsProvider | null;
|
||||
let mock: Mock;
|
||||
|
||||
function createMock (requests: any): void {
|
||||
mock = mockWs(requests);
|
||||
mock = mockWs(requests, TEST_WS_URL);
|
||||
}
|
||||
|
||||
function createWs (autoConnect = 1000): Promise<WsProvider> {
|
||||
ws = new WsProvider(TEST_WS_URL, autoConnect);
|
||||
provider = new WsProvider(TEST_WS_URL, autoConnect);
|
||||
|
||||
return ws.isReady;
|
||||
return provider.isReady;
|
||||
}
|
||||
|
||||
describe('subscribe', (): void => {
|
||||
@@ -29,12 +31,17 @@ describe('subscribe', (): void => {
|
||||
globalWs = global.WebSocket;
|
||||
});
|
||||
|
||||
afterEach((): void => {
|
||||
afterEach(async () => {
|
||||
global.WebSocket = globalWs;
|
||||
|
||||
if (mock) {
|
||||
mock.done();
|
||||
}
|
||||
|
||||
if (provider) {
|
||||
await provider.disconnect();
|
||||
provider = null;
|
||||
}
|
||||
});
|
||||
|
||||
it('removes subscriptions', (): Promise<boolean> => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/typegen",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Type generation scripts",
|
||||
"main": "index.js",
|
||||
@@ -29,11 +29,11 @@
|
||||
"@babel/core": "^7.14.3",
|
||||
"@babel/register": "^7.13.16",
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/api": "4.11.2",
|
||||
"@polkadot/metadata": "4.11.2",
|
||||
"@polkadot/rpc-provider": "4.11.2",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/api": "4.12.1",
|
||||
"@polkadot/metadata": "4.12.1",
|
||||
"@polkadot/rpc-provider": "4.12.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"handlebars": "^4.7.7",
|
||||
"websocket": "^1.0.34",
|
||||
"yargs": "^17.0.1"
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/typegen', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/typegen', version: '4.12.1' };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/types-known",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "A JavaScript wrapper for the Polkadot JsonRPC interface",
|
||||
"main": "index.js",
|
||||
@@ -20,9 +20,9 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/types-known#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/networks": "^6.5.1",
|
||||
"@polkadot/types": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/networks": "^6.6.1",
|
||||
"@polkadot/types": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"bn.js": "^4.11.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/types-known', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/types-known', version: '4.12.1' };
|
||||
|
||||
@@ -12,7 +12,7 @@ const upgrades: ChainUpgradesRaw = [
|
||||
[2201991, 1062], [2671528, 2005], [2704202, 2007], [2728002, 2008], [2832534, 2011],
|
||||
[2962294, 2012], [3240000, 2013], [3274408, 2015], [3323565, 2019], [3534175, 2022],
|
||||
[3860281, 2023], [4143129, 2024], [4401242, 2025], [4841367, 2026], [5961600, 2027],
|
||||
[6137912, 2028], [6561855, 2029], [7100891, 2030], [7468792, 9010]
|
||||
[6137912, 2028], [6561855, 2029], [7100891, 2030], [7468792, 9010], [7668600, 9030]
|
||||
];
|
||||
|
||||
export default upgrades;
|
||||
|
||||
@@ -9,7 +9,7 @@ const upgrades: ChainUpgradesRaw = [
|
||||
[1030162, 31], [1119657, 32], [1199282, 33], [1342534, 34], [1392263, 35],
|
||||
[1431703, 36], [1433369, 37], [1490972, 41], [2087397, 43], [2316688, 44],
|
||||
[2549864, 45], [3925782, 46], [3925843, 47], [4207800, 48], [4627944, 49],
|
||||
[5124076, 50], [5478664, 900], [5482450, 9000], [5584305, 9010]
|
||||
[5124076, 50], [5478664, 900], [5482450, 9000], [5584305, 9010], [5784566, 9030]
|
||||
];
|
||||
|
||||
export default upgrades;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@polkadot/types",
|
||||
"version": "4.11.2",
|
||||
"version": "4.12.1",
|
||||
"type": "module",
|
||||
"description": "Implementation of the Parity codec",
|
||||
"main": "index.js",
|
||||
@@ -20,14 +20,14 @@
|
||||
"homepage": "https://github.com/polkadot-js/api/tree/master/packages/types#readme",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.14.0",
|
||||
"@polkadot/metadata": "4.11.2",
|
||||
"@polkadot/util": "^6.5.1",
|
||||
"@polkadot/util-crypto": "^6.5.1",
|
||||
"@polkadot/x-rxjs": "^6.5.1",
|
||||
"@polkadot/metadata": "4.12.1",
|
||||
"@polkadot/util": "^6.6.1",
|
||||
"@polkadot/util-crypto": "^6.6.1",
|
||||
"@polkadot/x-rxjs": "^6.6.1",
|
||||
"@types/bn.js": "^4.11.6",
|
||||
"bn.js": "^4.11.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@polkadot/keyring": "^6.5.1"
|
||||
"@polkadot/keyring": "^6.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,8 +25,8 @@ export default {
|
||||
end: 'BlockNumber',
|
||||
cap: 'Balance',
|
||||
lastContribution: 'LastContribution',
|
||||
firstSlot: 'LeasePeriod',
|
||||
lastSlot: 'LeasePeriod',
|
||||
firstPeriod: 'LeasePeriod',
|
||||
lastPeriod: 'LeasePeriod',
|
||||
trieIndex: 'TrieIndex'
|
||||
},
|
||||
TrieIndex: 'u32'
|
||||
|
||||
@@ -17,8 +17,8 @@ export interface FundInfo extends Struct {
|
||||
readonly end: BlockNumber;
|
||||
readonly cap: Balance;
|
||||
readonly lastContribution: LastContribution;
|
||||
readonly firstSlot: LeasePeriod;
|
||||
readonly lastSlot: LeasePeriod;
|
||||
readonly firstPeriod: LeasePeriod;
|
||||
readonly lastPeriod: LeasePeriod;
|
||||
readonly trieIndex: TrieIndex;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,15 +50,22 @@ export const rpc: DefinitionsRpc = {
|
||||
type: 'Vec<H160>'
|
||||
},
|
||||
blockNumber: {
|
||||
description: 'Returns balance of the given account.',
|
||||
description: 'Returns the blockNumber',
|
||||
params: [],
|
||||
type: 'U256'
|
||||
},
|
||||
call: {
|
||||
description: 'Call contract, returning the output data.',
|
||||
params: [
|
||||
{ name: 'request', type: 'EthCallRequest' },
|
||||
{ isOptional: true, name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'request',
|
||||
type: 'EthCallRequest'
|
||||
},
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'Bytes'
|
||||
},
|
||||
@@ -75,8 +82,15 @@ export const rpc: DefinitionsRpc = {
|
||||
estimateGas: {
|
||||
description: 'Estimate gas needed for execution of given contract.',
|
||||
params: [
|
||||
{ name: 'request', type: 'EthCallRequest' },
|
||||
{ isOptional: true, name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'request',
|
||||
type: 'EthCallRequest'
|
||||
},
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
@@ -88,23 +102,39 @@ export const rpc: DefinitionsRpc = {
|
||||
getBalance: {
|
||||
description: 'Returns balance of the given account.',
|
||||
params: [
|
||||
{ name: 'address', type: 'H160' },
|
||||
{ isOptional: true, name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'address',
|
||||
type: 'H160'
|
||||
},
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
getBlockByHash: {
|
||||
description: 'Returns block with given hash.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' },
|
||||
{ name: 'full', type: 'bool' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
},
|
||||
{
|
||||
name: 'full',
|
||||
type: 'bool'
|
||||
}
|
||||
],
|
||||
type: 'Option<EthRichBlock>'
|
||||
},
|
||||
getBlockByNumber: {
|
||||
description: 'Returns block with given number.',
|
||||
params: [
|
||||
{ name: 'block', type: 'BlockNumber' },
|
||||
{
|
||||
name: 'block',
|
||||
type: 'BlockNumber'
|
||||
},
|
||||
{ name: 'full', type: 'bool' }
|
||||
],
|
||||
type: 'Option<EthRichBlock>'
|
||||
@@ -112,129 +142,213 @@ export const rpc: DefinitionsRpc = {
|
||||
getBlockTransactionCountByHash: {
|
||||
description: 'Returns the number of transactions in a block with given hash.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
getBlockTransactionCountByNumber: {
|
||||
description: 'Returns the number of transactions in a block with given block number.',
|
||||
params: [
|
||||
{ name: 'block', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'block',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
getCode: {
|
||||
description: 'Returns the code at given address at given time (block number).',
|
||||
params: [
|
||||
{ name: 'address', type: 'H160' },
|
||||
{ isOptional: true, name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'address',
|
||||
type: 'H160'
|
||||
},
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'Bytes'
|
||||
},
|
||||
getFilterChanges: {
|
||||
description: 'Returns filter changes since last poll.',
|
||||
params: [
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'EthFilterChanges'
|
||||
},
|
||||
getFilterLogs: {
|
||||
description: 'Returns all logs matching given filter (in a range \'from\' - \'to\').',
|
||||
params: [
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'Vec<EthLog>'
|
||||
},
|
||||
getLogs: {
|
||||
description: 'Returns logs matching given filter object.',
|
||||
params: [
|
||||
{ name: 'filter', type: 'EthFilter' }
|
||||
{
|
||||
name: 'filter',
|
||||
type: 'EthFilter'
|
||||
}
|
||||
],
|
||||
type: 'Vec<EthLog>'
|
||||
},
|
||||
getProof: {
|
||||
description: 'Returns proof for account and storage.',
|
||||
params: [
|
||||
{ name: 'address', type: 'H160' },
|
||||
{ name: 'storageKeys', type: 'Vec<H256>' },
|
||||
{ name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'address',
|
||||
type: 'H160'
|
||||
},
|
||||
{
|
||||
name: 'storageKeys',
|
||||
type: 'Vec<H256>'
|
||||
},
|
||||
{
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'EthAccount'
|
||||
},
|
||||
getStorageAt: {
|
||||
description: 'Returns content of the storage at given address.',
|
||||
params: [
|
||||
{ name: 'address', type: 'H160' },
|
||||
{ name: 'index', type: 'U256' },
|
||||
{ isOptional: true, name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'address',
|
||||
type: 'H160'
|
||||
},
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
},
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'H256'
|
||||
},
|
||||
getTransactionByBlockHashAndIndex: {
|
||||
description: 'Returns transaction at given block hash and index.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' },
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
},
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'EthTransaction'
|
||||
},
|
||||
getTransactionByBlockNumberAndIndex: {
|
||||
description: 'Returns transaction by given block number and index.',
|
||||
params: [
|
||||
{ name: 'number', type: 'BlockNumber' },
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
},
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'EthTransaction'
|
||||
},
|
||||
getTransactionByHash: {
|
||||
description: 'Get transaction by its hash.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
}
|
||||
],
|
||||
type: 'EthTransaction'
|
||||
},
|
||||
getTransactionCount: {
|
||||
description: 'Returns the number of transactions sent from given address at given time (block number).',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' },
|
||||
{ isOptional: true, name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
},
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
getTransactionReceipt: {
|
||||
description: 'Returns transaction receipt by transaction hash.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
}
|
||||
],
|
||||
type: 'EthReceipt'
|
||||
},
|
||||
getUncleByBlockHashAndIndex: {
|
||||
description: 'Returns an uncles at given block and index.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' },
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
},
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'EthRichBlock'
|
||||
},
|
||||
getUncleByBlockNumberAndIndex: {
|
||||
description: 'Returns an uncles at given block and index.',
|
||||
params: [
|
||||
{ name: 'number', type: 'BlockNumber' },
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
},
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'EthRichBlock'
|
||||
},
|
||||
getUncleCountByBlockHash: {
|
||||
description: 'Returns the number of uncles in a block with given hash.',
|
||||
params: [
|
||||
{ name: 'hash', type: 'H256' }
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
getUncleCountByBlockNumber: {
|
||||
description: 'Returns the number of uncles in a block with given block number.',
|
||||
params: [
|
||||
{ name: 'number', type: 'BlockNumber' }
|
||||
{
|
||||
name: 'number',
|
||||
type: 'BlockNumber'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
@@ -261,7 +375,10 @@ export const rpc: DefinitionsRpc = {
|
||||
newFilter: {
|
||||
description: 'Returns id of new filter.',
|
||||
params: [
|
||||
{ name: 'filter', type: 'EthFilter' }
|
||||
{
|
||||
name: 'filter',
|
||||
type: 'EthFilter'
|
||||
}
|
||||
],
|
||||
type: 'U256'
|
||||
},
|
||||
@@ -278,31 +395,52 @@ export const rpc: DefinitionsRpc = {
|
||||
sendRawTransaction: {
|
||||
description: 'Sends signed transaction, returning its hash.',
|
||||
params: [
|
||||
{ name: 'bytes', type: 'Bytes' }
|
||||
{
|
||||
name: 'bytes',
|
||||
type: 'Bytes'
|
||||
}
|
||||
],
|
||||
type: 'H256'
|
||||
},
|
||||
sendTransaction: {
|
||||
description: 'Sends transaction; will block waiting for signer to return the transaction hash',
|
||||
params: [
|
||||
{ name: 'tx', type: 'EthTransactionRequest' }
|
||||
{
|
||||
name: 'tx',
|
||||
type: 'EthTransactionRequest'
|
||||
}
|
||||
],
|
||||
type: 'H256'
|
||||
},
|
||||
submitHashrate: {
|
||||
description: 'Used for submitting mining hashrate.',
|
||||
params: [
|
||||
{ name: 'index', type: 'U256' },
|
||||
{ name: 'hash', type: 'H256' }
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
},
|
||||
{
|
||||
name: 'hash',
|
||||
type: 'H256'
|
||||
}
|
||||
],
|
||||
type: 'bool'
|
||||
},
|
||||
submitWork: {
|
||||
description: 'Used for submitting a proof-of-work solution.',
|
||||
params: [
|
||||
{ name: 'nonce', type: 'H64' },
|
||||
{ name: 'headerHash', type: 'H256' },
|
||||
{ name: 'mixDigest', type: 'H256' }
|
||||
{
|
||||
name: 'nonce',
|
||||
type: 'H64'
|
||||
},
|
||||
{
|
||||
name: 'headerHash',
|
||||
type: 'H256'
|
||||
},
|
||||
{
|
||||
name: 'mixDigest',
|
||||
type: 'H256'
|
||||
}
|
||||
],
|
||||
type: 'bool'
|
||||
},
|
||||
@@ -310,7 +448,11 @@ export const rpc: DefinitionsRpc = {
|
||||
description: 'Subscribe to Eth subscription.',
|
||||
params: [
|
||||
{ name: 'kind', type: 'EthSubKind' },
|
||||
{ isOptional: true, name: 'params', type: 'EthSubParams' }
|
||||
{
|
||||
isOptional: true,
|
||||
name: 'params',
|
||||
type: 'EthSubParams'
|
||||
}
|
||||
],
|
||||
pubsub: [
|
||||
'subscription',
|
||||
@@ -327,7 +469,10 @@ export const rpc: DefinitionsRpc = {
|
||||
uninstallFilter: {
|
||||
description: 'Uninstalls filter.',
|
||||
params: [
|
||||
{ name: 'index', type: 'U256' }
|
||||
{
|
||||
name: 'index',
|
||||
type: 'U256'
|
||||
}
|
||||
],
|
||||
type: 'bool'
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
// Auto-generated by @polkadot/dev, do not edit
|
||||
|
||||
export const packageInfo = { name: '@polkadot/types', version: '4.11.2' };
|
||||
export const packageInfo = { name: '@polkadot/types', version: '4.12.1' };
|
||||
|
||||
@@ -24,4 +24,20 @@ describe('Data', (): void => {
|
||||
new Data(registry, { Raw: '0x0102030405060708' }).toHex()
|
||||
).toEqual('0x090102030405060708');
|
||||
});
|
||||
|
||||
it('throws on a very long string (only 32 bytes)', (): void => {
|
||||
expect(
|
||||
() => new Data(registry, { Raw: 'this is some very long string that is added here that will fail' })
|
||||
).toThrow('Data.Raw values are limited to a maximum length of 32 bytes');
|
||||
});
|
||||
|
||||
it('encodes a large value correctly (max 32)', (): void => {
|
||||
expect(
|
||||
// without the assert (and above test), add extra bytes to the end to check the encoding
|
||||
new Data(registry, { Raw: '0x0102030405060708091011121314151617181920212223242526272829303132' }).toHex()
|
||||
).toEqual(
|
||||
// first byte is 32 + 1 === 33 === 0x21
|
||||
'0x210102030405060708091011121314151617181920212223242526272829303132'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import type { H256 } from '../interfaces/runtime';
|
||||
import type { Registry } from '../types';
|
||||
|
||||
import { isString, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
import { assert, isString, isU8a, u8aToU8a } from '@polkadot/util';
|
||||
|
||||
import { Enum } from '../codec/Enum';
|
||||
import { Bytes } from './Bytes';
|
||||
@@ -57,6 +57,8 @@ export class Data extends Enum {
|
||||
Keccak256: 'H256', // 4
|
||||
ShaThree256: 'H256' // 5
|
||||
}, ...decodeData(registry, value));
|
||||
|
||||
assert(!this.isRaw || this.asRaw.length <= 32, 'Data.Raw values are limited to a maximum length of 32 bytes');
|
||||
}
|
||||
|
||||
get asBlakeTwo256 (): H256 {
|
||||
@@ -122,7 +124,7 @@ export class Data extends Enum {
|
||||
const length = Math.min(data.length, 32);
|
||||
const u8a = new Uint8Array(length + 1);
|
||||
|
||||
u8a.set([data.length + 1], 0);
|
||||
u8a.set([length + 1], 0);
|
||||
u8a.set(data.subarray(0, length), 1);
|
||||
|
||||
return u8a;
|
||||
|
||||
@@ -32,30 +32,23 @@ const HASHER_MAP: Record<keyof typeof AllHashers, [number, boolean]> = {
|
||||
Twox64Concat: [8, true]
|
||||
};
|
||||
|
||||
function getStorageType (type: StorageEntryTypeLatest): [boolean, string] {
|
||||
if (type.isMap) {
|
||||
return [false, type.asMap.value.toString()];
|
||||
} else if (type.isDoubleMap) {
|
||||
return [false, type.asDoubleMap.value.toString()];
|
||||
} else if (type.isNMap) {
|
||||
return [false, type.asNMap.value.toString()];
|
||||
}
|
||||
|
||||
return [false, type.asPlain.toString()];
|
||||
}
|
||||
|
||||
// we unwrap the type here, turning into an output usable for createType
|
||||
/** @internal */
|
||||
export function unwrapStorageType (type: StorageEntryTypeLatest, isOptional?: boolean): keyof InterfaceTypes {
|
||||
const [hasWrapper, outputType] = getStorageType(type);
|
||||
const outputType = type.isPlain
|
||||
? type.asPlain.toString()
|
||||
: type.isMap
|
||||
? type.asMap.value.toString()
|
||||
: type.isDoubleMap
|
||||
? type.asDoubleMap.value.toString()
|
||||
: type.asNMap.value.toString();
|
||||
|
||||
return isOptional && !hasWrapper
|
||||
return isOptional
|
||||
? `Option<${outputType}>` as keyof InterfaceTypes
|
||||
: outputType as keyof InterfaceTypes;
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
function decodeStorageKey (value?: AnyU8a | StorageKey | StorageEntry | [StorageEntry, any]): Decoded {
|
||||
function decodeStorageKey (value?: AnyU8a | StorageKey | StorageEntry | [StorageEntry, unknown]): Decoded {
|
||||
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
||||
if (value instanceof StorageKey) {
|
||||
return {
|
||||
@@ -73,12 +66,12 @@ function decodeStorageKey (value?: AnyU8a | StorageKey | StorageEntry | [Storage
|
||||
section: value.section
|
||||
};
|
||||
} else if (Array.isArray(value)) {
|
||||
const [fn, ...arg] = value as [StorageEntry, ...any[]];
|
||||
const [fn, arg] = value;
|
||||
|
||||
assert(isFunction(fn), 'Expected function input for key construction');
|
||||
|
||||
return {
|
||||
key: fn(...arg),
|
||||
key: fn(arg),
|
||||
method: fn.method,
|
||||
section: fn.section
|
||||
};
|
||||
@@ -134,7 +127,7 @@ function decodeArgsFromMeta <A extends AnyTuple> (registry: Registry, value: Uin
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
function getMeta (value: StorageKey | StorageEntry | [StorageEntry, any]): StorageEntryMetadataLatest | undefined {
|
||||
function getMeta (value: StorageKey | StorageEntry | [StorageEntry, unknown]): StorageEntryMetadataLatest | undefined {
|
||||
if (value instanceof StorageKey) {
|
||||
return value.meta;
|
||||
} else if (isFunction(value)) {
|
||||
@@ -149,7 +142,7 @@ function getMeta (value: StorageKey | StorageEntry | [StorageEntry, any]): Stora
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
function getType (value: StorageKey | StorageEntry | [StorageEntry, any]): string {
|
||||
function getType (value: StorageKey | StorageEntry | [StorageEntry, unknown]): string {
|
||||
if (value instanceof StorageKey) {
|
||||
return value.outputType;
|
||||
} else if (isFunction(value)) {
|
||||
@@ -185,7 +178,7 @@ export class StorageKey<A extends AnyTuple = AnyTuple> extends Bytes implements
|
||||
|
||||
private _section?: string;
|
||||
|
||||
constructor (registry: Registry, value?: AnyU8a | StorageKey | StorageEntry | [StorageEntry, any], override: Partial<StorageKeyExtra> = {}) {
|
||||
constructor (registry: Registry, value?: AnyU8a | StorageKey | StorageEntry | [StorageEntry, unknown], override: Partial<StorageKeyExtra> = {}) {
|
||||
const { key, method, section } = decodeStorageKey(value);
|
||||
|
||||
super(registry, key);
|
||||
|
||||
Reference in New Issue
Block a user