UNPKG

2.62 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _values = _interopRequireDefault(require("@babel/runtime/core-js/object/values"));
6
7require("core-js/modules/web.dom.iterable");
8
9// Copyright 2017-2018 Jaco Greeff
10// This software may be modified and distributed under the terms
11// of the ISC license. See the LICENSE file for details.
12// FIME: This file is way too long and way too messy
13const BN = require('bn.js');
14
15const headerEncode = require('@polkadot/primitives-json/header/encode');
16
17const createKey = require('@polkadot/storage/key');
18
19const state = require('@polkadot/storage');
20
21const bnToU8a = require('@polkadot/util/bn/toU8a');
22
23const u8aToHex = require('@polkadot/util/u8a/toHex');
24
25const randomAsU8a = require('@polkadot/util-crypto/random/asU8a');
26
27const testKeyring = require('@polkadot/util-keyring/testing');
28
29const keyring = testKeyring();
30const emitEvents = ['connected', 'disconnected'];
31let emitIndex = 0;
32
33function makeBlockHeader(prevNumber) {
34 const blockNumber = prevNumber.addn(1);
35 return {
36 digest: {
37 logs: []
38 },
39 extrinsicsRoot: randomAsU8a(),
40 number: blockNumber,
41 parentHash: prevNumber.eqn(-1) ? new Uint8Array(32) : bnToU8a(prevNumber, 256),
42 stateRoot: bnToU8a(blockNumber, 256)
43 };
44}
45
46function updateSubs(subscriptions, method, value) {
47 subscriptions[method].lastValue = value;
48 (0, _values.default)(subscriptions[method].callbacks).forEach(cb => {
49 try {
50 // flowlint-next-line unclear-type:off
51 cb(null, value);
52 } catch (error) {
53 console.error(`Error on '${method}' subscription`, error);
54 }
55 });
56}
57
58function setStorageBn(storage, key, value, ...keyParams) {
59 const keyValue = u8aToHex(createKey(key).apply(null, keyParams));
60 storage[keyValue] = bnToU8a(value, 64, true);
61}
62
63module.exports = function mocks({
64 emitter,
65 storage,
66 subscriptions
67}) {
68 let newHead = makeBlockHeader(new BN(-1));
69 setInterval(() => {
70 if (++emitIndex === emitEvents.length) {
71 emitIndex = 0;
72 }
73
74 emitter.emit(emitEvents[emitIndex]);
75 newHead = makeBlockHeader(newHead.number);
76 keyring.getPairs().forEach(({
77 publicKey
78 }, index) => {
79 setStorageBn(storage, state.staking.public.freeBalanceOf, newHead.number.muln(3).iaddn(index), publicKey());
80 setStorageBn(storage, state.system.public.accountIndexOf, newHead.number.addn(index), publicKey());
81 });
82 setStorageBn(storage, state.timestamp.public.current, Math.floor(Date.now() / 1000));
83 updateSubs(subscriptions, 'subscribe_newHead', headerEncode(newHead));
84 }, 5000);
85};
\No newline at end of file