UNPKG

2.69 kBPlain TextView Raw
1// Copyright 2017-2018 @polkadot/api-provider authors & contributors
2// This software may be modified and distributed under the terms
3// of the ISC license. See the LICENSE file for details.
4
5// FIXME: This file is way too long and way too messy
6
7import { StorageFunction } from '@polkadot/types/StorageKey';
8import { KeyringPair } from '@polkadot/util-keyring/types';
9import { ProviderInterface$Emitted } from '../types';
10import { MockState, MockState$Db, MockState$Subscriptions } from './types';
11
12import BN from 'bn.js';
13import Header from '@polkadot/types/Header';
14import storage from '@polkadot/storage/testing';
15import bnToU8a from '@polkadot/util/bn/toU8a';
16import u8aToHex from '@polkadot/util/u8a/toHex';
17import randomAsU8a from '@polkadot/util-crypto/random/asU8a';
18import testKeyring from '@polkadot/util-keyring/testing';
19
20const keyring = testKeyring();
21
22const emitEvents: Array<ProviderInterface$Emitted> = ['connected', 'disconnected'];
23let emitIndex = 0;
24
25function makeBlockHeader (prevNumber: BN) {
26 const blockNumber = prevNumber.addn(1);
27
28 return {
29 digest: {
30 logs: []
31 },
32 extrinsicsRoot: randomAsU8a(),
33 number: blockNumber,
34 parentHash: prevNumber.eqn(-1)
35 ? new Uint8Array(32)
36 : bnToU8a(prevNumber, 256, false),
37 stateRoot: bnToU8a(blockNumber, 256, false)
38 };
39}
40
41function updateSubs (subscriptions: MockState$Subscriptions, method: string, value: any) {
42 subscriptions[method].lastValue = value;
43
44 Object
45 .values(subscriptions[method].callbacks)
46 .forEach((cb) => {
47 try {
48 cb(null, value);
49 } catch (error) {
50 console.error(`Error on '${method}' subscription`, error);
51 }
52 });
53}
54
55function setStorageBn (db: MockState$Db, createKey: StorageFunction, value: BN | number, ...keyParams: Array<Uint8Array>): void {
56 const keyValue = u8aToHex(
57 createKey(...keyParams)
58 );
59
60 db[keyValue] = bnToU8a(value, 64, true);
61}
62
63export default function mocks ({ emitter, db, subscriptions }: MockState): void {
64 let newHead = makeBlockHeader(new BN(-1));
65
66 setInterval(() => {
67 if (++emitIndex === emitEvents.length) {
68 emitIndex = 0;
69 }
70
71 emitter.emit(emitEvents[emitIndex]);
72
73 newHead = makeBlockHeader(newHead.number);
74
75 keyring.getPairs().forEach(({ publicKey }: KeyringPair, index: number) => {
76 setStorageBn(db, storage.balances.freeBalance, newHead.number.muln(3).iaddn(index), publicKey());
77 setStorageBn(db, storage.system.accountNonce, newHead.number.addn(index), publicKey());
78 });
79
80 setStorageBn(db, storage.timestamp.now, Math.floor(Date.now() / 1000));
81
82 updateSubs(subscriptions, 'chain_newHead', new Header(newHead).toJSON());
83 }, 5000);
84}