@acala-network/chopsticks-core 0.8.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/lib/api.d.ts +43 -0
  2. package/lib/api.js +116 -0
  3. package/lib/blockchain/block-builder.d.ts +10 -0
  4. package/lib/blockchain/block-builder.js +290 -0
  5. package/lib/blockchain/block.d.ts +45 -0
  6. package/lib/blockchain/block.js +221 -0
  7. package/lib/blockchain/head-state.d.ts +15 -0
  8. package/lib/blockchain/head-state.js +94 -0
  9. package/lib/blockchain/index.d.ts +73 -0
  10. package/lib/blockchain/index.js +351 -0
  11. package/lib/blockchain/inherent/index.d.ts +19 -0
  12. package/lib/blockchain/inherent/index.js +53 -0
  13. package/lib/blockchain/inherent/para-enter.d.ts +7 -0
  14. package/lib/blockchain/inherent/para-enter.js +37 -0
  15. package/lib/blockchain/inherent/parachain/babe-randomness.d.ts +7 -0
  16. package/lib/blockchain/inherent/parachain/babe-randomness.js +23 -0
  17. package/lib/blockchain/inherent/parachain/nimbus-author-inherent.d.ts +7 -0
  18. package/lib/blockchain/inherent/parachain/nimbus-author-inherent.js +23 -0
  19. package/lib/blockchain/inherent/parachain/validation-data.d.ts +19 -0
  20. package/lib/blockchain/inherent/parachain/validation-data.js +165 -0
  21. package/lib/blockchain/storage-layer.d.ts +32 -0
  22. package/lib/blockchain/storage-layer.js +242 -0
  23. package/lib/blockchain/txpool.d.ts +44 -0
  24. package/lib/blockchain/txpool.js +210 -0
  25. package/lib/db/browser.d.ts +2 -0
  26. package/lib/db/browser.js +33 -0
  27. package/lib/db/entities.d.ts +16 -0
  28. package/lib/db/entities.js +50 -0
  29. package/lib/db/index.d.ts +1 -0
  30. package/lib/db/index.js +17 -0
  31. package/lib/db/node.d.ts +2 -0
  32. package/lib/db/node.js +22 -0
  33. package/lib/executor.d.ts +41 -0
  34. package/lib/executor.js +160 -0
  35. package/lib/genesis-provider.d.ts +44 -0
  36. package/lib/genesis-provider.js +172 -0
  37. package/lib/index.d.ts +13 -0
  38. package/lib/index.js +13 -0
  39. package/lib/logger.d.ts +7 -0
  40. package/lib/logger.js +34 -0
  41. package/lib/offchain.d.ts +10 -0
  42. package/lib/offchain.js +49 -0
  43. package/lib/schema/index.d.ts +62 -0
  44. package/lib/schema/index.js +11 -0
  45. package/lib/setup.d.ts +20 -0
  46. package/lib/setup.js +74 -0
  47. package/lib/utils/index.d.ts +18 -0
  48. package/lib/utils/index.js +65 -0
  49. package/lib/utils/key-cache.d.ts +10 -0
  50. package/lib/utils/key-cache.js +72 -0
  51. package/lib/utils/proof.d.ts +15 -0
  52. package/lib/utils/proof.js +33 -0
  53. package/lib/utils/set-storage.d.ts +7 -0
  54. package/lib/utils/set-storage.js +65 -0
  55. package/lib/utils/time-travel.d.ts +5 -0
  56. package/lib/utils/time-travel.js +67 -0
  57. package/lib/xcm/downward.d.ts +2 -0
  58. package/lib/xcm/downward.js +34 -0
  59. package/lib/xcm/horizontal.d.ts +2 -0
  60. package/lib/xcm/horizontal.js +34 -0
  61. package/lib/xcm/index.d.ts +9 -0
  62. package/lib/xcm/index.js +29 -0
  63. package/lib/xcm/upward.d.ts +2 -0
  64. package/lib/xcm/upward.js +26 -0
  65. package/package.json +46 -0
@@ -0,0 +1,165 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { GenericExtrinsic } from '@polkadot/types';
11
+ import { hexToU8a, u8aConcat } from '@polkadot/util';
12
+ import _ from 'lodash';
13
+ import { WELL_KNOWN_KEYS, dmqMqcHead, hrmpChannels, hrmpEgressChannelIndex, hrmpIngressChannelIndex, upgradeGoAheadSignal, } from '../../../utils/proof';
14
+ import { blake2AsHex, blake2AsU8a } from '@polkadot/util-crypto';
15
+ import { compactHex, getParaId } from '../../../utils';
16
+ import { createProof, decodeProof } from '../../../executor';
17
+ const MOCK_VALIDATION_DATA = {
18
+ validationData: {
19
+ relayParentNumber: 1000,
20
+ relayParentStorageRoot: '0x49416764844ff0d8bad851e8abe686dff9dd2de78621180ef8e9f99bb7a480f1',
21
+ maxPovSize: 5242880,
22
+ },
23
+ relayChainState: {
24
+ trieNodes: [
25
+ '0x5f04b49d95320d9021994c850f25b8e385f902000030000080000008000000000010000000100005000000050000000a0000000a000000000050000000100000e8764817000000040000000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000400000000001000b0040000000000000000000014000000040000000400000000000000010100000000060000006400000002000000c8000000020000001900000000000000020000000200000000c817a804000000',
26
+ '0x80011080ace5323aee784b03389c0e2cc68d81973f8fa26d395f333ecad7399271c781e1808e5db75be813c05205986cbd6fdede707a4d26816063a41eb42ebc262c734fad',
27
+ '0x8004648086a9239b72237f5bf119e2a880c32f5866460632700509cb874c60f67fe815ea80f6f6801e4b41e2e6d8ec194dba122bfb9eb33feb2545ef5144cea79551f7cc5280c629a7e712d763fe83b35d2a082430af6737a89f23219c0eb3051c83bc5af5ad80fed5ecd6097308a6540f8cf31aeaad186e6898d2ecc0e623767c521c70e39953',
28
+ '0x800804809f3ada68c357b5e0a3ebb39ef181acfa9943af4725c244330a4b2c60837612e88082ad3fbdf392429afeacc70177704b760bb145547c1f152e1fcf651916b43820',
29
+ '0x8008208042793f557c1d003b647e2eda79c2b5088c7d8cab2e82c1dcc87f4343cca91ae4485ead6eef5c4b1c68eaa71ea17a02d9de0400',
30
+ '0x80210280de38445d825563f8e218255a417c16971afa85b4f2ef18fbe08fbc5b976dc0d6801a2ff24096295cfccf1adda80b8dfffe380b9f3b54d7a3cdb67864a4655e62968022a699b2cc90a6654c84163d2a498506b192afe7cd9777227e5288e8ff069c0f',
31
+ '0x80400180ebebd1a1cd0bbc6714b7fb0ac854cca5a4c4e34e69485da48be3c8087b56e09b80128645c79ca6581c248a412fd7b8bc532a187600e6e1cc20c915538ba4df6a79',
32
+ '0x80ffbe80d9302a505e2b1ac931f539aed33bf791d1982906ae64c7197324044f191e9bca80972cd2f703f9c94fd516e14b7013c6f1545095855b6c4b36f21d89dad30aa54d80b2495ce4d07001927bb0857611f8d3a1449e791d0b010e3861c32dec0c44179680f5929c8ef9b0ac6ec8a529c91348d8cd6c169920dd37d055544a6c31c53b11e380402a0bf7ff07cee790d9cc065fc138ff6afa7db016d898d65b2b716af354c6f68042aef1dafffd1d9debbb8e6c4eb48b5c141ddf0aad2b0f3f4ddf53e6b38e65c080b31fa0392c1abdce1aa29d1544c94634ecab87ecaba6409db33aaa7621992a8280b1f4de7c3ac5665016d561a60659cd2d8f2d3e0a97e2ea9749279bd8e35eb1f180816ac87a2893694016b21768137a76ea459190ea0fc3c645d85e1a3d4eb194fe802e563b43e7334454c841953424be8c2b7a1c3295dbc391045cb6b88388ad5e7080b1ed3b02e5989b7d134ca056c778f1f5b6ffd377b2d8064483da6e94b82b0e40800cb3299c44a5db8fdcb4932e1b6ab0385d6ef1c9f8d85e0a75b787b6f4fd6c3c805a44c30e2676dc2d4c17451f51d9502e85064387999f366e6f3d404509a7780f80d6788ca71c6aabe421c352027acdb9532563dc5f1b25e6154b721f431e9990ed',
33
+ '0x9d0da05ca59913bc38a8630590f2627c154080834dda0ba5adf00d798e981a28a13e728cf83e35aefc87318440a61869f724474c5f0a351b6a99a5b21324516e668bb86a570400505f0e7b9012096b41c4eb3aaf947f6ea4290800007c7700e67da63472835bb0b737093a19ad4c63f5a4efb16ffa83d00700000400',
34
+ '0x9e207f03cfdce586301014700e2c25931040505f0e7b9012096b41c4eb3aaf947f6ea4290800004c5f0ec2d17a76153ff51817f12d9cfc3c7f0400',
35
+ '0x9e710b30bd2eab0352ddcc26417aa1945fc180699a53b51a9709a3a86039c49b5ef278e9fc244dae27e1a0380c91bff5b0488580c0d4096d94e724b8e86f952e5456c7253776de04c405582d2c350ee172d3eaa77c77081e0bfde17b36573208a06cb5cfba6b63f5a4efb16ffa83d00700000402803d0ae0b8f6832e8fabf0ec62521c2487c58b69eb97060faa8059b00ff6b7262d505f0e7b9012096b41c4eb3aaf947f6ea4290800004c5f03c716fb8fff3de61a883bb76adb34a20400806c8122e0f7f786071d6a51b330d612eccdcbe8d8f79936accabd640506dffdf380a6abfb72ed49b586829cca4ce631c092d45a017ab0d68288d308873025cfe5d280521b868fc212b25f021984cf02ced547cd45952b88360766839dfde7d4683e61',
36
+ '0x9ede3d8a54d27e44a9d5ce189618f22d1008505f0e7b9012096b41c4eb3aaf947f6ea42908010080c74756edffa217dfb07ab596d82753deff985ac215e5cc2997d29afe1d397c16',
37
+ '0x9ef78c98723ddc9073523ef3beefda0c1004505f0e7b9012096b41c4eb3aaf947f6ea4290800007c77095dac46c07a40d91506e7637ec4ba5763f5a4efb16ffa83d00700000400',
38
+ ],
39
+ },
40
+ };
41
+ export class SetValidationData {
42
+ createInherents(parent, params) {
43
+ var _a;
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ const meta = yield parent.meta;
46
+ if (!((_a = meta.tx.parachainSystem) === null || _a === void 0 ? void 0 : _a.setValidationData)) {
47
+ return [];
48
+ }
49
+ const extrinsics = yield parent.extrinsics;
50
+ let newData;
51
+ if (parent.number === 0) {
52
+ // chain started with genesis, mock 1st validationData
53
+ newData = MOCK_VALIDATION_DATA;
54
+ }
55
+ else {
56
+ const validationDataExtrinsic = extrinsics.find((extrinsic) => {
57
+ var _a, _b;
58
+ const firstArg = (_b = (_a = meta.registry.createType('GenericExtrinsic', extrinsic)) === null || _a === void 0 ? void 0 : _a.args) === null || _b === void 0 ? void 0 : _b[0];
59
+ return firstArg && 'validationData' in firstArg;
60
+ });
61
+ if (!validationDataExtrinsic) {
62
+ throw new Error('Missing validation data from block');
63
+ }
64
+ const extrinsic = meta.registry
65
+ .createType('GenericExtrinsic', validationDataExtrinsic)
66
+ .args[0].toJSON();
67
+ const newEntries = [];
68
+ const downwardMessages = [];
69
+ const horizontalMessages = {};
70
+ const paraId = yield getParaId(parent.chain);
71
+ const dmqMqcHeadKey = dmqMqcHead(paraId);
72
+ const hrmpIngressChannelIndexKey = hrmpIngressChannelIndex(paraId);
73
+ const hrmpEgressChannelIndexKey = hrmpEgressChannelIndex(paraId);
74
+ // TODO: refactor this to have a single decodeProof
75
+ const decoded = yield decodeProof(extrinsic.validationData.relayParentStorageRoot, [...Object.values(WELL_KNOWN_KEYS), dmqMqcHeadKey, hrmpIngressChannelIndexKey, hrmpEgressChannelIndexKey], extrinsic.relayChainState.trieNodes);
76
+ for (const key of Object.values(WELL_KNOWN_KEYS)) {
77
+ newEntries.push([key, decoded[key]]);
78
+ }
79
+ newEntries.push([hrmpIngressChannelIndexKey, decoded[hrmpIngressChannelIndexKey]]);
80
+ newEntries.push([hrmpEgressChannelIndexKey, decoded[hrmpEgressChannelIndexKey]]);
81
+ // inject downward messages
82
+ let dmqMqcHeadHash = decoded[dmqMqcHeadKey];
83
+ if (dmqMqcHeadHash) {
84
+ for (const { msg, sentAt } of params.downwardMessages) {
85
+ // calculate new hash
86
+ dmqMqcHeadHash = blake2AsHex(u8aConcat(meta.registry.createType('Hash', dmqMqcHeadHash).toU8a(), meta.registry.createType('BlockNumber', sentAt).toU8a(), blake2AsU8a(meta.registry.createType('Bytes', msg).toU8a(), 256)), 256);
87
+ downwardMessages.push({
88
+ msg,
89
+ sentAt,
90
+ });
91
+ }
92
+ newEntries.push([dmqMqcHeadKey, dmqMqcHeadHash]);
93
+ }
94
+ const hrmpIngressChannels = meta.registry
95
+ .createType('Vec<ParaId>', decoded[hrmpIngressChannelIndexKey])
96
+ .toJSON();
97
+ const hrmpEgressChannels = meta.registry
98
+ .createType('Vec<ParaId>', decoded[hrmpEgressChannelIndexKey])
99
+ .toJSON();
100
+ const hrmpMessages = Object.assign(Object.assign({}, _.mapValues(extrinsic.horizontalMessages, () => [])), params.horizontalMessages);
101
+ // inject horizontal messages
102
+ for (const id of hrmpIngressChannels) {
103
+ const messages = hrmpMessages[id];
104
+ const sender = Number(id);
105
+ const channelId = meta.registry.createType('HrmpChannelId', {
106
+ sender,
107
+ receiver: paraId.toNumber(),
108
+ });
109
+ const hrmpChannelKey = hrmpChannels(channelId);
110
+ const decoded = yield decodeProof(extrinsic.validationData.relayParentStorageRoot, [hrmpChannelKey], extrinsic.relayChainState.trieNodes);
111
+ const abridgedHrmpRaw = decoded[hrmpChannelKey];
112
+ if (!abridgedHrmpRaw)
113
+ throw new Error('Canoot find hrmp channels from validation data');
114
+ const abridgedHrmp = meta.registry
115
+ .createType('AbridgedHrmpChannel', hexToU8a(abridgedHrmpRaw))
116
+ .toJSON();
117
+ const paraMessages = [];
118
+ for (const { data, sentAt } of messages) {
119
+ // calculate new hash
120
+ const bytes = meta.registry.createType('Bytes', data);
121
+ abridgedHrmp.mqcHead = blake2AsHex(u8aConcat(meta.registry.createType('Hash', abridgedHrmp.mqcHead).toU8a(), meta.registry.createType('BlockNumber', sentAt).toU8a(), blake2AsU8a(bytes.toU8a(), 256)), 256);
122
+ abridgedHrmp.msgCount = abridgedHrmp.msgCount + 1;
123
+ abridgedHrmp.totalSize = abridgedHrmp.totalSize + bytes.length;
124
+ paraMessages.push({
125
+ data,
126
+ sentAt,
127
+ });
128
+ }
129
+ horizontalMessages[sender] = paraMessages;
130
+ newEntries.push([hrmpChannelKey, meta.registry.createType('AbridgedHrmpChannel', abridgedHrmp).toHex()]);
131
+ }
132
+ // inject hrmpEgressChannels proof
133
+ for (const id of hrmpEgressChannels) {
134
+ // const messages = hrmpMessages[id]
135
+ const receiver = Number(id);
136
+ const channelId = meta.registry.createType('HrmpChannelId', {
137
+ sender: paraId.toNumber(),
138
+ receiver,
139
+ });
140
+ const hrmpChannelKey = hrmpChannels(channelId);
141
+ const decoded = yield decodeProof(extrinsic.validationData.relayParentStorageRoot, [hrmpChannelKey], extrinsic.relayChainState.trieNodes);
142
+ newEntries.push([hrmpChannelKey, decoded[hrmpChannelKey]]);
143
+ }
144
+ const upgradeKey = upgradeGoAheadSignal(paraId);
145
+ const pendingUpgrade = yield parent.get(compactHex(meta.query.parachainSystem.pendingValidationCode()));
146
+ if (pendingUpgrade) {
147
+ // send goAhead signal
148
+ const goAhead = meta.registry.createType('UpgradeGoAhead', 'GoAhead');
149
+ newEntries.push([upgradeKey, goAhead.toHex()]);
150
+ }
151
+ else {
152
+ // make sure previous goAhead is removed
153
+ newEntries.push([upgradeKey, null]);
154
+ }
155
+ const { trieRootHash, nodes } = yield createProof(extrinsic.relayChainState.trieNodes, newEntries);
156
+ newData = Object.assign(Object.assign({}, extrinsic), { downwardMessages,
157
+ horizontalMessages, validationData: Object.assign(Object.assign({}, extrinsic.validationData), { relayParentStorageRoot: trieRootHash, relayParentNumber: extrinsic.validationData.relayParentNumber + 2 }), relayChainState: {
158
+ trieNodes: nodes,
159
+ } });
160
+ }
161
+ const inherent = new GenericExtrinsic(meta.registry, meta.tx.parachainSystem.setValidationData(newData));
162
+ return [inherent.toHex()];
163
+ });
164
+ }
165
+ }
@@ -0,0 +1,32 @@
1
+ import { DataSource } from 'typeorm';
2
+ import { Api } from '../api';
3
+ export declare const enum StorageValueKind {
4
+ Deleted = "Deleted",
5
+ DeletedPrefix = "DeletedPrefix"
6
+ }
7
+ export type StorageValue = string | StorageValueKind | undefined;
8
+ export interface StorageLayerProvider {
9
+ get(key: string, cache: boolean): Promise<StorageValue>;
10
+ foldInto(into: StorageLayer): Promise<StorageLayerProvider | undefined>;
11
+ fold(): Promise<void>;
12
+ getKeysPaged(prefix: string, pageSize: number, startKey: string): Promise<string[]>;
13
+ }
14
+ export declare class RemoteStorageLayer implements StorageLayerProvider {
15
+ #private;
16
+ constructor(api: Api, at: string, db: DataSource | undefined);
17
+ get(key: string): Promise<StorageValue>;
18
+ foldInto(_into: StorageLayer): Promise<StorageLayerProvider>;
19
+ fold(): Promise<void>;
20
+ getKeysPaged(prefix: string, pageSize: number, startKey: string): Promise<string[]>;
21
+ }
22
+ export declare class StorageLayer implements StorageLayerProvider {
23
+ #private;
24
+ constructor(parent?: StorageLayerProvider);
25
+ get(key: string, cache: boolean): Promise<StorageValue | undefined>;
26
+ set(key: string, value: StorageValue): void;
27
+ setAll(values: Record<string, StorageValue | null> | [string, StorageValue | null][]): void;
28
+ foldInto(into: StorageLayer): Promise<StorageLayerProvider | undefined>;
29
+ fold(): Promise<void>;
30
+ getKeysPaged(prefix: string, pageSize: number, startKey: string): Promise<string[]>;
31
+ mergeInto(into: Record<string, string | null>): Promise<void>;
32
+ }
@@ -0,0 +1,242 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
11
+ if (kind === "m") throw new TypeError("Private method is not writable");
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
14
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
15
+ };
16
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
17
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
18
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
19
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
20
+ };
21
+ var _RemoteStorageLayer_api, _RemoteStorageLayer_at, _RemoteStorageLayer_db, _RemoteStorageLayer_keyCache, _StorageLayer_instances, _StorageLayer_store, _StorageLayer_keys, _StorageLayer_deletedPrefix, _StorageLayer_parent, _StorageLayer_addKey, _StorageLayer_removeKey;
22
+ import _ from 'lodash';
23
+ import { KeyValuePair } from '../db/entities';
24
+ import { defaultLogger } from '../logger';
25
+ import KeyCache from '../utils/key-cache';
26
+ const logger = defaultLogger.child({ name: 'layer' });
27
+ const BATCH_SIZE = 1000;
28
+ export var StorageValueKind;
29
+ (function (StorageValueKind) {
30
+ StorageValueKind["Deleted"] = "Deleted";
31
+ StorageValueKind["DeletedPrefix"] = "DeletedPrefix";
32
+ })(StorageValueKind || (StorageValueKind = {}));
33
+ export class RemoteStorageLayer {
34
+ constructor(api, at, db) {
35
+ _RemoteStorageLayer_api.set(this, void 0);
36
+ _RemoteStorageLayer_at.set(this, void 0);
37
+ _RemoteStorageLayer_db.set(this, void 0);
38
+ _RemoteStorageLayer_keyCache.set(this, new KeyCache());
39
+ __classPrivateFieldSet(this, _RemoteStorageLayer_api, api, "f");
40
+ __classPrivateFieldSet(this, _RemoteStorageLayer_at, at, "f");
41
+ __classPrivateFieldSet(this, _RemoteStorageLayer_db, db, "f");
42
+ }
43
+ get(key) {
44
+ var _a;
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ const keyValuePair = (_a = __classPrivateFieldGet(this, _RemoteStorageLayer_db, "f")) === null || _a === void 0 ? void 0 : _a.getRepository(KeyValuePair);
47
+ if (__classPrivateFieldGet(this, _RemoteStorageLayer_db, "f")) {
48
+ const res = yield (keyValuePair === null || keyValuePair === void 0 ? void 0 : keyValuePair.findOne({ where: { key, blockHash: __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f") } }));
49
+ if (res) {
50
+ return res.value;
51
+ }
52
+ }
53
+ logger.trace({ at: __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), key }, 'RemoteStorageLayer get');
54
+ const data = yield __classPrivateFieldGet(this, _RemoteStorageLayer_api, "f").getStorage(key, __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"));
55
+ keyValuePair === null || keyValuePair === void 0 ? void 0 : keyValuePair.upsert({ key, blockHash: __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), value: data }, ['key', 'blockHash']);
56
+ return data;
57
+ });
58
+ }
59
+ foldInto(_into) {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ return this;
62
+ });
63
+ }
64
+ fold() {
65
+ return __awaiter(this, void 0, void 0, function* () { });
66
+ }
67
+ getKeysPaged(prefix, pageSize, startKey) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ if (pageSize > BATCH_SIZE)
70
+ throw new Error(`pageSize must be less or equal to ${BATCH_SIZE}`);
71
+ logger.trace({ at: __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), prefix, pageSize, startKey }, 'RemoteStorageLayer getKeysPaged');
72
+ // can't handle keyCache without prefix
73
+ if (prefix.length < 66) {
74
+ return __classPrivateFieldGet(this, _RemoteStorageLayer_api, "f").getKeysPaged(prefix, pageSize, startKey, __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"));
75
+ }
76
+ let batchComplete = false;
77
+ const keysPaged = [];
78
+ while (keysPaged.length < pageSize) {
79
+ const nextKey = yield __classPrivateFieldGet(this, _RemoteStorageLayer_keyCache, "f").next(startKey);
80
+ if (nextKey) {
81
+ keysPaged.push(nextKey);
82
+ startKey = nextKey;
83
+ continue;
84
+ }
85
+ // batch fetch was completed
86
+ if (batchComplete) {
87
+ break;
88
+ }
89
+ // fetch a batch of keys
90
+ const batch = yield __classPrivateFieldGet(this, _RemoteStorageLayer_api, "f").getKeysPaged(prefix, BATCH_SIZE, startKey, __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"));
91
+ batchComplete = batch.length < BATCH_SIZE;
92
+ // feed the key cache
93
+ if (batch.length > 0) {
94
+ __classPrivateFieldGet(this, _RemoteStorageLayer_keyCache, "f").feed([startKey, ...batch]);
95
+ }
96
+ if (batch.length === 0) {
97
+ // no more keys were found
98
+ break;
99
+ }
100
+ }
101
+ return keysPaged;
102
+ });
103
+ }
104
+ }
105
+ _RemoteStorageLayer_api = new WeakMap(), _RemoteStorageLayer_at = new WeakMap(), _RemoteStorageLayer_db = new WeakMap(), _RemoteStorageLayer_keyCache = new WeakMap();
106
+ export class StorageLayer {
107
+ constructor(parent) {
108
+ _StorageLayer_instances.add(this);
109
+ _StorageLayer_store.set(this, {});
110
+ _StorageLayer_keys.set(this, []);
111
+ _StorageLayer_deletedPrefix.set(this, []);
112
+ _StorageLayer_parent.set(this, void 0);
113
+ __classPrivateFieldSet(this, _StorageLayer_parent, parent, "f");
114
+ }
115
+ get(key, cache) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ if (key in __classPrivateFieldGet(this, _StorageLayer_store, "f")) {
118
+ return __classPrivateFieldGet(this, _StorageLayer_store, "f")[key];
119
+ }
120
+ if (__classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").some((prefix) => key.startsWith(prefix))) {
121
+ return StorageValueKind.Deleted;
122
+ }
123
+ if (__classPrivateFieldGet(this, _StorageLayer_parent, "f")) {
124
+ const val = __classPrivateFieldGet(this, _StorageLayer_parent, "f").get(key, false);
125
+ if (cache) {
126
+ __classPrivateFieldGet(this, _StorageLayer_store, "f")[key] = val;
127
+ }
128
+ return val;
129
+ }
130
+ return undefined;
131
+ });
132
+ }
133
+ set(key, value) {
134
+ switch (value) {
135
+ case StorageValueKind.Deleted:
136
+ __classPrivateFieldGet(this, _StorageLayer_store, "f")[key] = value;
137
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_removeKey).call(this, key);
138
+ break;
139
+ case StorageValueKind.DeletedPrefix:
140
+ __classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").push(key);
141
+ for (const k of __classPrivateFieldGet(this, _StorageLayer_keys, "f")) {
142
+ if (k.startsWith(key)) {
143
+ __classPrivateFieldGet(this, _StorageLayer_store, "f")[k] = StorageValueKind.Deleted;
144
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_removeKey).call(this, k);
145
+ }
146
+ }
147
+ break;
148
+ case undefined:
149
+ delete __classPrivateFieldGet(this, _StorageLayer_store, "f")[key];
150
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_removeKey).call(this, key);
151
+ break;
152
+ default:
153
+ __classPrivateFieldGet(this, _StorageLayer_store, "f")[key] = value;
154
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_addKey).call(this, key);
155
+ break;
156
+ }
157
+ }
158
+ setAll(values) {
159
+ if (!Array.isArray(values)) {
160
+ values = Object.entries(values);
161
+ }
162
+ for (const [key, value] of values) {
163
+ this.set(key, value || StorageValueKind.Deleted);
164
+ }
165
+ }
166
+ foldInto(into) {
167
+ var _a;
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ const newParent = yield ((_a = __classPrivateFieldGet(this, _StorageLayer_parent, "f")) === null || _a === void 0 ? void 0 : _a.foldInto(into));
170
+ for (const deletedPrefix of __classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f")) {
171
+ into.set(deletedPrefix, StorageValueKind.DeletedPrefix);
172
+ }
173
+ for (const key of __classPrivateFieldGet(this, _StorageLayer_keys, "f")) {
174
+ const value = yield __classPrivateFieldGet(this, _StorageLayer_store, "f")[key];
175
+ into.set(key, value);
176
+ }
177
+ return newParent;
178
+ });
179
+ }
180
+ fold() {
181
+ return __awaiter(this, void 0, void 0, function* () {
182
+ if (__classPrivateFieldGet(this, _StorageLayer_parent, "f")) {
183
+ __classPrivateFieldSet(this, _StorageLayer_parent, yield __classPrivateFieldGet(this, _StorageLayer_parent, "f").foldInto(this), "f");
184
+ }
185
+ });
186
+ }
187
+ getKeysPaged(prefix, pageSize, startKey) {
188
+ var _a, _b;
189
+ return __awaiter(this, void 0, void 0, function* () {
190
+ if (!__classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").some((prefix) => startKey.startsWith(prefix))) {
191
+ const remote = (_b = (yield ((_a = __classPrivateFieldGet(this, _StorageLayer_parent, "f")) === null || _a === void 0 ? void 0 : _a.getKeysPaged(prefix, pageSize, startKey)))) !== null && _b !== void 0 ? _b : [];
192
+ for (const key of remote) {
193
+ if (__classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").some((prefix) => key.startsWith(prefix))) {
194
+ continue;
195
+ }
196
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_addKey).call(this, key);
197
+ }
198
+ }
199
+ let idx = _.sortedIndex(__classPrivateFieldGet(this, _StorageLayer_keys, "f"), startKey);
200
+ if (__classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx] === startKey) {
201
+ ++idx;
202
+ }
203
+ const res = [];
204
+ while (res.length < pageSize) {
205
+ const key = __classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx];
206
+ if (!key || !key.startsWith(prefix)) {
207
+ break;
208
+ }
209
+ res.push(key);
210
+ ++idx;
211
+ }
212
+ return res;
213
+ });
214
+ }
215
+ mergeInto(into) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ for (const [key, maybeValue] of Object.entries(__classPrivateFieldGet(this, _StorageLayer_store, "f"))) {
218
+ const value = yield maybeValue;
219
+ if (value === StorageValueKind.Deleted) {
220
+ into[key] = null;
221
+ }
222
+ else {
223
+ into[key] = value;
224
+ }
225
+ }
226
+ });
227
+ }
228
+ }
229
+ _StorageLayer_store = new WeakMap(), _StorageLayer_keys = new WeakMap(), _StorageLayer_deletedPrefix = new WeakMap(), _StorageLayer_parent = new WeakMap(), _StorageLayer_instances = new WeakSet(), _StorageLayer_addKey = function _StorageLayer_addKey(key) {
230
+ const idx = _.sortedIndex(__classPrivateFieldGet(this, _StorageLayer_keys, "f"), key);
231
+ const key2 = __classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx];
232
+ if (key === key2) {
233
+ return;
234
+ }
235
+ __classPrivateFieldGet(this, _StorageLayer_keys, "f").splice(idx, 0, key);
236
+ }, _StorageLayer_removeKey = function _StorageLayer_removeKey(key) {
237
+ const idx = _.sortedIndex(__classPrivateFieldGet(this, _StorageLayer_keys, "f"), key);
238
+ const key2 = __classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx];
239
+ if (key === key2) {
240
+ __classPrivateFieldGet(this, _StorageLayer_keys, "f").splice(idx, 1);
241
+ }
242
+ };
@@ -0,0 +1,44 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import { HexString } from '@polkadot/util/types';
3
+ import { Blockchain } from '.';
4
+ import { InherentProvider } from './inherent';
5
+ export declare const APPLY_EXTRINSIC_ERROR = "TxPool::ApplyExtrinsicError";
6
+ export declare enum BuildBlockMode {
7
+ Batch = 0,
8
+ Instant = 1,
9
+ Manual = 2
10
+ }
11
+ export interface DownwardMessage {
12
+ sentAt: number;
13
+ msg: HexString;
14
+ }
15
+ export interface HorizontalMessage {
16
+ sentAt: number;
17
+ data: HexString;
18
+ }
19
+ export interface BuildBlockParams {
20
+ downwardMessages: DownwardMessage[];
21
+ upwardMessages: Record<number, HexString[]>;
22
+ horizontalMessages: Record<number, HorizontalMessage[]>;
23
+ transactions: HexString[];
24
+ }
25
+ export declare class TxPool {
26
+ #private;
27
+ readonly event: EventEmitter<string | symbol, any>;
28
+ constructor(chain: Blockchain, inherentProvider: InherentProvider, mode?: BuildBlockMode);
29
+ get pendingExtrinsics(): HexString[];
30
+ get ump(): Record<number, HexString[]>;
31
+ get dmp(): DownwardMessage[];
32
+ get hrmp(): Record<number, HorizontalMessage[]>;
33
+ get mode(): BuildBlockMode;
34
+ set mode(mode: BuildBlockMode);
35
+ clear(): void;
36
+ pendingExtrinsicsBy(address: string): HexString[];
37
+ submitExtrinsic(extrinsic: HexString): Promise<void>;
38
+ submitUpwardMessages(id: number, ump: HexString[]): void;
39
+ submitDownwardMessages(dmp: DownwardMessage[]): void;
40
+ submitHorizontalMessages(id: number, hrmp: HorizontalMessage[]): void;
41
+ buildBlockWithParams(params: BuildBlockParams): Promise<void>;
42
+ buildBlock(params?: Partial<BuildBlockParams>): Promise<void>;
43
+ upcomingBlocks(): Promise<number>;
44
+ }