@acala-network/chopsticks-core 0.8.5-5 → 0.9.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 (128) hide show
  1. package/{lib → dist/cjs}/api.js +7 -7
  2. package/{lib → dist/cjs}/blockchain/block.js +1 -4
  3. package/{lib → dist/cjs}/genesis-provider.js +1 -1
  4. package/{lib → dist/cjs}/rpc/substrate/chain.js +1 -1
  5. package/{lib → dist/cjs}/utils/index.js +11 -1
  6. package/dist/esm/api.js +125 -0
  7. package/dist/esm/blockchain/block-builder.js +293 -0
  8. package/dist/esm/blockchain/block.js +277 -0
  9. package/dist/esm/blockchain/head-state.js +79 -0
  10. package/dist/esm/blockchain/index.js +413 -0
  11. package/dist/esm/blockchain/inherent/index.js +40 -0
  12. package/dist/esm/blockchain/inherent/para-enter.js +29 -0
  13. package/dist/esm/blockchain/inherent/parachain/babe-randomness.js +11 -0
  14. package/dist/esm/blockchain/inherent/parachain/nimbus-author-inherent.js +11 -0
  15. package/dist/esm/blockchain/inherent/parachain/validation-data.js +165 -0
  16. package/dist/esm/blockchain/storage-layer.js +215 -0
  17. package/dist/esm/blockchain/txpool.js +208 -0
  18. package/dist/esm/chopsticks-provider.js +156 -0
  19. package/dist/esm/database.js +1 -0
  20. package/dist/esm/genesis-provider.js +144 -0
  21. package/dist/esm/logger.js +34 -0
  22. package/dist/esm/offchain.js +36 -0
  23. package/dist/esm/rpc/index.js +10 -0
  24. package/dist/esm/rpc/shared.js +15 -0
  25. package/dist/esm/rpc/substrate/author.js +85 -0
  26. package/dist/esm/rpc/substrate/chain.js +84 -0
  27. package/dist/esm/rpc/substrate/index.js +18 -0
  28. package/dist/esm/rpc/substrate/payment.js +40 -0
  29. package/dist/esm/rpc/substrate/state.js +166 -0
  30. package/dist/esm/rpc/substrate/system.js +48 -0
  31. package/dist/esm/schema/index.js +11 -0
  32. package/dist/esm/setup.js +71 -0
  33. package/dist/esm/utils/decoder.js +95 -0
  34. package/dist/esm/utils/index.js +91 -0
  35. package/dist/esm/utils/key-cache.js +61 -0
  36. package/dist/esm/utils/proof.js +33 -0
  37. package/dist/esm/utils/set-storage.js +56 -0
  38. package/dist/esm/utils/time-travel.js +58 -0
  39. package/dist/esm/wasm-executor/browser-wasm-executor.mjs +32 -0
  40. package/dist/esm/wasm-executor/browser-worker.js +15 -0
  41. package/dist/esm/wasm-executor/index.js +146 -0
  42. package/dist/esm/wasm-executor/node-wasm-executor.mjs +29 -0
  43. package/dist/esm/wasm-executor/node-worker.js +15 -0
  44. package/dist/esm/xcm/downward.js +25 -0
  45. package/dist/esm/xcm/horizontal.js +25 -0
  46. package/dist/esm/xcm/index.js +20 -0
  47. package/dist/esm/xcm/upward.js +17 -0
  48. package/{lib → dist/types}/genesis-provider.d.ts +2 -2
  49. package/dist/types/index.d.ts +28 -0
  50. package/{lib → dist/types}/utils/index.d.ts +1 -0
  51. package/package.json +23 -14
  52. /package/{lib → dist/cjs}/blockchain/block-builder.js +0 -0
  53. /package/{lib → dist/cjs}/blockchain/head-state.js +0 -0
  54. /package/{lib → dist/cjs}/blockchain/index.js +0 -0
  55. /package/{lib → dist/cjs}/blockchain/inherent/index.js +0 -0
  56. /package/{lib → dist/cjs}/blockchain/inherent/para-enter.js +0 -0
  57. /package/{lib → dist/cjs}/blockchain/inherent/parachain/babe-randomness.js +0 -0
  58. /package/{lib → dist/cjs}/blockchain/inherent/parachain/nimbus-author-inherent.js +0 -0
  59. /package/{lib → dist/cjs}/blockchain/inherent/parachain/validation-data.js +0 -0
  60. /package/{lib → dist/cjs}/blockchain/storage-layer.js +0 -0
  61. /package/{lib → dist/cjs}/blockchain/txpool.js +0 -0
  62. /package/{lib → dist/cjs}/chopsticks-provider.js +0 -0
  63. /package/{lib → dist/cjs}/database.js +0 -0
  64. /package/{lib → dist/cjs}/index.js +0 -0
  65. /package/{lib → dist/cjs}/logger.js +0 -0
  66. /package/{lib → dist/cjs}/offchain.js +0 -0
  67. /package/{lib → dist/cjs}/rpc/index.js +0 -0
  68. /package/{lib → dist/cjs}/rpc/shared.js +0 -0
  69. /package/{lib → dist/cjs}/rpc/substrate/author.js +0 -0
  70. /package/{lib → dist/cjs}/rpc/substrate/index.js +0 -0
  71. /package/{lib → dist/cjs}/rpc/substrate/payment.js +0 -0
  72. /package/{lib → dist/cjs}/rpc/substrate/state.js +0 -0
  73. /package/{lib → dist/cjs}/rpc/substrate/system.js +0 -0
  74. /package/{lib → dist/cjs}/schema/index.js +0 -0
  75. /package/{lib → dist/cjs}/setup.js +0 -0
  76. /package/{lib → dist/cjs}/utils/decoder.js +0 -0
  77. /package/{lib → dist/cjs}/utils/key-cache.js +0 -0
  78. /package/{lib → dist/cjs}/utils/proof.js +0 -0
  79. /package/{lib → dist/cjs}/utils/set-storage.js +0 -0
  80. /package/{lib → dist/cjs}/utils/time-travel.js +0 -0
  81. /package/{lib → dist/cjs}/wasm-executor/browser-wasm-executor.mjs +0 -0
  82. /package/{lib → dist/cjs}/wasm-executor/browser-worker.js +0 -0
  83. /package/{lib → dist/cjs}/wasm-executor/index.js +0 -0
  84. /package/{lib → dist/cjs}/wasm-executor/node-wasm-executor.mjs +0 -0
  85. /package/{lib → dist/cjs}/wasm-executor/node-worker.js +0 -0
  86. /package/{lib → dist/cjs}/xcm/downward.js +0 -0
  87. /package/{lib → dist/cjs}/xcm/horizontal.js +0 -0
  88. /package/{lib → dist/cjs}/xcm/index.js +0 -0
  89. /package/{lib → dist/cjs}/xcm/upward.js +0 -0
  90. /package/{lib/index.d.ts → dist/esm/index.js} +0 -0
  91. /package/{lib → dist/types}/api.d.ts +0 -0
  92. /package/{lib → dist/types}/blockchain/block-builder.d.ts +0 -0
  93. /package/{lib → dist/types}/blockchain/block.d.ts +0 -0
  94. /package/{lib → dist/types}/blockchain/head-state.d.ts +0 -0
  95. /package/{lib → dist/types}/blockchain/index.d.ts +0 -0
  96. /package/{lib → dist/types}/blockchain/inherent/index.d.ts +0 -0
  97. /package/{lib → dist/types}/blockchain/inherent/para-enter.d.ts +0 -0
  98. /package/{lib → dist/types}/blockchain/inherent/parachain/babe-randomness.d.ts +0 -0
  99. /package/{lib → dist/types}/blockchain/inherent/parachain/nimbus-author-inherent.d.ts +0 -0
  100. /package/{lib → dist/types}/blockchain/inherent/parachain/validation-data.d.ts +0 -0
  101. /package/{lib → dist/types}/blockchain/storage-layer.d.ts +0 -0
  102. /package/{lib → dist/types}/blockchain/txpool.d.ts +0 -0
  103. /package/{lib → dist/types}/chopsticks-provider.d.ts +0 -0
  104. /package/{lib → dist/types}/database.d.ts +0 -0
  105. /package/{lib → dist/types}/logger.d.ts +0 -0
  106. /package/{lib → dist/types}/offchain.d.ts +0 -0
  107. /package/{lib → dist/types}/rpc/index.d.ts +0 -0
  108. /package/{lib → dist/types}/rpc/shared.d.ts +0 -0
  109. /package/{lib → dist/types}/rpc/substrate/author.d.ts +0 -0
  110. /package/{lib → dist/types}/rpc/substrate/chain.d.ts +0 -0
  111. /package/{lib → dist/types}/rpc/substrate/index.d.ts +0 -0
  112. /package/{lib → dist/types}/rpc/substrate/payment.d.ts +0 -0
  113. /package/{lib → dist/types}/rpc/substrate/state.d.ts +0 -0
  114. /package/{lib → dist/types}/rpc/substrate/system.d.ts +0 -0
  115. /package/{lib → dist/types}/schema/index.d.ts +0 -0
  116. /package/{lib → dist/types}/setup.d.ts +0 -0
  117. /package/{lib → dist/types}/utils/decoder.d.ts +0 -0
  118. /package/{lib → dist/types}/utils/key-cache.d.ts +0 -0
  119. /package/{lib → dist/types}/utils/proof.d.ts +0 -0
  120. /package/{lib → dist/types}/utils/set-storage.d.ts +0 -0
  121. /package/{lib → dist/types}/utils/time-travel.d.ts +0 -0
  122. /package/{lib → dist/types}/wasm-executor/browser-worker.d.ts +0 -0
  123. /package/{lib → dist/types}/wasm-executor/index.d.ts +0 -0
  124. /package/{lib → dist/types}/wasm-executor/node-worker.d.ts +0 -0
  125. /package/{lib → dist/types}/xcm/downward.d.ts +0 -0
  126. /package/{lib → dist/types}/xcm/horizontal.d.ts +0 -0
  127. /package/{lib → dist/types}/xcm/index.d.ts +0 -0
  128. /package/{lib → dist/types}/xcm/upward.d.ts +0 -0
@@ -0,0 +1,165 @@
1
+ import { GenericExtrinsic } from '@polkadot/types';
2
+ import { hexToU8a, u8aConcat } from '@polkadot/util';
3
+ import _ from 'lodash';
4
+ import { WELL_KNOWN_KEYS, dmqMqcHead, hrmpChannels, hrmpEgressChannelIndex, hrmpIngressChannelIndex, upgradeGoAheadSignal, } from '../../../utils/proof';
5
+ import { blake2AsHex, blake2AsU8a } from '@polkadot/util-crypto';
6
+ import { compactHex, getParaId } from '../../../utils';
7
+ import { createProof, decodeProof } from '../../../wasm-executor';
8
+ const MOCK_VALIDATION_DATA = {
9
+ validationData: {
10
+ relayParentNumber: 1000,
11
+ relayParentStorageRoot: '0x49416764844ff0d8bad851e8abe686dff9dd2de78621180ef8e9f99bb7a480f1',
12
+ maxPovSize: 5242880,
13
+ },
14
+ relayChainState: {
15
+ trieNodes: [
16
+ '0x5f04b49d95320d9021994c850f25b8e385f902000030000080000008000000000010000000100005000000050000000a0000000a000000000050000000100000e8764817000000040000000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000400000000001000b0040000000000000000000014000000040000000400000000000000010100000000060000006400000002000000c8000000020000001900000000000000020000000200000000c817a804000000',
17
+ '0x80011080ace5323aee784b03389c0e2cc68d81973f8fa26d395f333ecad7399271c781e1808e5db75be813c05205986cbd6fdede707a4d26816063a41eb42ebc262c734fad',
18
+ '0x8004648086a9239b72237f5bf119e2a880c32f5866460632700509cb874c60f67fe815ea80f6f6801e4b41e2e6d8ec194dba122bfb9eb33feb2545ef5144cea79551f7cc5280c629a7e712d763fe83b35d2a082430af6737a89f23219c0eb3051c83bc5af5ad80fed5ecd6097308a6540f8cf31aeaad186e6898d2ecc0e623767c521c70e39953',
19
+ '0x800804809f3ada68c357b5e0a3ebb39ef181acfa9943af4725c244330a4b2c60837612e88082ad3fbdf392429afeacc70177704b760bb145547c1f152e1fcf651916b43820',
20
+ '0x8008208042793f557c1d003b647e2eda79c2b5088c7d8cab2e82c1dcc87f4343cca91ae4485ead6eef5c4b1c68eaa71ea17a02d9de0400',
21
+ '0x80210280de38445d825563f8e218255a417c16971afa85b4f2ef18fbe08fbc5b976dc0d6801a2ff24096295cfccf1adda80b8dfffe380b9f3b54d7a3cdb67864a4655e62968022a699b2cc90a6654c84163d2a498506b192afe7cd9777227e5288e8ff069c0f',
22
+ '0x80400180ebebd1a1cd0bbc6714b7fb0ac854cca5a4c4e34e69485da48be3c8087b56e09b80128645c79ca6581c248a412fd7b8bc532a187600e6e1cc20c915538ba4df6a79',
23
+ '0x80ffbe80d9302a505e2b1ac931f539aed33bf791d1982906ae64c7197324044f191e9bca80972cd2f703f9c94fd516e14b7013c6f1545095855b6c4b36f21d89dad30aa54d80b2495ce4d07001927bb0857611f8d3a1449e791d0b010e3861c32dec0c44179680f5929c8ef9b0ac6ec8a529c91348d8cd6c169920dd37d055544a6c31c53b11e380402a0bf7ff07cee790d9cc065fc138ff6afa7db016d898d65b2b716af354c6f68042aef1dafffd1d9debbb8e6c4eb48b5c141ddf0aad2b0f3f4ddf53e6b38e65c080b31fa0392c1abdce1aa29d1544c94634ecab87ecaba6409db33aaa7621992a8280b1f4de7c3ac5665016d561a60659cd2d8f2d3e0a97e2ea9749279bd8e35eb1f180816ac87a2893694016b21768137a76ea459190ea0fc3c645d85e1a3d4eb194fe802e563b43e7334454c841953424be8c2b7a1c3295dbc391045cb6b88388ad5e7080b1ed3b02e5989b7d134ca056c778f1f5b6ffd377b2d8064483da6e94b82b0e40800cb3299c44a5db8fdcb4932e1b6ab0385d6ef1c9f8d85e0a75b787b6f4fd6c3c805a44c30e2676dc2d4c17451f51d9502e85064387999f366e6f3d404509a7780f80d6788ca71c6aabe421c352027acdb9532563dc5f1b25e6154b721f431e9990ed',
24
+ '0x9d0da05ca59913bc38a8630590f2627c154080834dda0ba5adf00d798e981a28a13e728cf83e35aefc87318440a61869f724474c5f0a351b6a99a5b21324516e668bb86a570400505f0e7b9012096b41c4eb3aaf947f6ea4290800007c7700e67da63472835bb0b737093a19ad4c63f5a4efb16ffa83d00700000400',
25
+ '0x9e207f03cfdce586301014700e2c25931040505f0e7b9012096b41c4eb3aaf947f6ea4290800004c5f0ec2d17a76153ff51817f12d9cfc3c7f0400',
26
+ '0x9e710b30bd2eab0352ddcc26417aa1945fc180699a53b51a9709a3a86039c49b5ef278e9fc244dae27e1a0380c91bff5b0488580c0d4096d94e724b8e86f952e5456c7253776de04c405582d2c350ee172d3eaa77c77081e0bfde17b36573208a06cb5cfba6b63f5a4efb16ffa83d00700000402803d0ae0b8f6832e8fabf0ec62521c2487c58b69eb97060faa8059b00ff6b7262d505f0e7b9012096b41c4eb3aaf947f6ea4290800004c5f03c716fb8fff3de61a883bb76adb34a20400806c8122e0f7f786071d6a51b330d612eccdcbe8d8f79936accabd640506dffdf380a6abfb72ed49b586829cca4ce631c092d45a017ab0d68288d308873025cfe5d280521b868fc212b25f021984cf02ced547cd45952b88360766839dfde7d4683e61',
27
+ '0x9ede3d8a54d27e44a9d5ce189618f22d1008505f0e7b9012096b41c4eb3aaf947f6ea42908010080c74756edffa217dfb07ab596d82753deff985ac215e5cc2997d29afe1d397c16',
28
+ '0x9ef78c98723ddc9073523ef3beefda0c1004505f0e7b9012096b41c4eb3aaf947f6ea4290800007c77095dac46c07a40d91506e7637ec4ba5763f5a4efb16ffa83d00700000400',
29
+ ],
30
+ },
31
+ };
32
+ export class SetValidationData {
33
+ async createInherents(parent, params) {
34
+ const meta = await parent.meta;
35
+ if (!meta.tx.parachainSystem?.setValidationData) {
36
+ return [];
37
+ }
38
+ const extrinsics = await parent.extrinsics;
39
+ let newData;
40
+ if (parent.number === 0) {
41
+ // chain started with genesis, mock 1st validationData
42
+ newData = MOCK_VALIDATION_DATA;
43
+ }
44
+ else {
45
+ const validationDataExtrinsic = extrinsics.find((extrinsic) => {
46
+ const firstArg = meta.registry.createType('GenericExtrinsic', extrinsic)?.args?.[0];
47
+ return firstArg && 'validationData' in firstArg;
48
+ });
49
+ if (!validationDataExtrinsic) {
50
+ throw new Error('Missing validation data from block');
51
+ }
52
+ const extrinsic = meta.registry
53
+ .createType('GenericExtrinsic', validationDataExtrinsic)
54
+ .args[0].toJSON();
55
+ const newEntries = [];
56
+ const downwardMessages = [];
57
+ const horizontalMessages = {};
58
+ const paraId = await getParaId(parent.chain);
59
+ const dmqMqcHeadKey = dmqMqcHead(paraId);
60
+ const hrmpIngressChannelIndexKey = hrmpIngressChannelIndex(paraId);
61
+ const hrmpEgressChannelIndexKey = hrmpEgressChannelIndex(paraId);
62
+ // TODO: refactor this to have a single decodeProof
63
+ const decoded = await decodeProof(extrinsic.validationData.relayParentStorageRoot, [...Object.values(WELL_KNOWN_KEYS), dmqMqcHeadKey, hrmpIngressChannelIndexKey, hrmpEgressChannelIndexKey], extrinsic.relayChainState.trieNodes);
64
+ for (const key of Object.values(WELL_KNOWN_KEYS)) {
65
+ newEntries.push([key, decoded[key]]);
66
+ }
67
+ newEntries.push([hrmpIngressChannelIndexKey, decoded[hrmpIngressChannelIndexKey]]);
68
+ newEntries.push([hrmpEgressChannelIndexKey, decoded[hrmpEgressChannelIndexKey]]);
69
+ // inject downward messages
70
+ let dmqMqcHeadHash = decoded[dmqMqcHeadKey];
71
+ if (dmqMqcHeadHash) {
72
+ for (const { msg, sentAt } of params.downwardMessages) {
73
+ // calculate new hash
74
+ dmqMqcHeadHash = blake2AsHex(u8aConcat(meta.registry.createType('Hash', dmqMqcHeadHash).toU8a(), meta.registry.createType('BlockNumber', sentAt).toU8a(), blake2AsU8a(meta.registry.createType('Bytes', msg).toU8a(), 256)), 256);
75
+ downwardMessages.push({
76
+ msg,
77
+ sentAt,
78
+ });
79
+ }
80
+ newEntries.push([dmqMqcHeadKey, dmqMqcHeadHash]);
81
+ }
82
+ const hrmpIngressChannels = meta.registry
83
+ .createType('Vec<ParaId>', decoded[hrmpIngressChannelIndexKey])
84
+ .toJSON();
85
+ const hrmpEgressChannels = meta.registry
86
+ .createType('Vec<ParaId>', decoded[hrmpEgressChannelIndexKey])
87
+ .toJSON();
88
+ const hrmpMessages = {
89
+ // reset values, we just need the keys
90
+ ..._.mapValues(extrinsic.horizontalMessages, () => []),
91
+ ...params.horizontalMessages,
92
+ };
93
+ // inject horizontal messages
94
+ for (const id of hrmpIngressChannels) {
95
+ const messages = hrmpMessages[id];
96
+ const sender = Number(id);
97
+ const channelId = meta.registry.createType('HrmpChannelId', {
98
+ sender,
99
+ receiver: paraId.toNumber(),
100
+ });
101
+ const hrmpChannelKey = hrmpChannels(channelId);
102
+ const decoded = await decodeProof(extrinsic.validationData.relayParentStorageRoot, [hrmpChannelKey], extrinsic.relayChainState.trieNodes);
103
+ const abridgedHrmpRaw = decoded[hrmpChannelKey];
104
+ if (!abridgedHrmpRaw)
105
+ throw new Error('Canoot find hrmp channels from validation data');
106
+ const abridgedHrmp = meta.registry
107
+ .createType('AbridgedHrmpChannel', hexToU8a(abridgedHrmpRaw))
108
+ .toJSON();
109
+ const paraMessages = [];
110
+ for (const { data, sentAt } of messages) {
111
+ // calculate new hash
112
+ const bytes = meta.registry.createType('Bytes', data);
113
+ abridgedHrmp.mqcHead = blake2AsHex(u8aConcat(meta.registry.createType('Hash', abridgedHrmp.mqcHead).toU8a(), meta.registry.createType('BlockNumber', sentAt).toU8a(), blake2AsU8a(bytes.toU8a(), 256)), 256);
114
+ abridgedHrmp.msgCount = abridgedHrmp.msgCount + 1;
115
+ abridgedHrmp.totalSize = abridgedHrmp.totalSize + bytes.length;
116
+ paraMessages.push({
117
+ data,
118
+ sentAt,
119
+ });
120
+ }
121
+ horizontalMessages[sender] = paraMessages;
122
+ newEntries.push([hrmpChannelKey, meta.registry.createType('AbridgedHrmpChannel', abridgedHrmp).toHex()]);
123
+ }
124
+ // inject hrmpEgressChannels proof
125
+ for (const id of hrmpEgressChannels) {
126
+ // const messages = hrmpMessages[id]
127
+ const receiver = Number(id);
128
+ const channelId = meta.registry.createType('HrmpChannelId', {
129
+ sender: paraId.toNumber(),
130
+ receiver,
131
+ });
132
+ const hrmpChannelKey = hrmpChannels(channelId);
133
+ const decoded = await decodeProof(extrinsic.validationData.relayParentStorageRoot, [hrmpChannelKey], extrinsic.relayChainState.trieNodes);
134
+ newEntries.push([hrmpChannelKey, decoded[hrmpChannelKey]]);
135
+ }
136
+ const upgradeKey = upgradeGoAheadSignal(paraId);
137
+ const pendingUpgrade = await parent.get(compactHex(meta.query.parachainSystem.pendingValidationCode()));
138
+ if (pendingUpgrade) {
139
+ // send goAhead signal
140
+ const goAhead = meta.registry.createType('UpgradeGoAhead', 'GoAhead');
141
+ newEntries.push([upgradeKey, goAhead.toHex()]);
142
+ }
143
+ else {
144
+ // make sure previous goAhead is removed
145
+ newEntries.push([upgradeKey, null]);
146
+ }
147
+ const { trieRootHash, nodes } = await createProof(extrinsic.relayChainState.trieNodes, newEntries);
148
+ newData = {
149
+ ...extrinsic,
150
+ downwardMessages,
151
+ horizontalMessages,
152
+ validationData: {
153
+ ...extrinsic.validationData,
154
+ relayParentStorageRoot: trieRootHash,
155
+ relayParentNumber: extrinsic.validationData.relayParentNumber + 2,
156
+ },
157
+ relayChainState: {
158
+ trieNodes: nodes,
159
+ },
160
+ };
161
+ }
162
+ const inherent = new GenericExtrinsic(meta.registry, meta.tx.parachainSystem.setValidationData(newData));
163
+ return [inherent.toHex()];
164
+ }
165
+ }
@@ -0,0 +1,215 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ 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");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ 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");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _RemoteStorageLayer_api, _RemoteStorageLayer_at, _RemoteStorageLayer_db, _RemoteStorageLayer_keyCache, _StorageLayer_instances, _StorageLayer_store, _StorageLayer_keys, _StorageLayer_deletedPrefix, _StorageLayer_parent, _StorageLayer_addKey, _StorageLayer_removeKey;
13
+ import _ from 'lodash';
14
+ import { defaultLogger } from '../logger';
15
+ import KeyCache, { PREFIX_LENGTH } from '../utils/key-cache';
16
+ const logger = defaultLogger.child({ name: 'layer' });
17
+ const BATCH_SIZE = 1000;
18
+ export var StorageValueKind;
19
+ (function (StorageValueKind) {
20
+ StorageValueKind["Deleted"] = "Deleted";
21
+ StorageValueKind["DeletedPrefix"] = "DeletedPrefix";
22
+ })(StorageValueKind || (StorageValueKind = {}));
23
+ export class RemoteStorageLayer {
24
+ constructor(api, at, db) {
25
+ _RemoteStorageLayer_api.set(this, void 0);
26
+ _RemoteStorageLayer_at.set(this, void 0);
27
+ _RemoteStorageLayer_db.set(this, void 0);
28
+ _RemoteStorageLayer_keyCache.set(this, new KeyCache());
29
+ __classPrivateFieldSet(this, _RemoteStorageLayer_api, api, "f");
30
+ __classPrivateFieldSet(this, _RemoteStorageLayer_at, at, "f");
31
+ __classPrivateFieldSet(this, _RemoteStorageLayer_db, db, "f");
32
+ }
33
+ async get(key, _cache) {
34
+ if (__classPrivateFieldGet(this, _RemoteStorageLayer_db, "f")) {
35
+ const res = await __classPrivateFieldGet(this, _RemoteStorageLayer_db, "f").queryStorage(__classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), key);
36
+ if (res) {
37
+ return res.value ?? undefined;
38
+ }
39
+ }
40
+ logger.trace({ at: __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), key }, 'RemoteStorageLayer get');
41
+ const data = await __classPrivateFieldGet(this, _RemoteStorageLayer_api, "f").getStorage(key, __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"));
42
+ __classPrivateFieldGet(this, _RemoteStorageLayer_db, "f")?.saveStorage(__classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), key, data);
43
+ return data ?? undefined;
44
+ }
45
+ async foldInto(_into) {
46
+ return this;
47
+ }
48
+ async fold() { }
49
+ async getKeysPaged(prefix, pageSize, startKey) {
50
+ if (pageSize > BATCH_SIZE)
51
+ throw new Error(`pageSize must be less or equal to ${BATCH_SIZE}`);
52
+ logger.trace({ at: __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"), prefix, pageSize, startKey }, 'RemoteStorageLayer getKeysPaged');
53
+ // can't handle keyCache without prefix
54
+ if (prefix.length < PREFIX_LENGTH || startKey.length < PREFIX_LENGTH) {
55
+ return __classPrivateFieldGet(this, _RemoteStorageLayer_api, "f").getKeysPaged(prefix, pageSize, startKey, __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"));
56
+ }
57
+ let batchComplete = false;
58
+ const keysPaged = [];
59
+ while (keysPaged.length < pageSize) {
60
+ const nextKey = await __classPrivateFieldGet(this, _RemoteStorageLayer_keyCache, "f").next(startKey);
61
+ if (nextKey) {
62
+ keysPaged.push(nextKey);
63
+ startKey = nextKey;
64
+ continue;
65
+ }
66
+ // batch fetch was completed
67
+ if (batchComplete) {
68
+ break;
69
+ }
70
+ // fetch a batch of keys
71
+ const batch = await __classPrivateFieldGet(this, _RemoteStorageLayer_api, "f").getKeysPaged(prefix, BATCH_SIZE, startKey, __classPrivateFieldGet(this, _RemoteStorageLayer_at, "f"));
72
+ batchComplete = batch.length < BATCH_SIZE;
73
+ // feed the key cache
74
+ if (batch.length > 0) {
75
+ __classPrivateFieldGet(this, _RemoteStorageLayer_keyCache, "f").feed([startKey, ...batch]);
76
+ }
77
+ if (batch.length === 0) {
78
+ // no more keys were found
79
+ break;
80
+ }
81
+ }
82
+ return keysPaged;
83
+ }
84
+ }
85
+ _RemoteStorageLayer_api = new WeakMap(), _RemoteStorageLayer_at = new WeakMap(), _RemoteStorageLayer_db = new WeakMap(), _RemoteStorageLayer_keyCache = new WeakMap();
86
+ export class StorageLayer {
87
+ constructor(parent) {
88
+ _StorageLayer_instances.add(this);
89
+ _StorageLayer_store.set(this, new Map());
90
+ _StorageLayer_keys.set(this, []);
91
+ _StorageLayer_deletedPrefix.set(this, []);
92
+ _StorageLayer_parent.set(this, void 0);
93
+ __classPrivateFieldSet(this, _StorageLayer_parent, parent, "f");
94
+ }
95
+ async get(key, cache) {
96
+ if (__classPrivateFieldGet(this, _StorageLayer_store, "f").has(key)) {
97
+ return __classPrivateFieldGet(this, _StorageLayer_store, "f").get(key);
98
+ }
99
+ if (__classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").some((dp) => key.startsWith(dp))) {
100
+ return StorageValueKind.Deleted;
101
+ }
102
+ if (__classPrivateFieldGet(this, _StorageLayer_parent, "f")) {
103
+ const val = __classPrivateFieldGet(this, _StorageLayer_parent, "f").get(key, false);
104
+ if (cache) {
105
+ __classPrivateFieldGet(this, _StorageLayer_store, "f").set(key, val);
106
+ }
107
+ return val;
108
+ }
109
+ return undefined;
110
+ }
111
+ set(key, value) {
112
+ switch (value) {
113
+ case StorageValueKind.Deleted:
114
+ __classPrivateFieldGet(this, _StorageLayer_store, "f").set(key, StorageValueKind.Deleted);
115
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_removeKey).call(this, key);
116
+ break;
117
+ case StorageValueKind.DeletedPrefix:
118
+ __classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").push(key);
119
+ for (const k of __classPrivateFieldGet(this, _StorageLayer_keys, "f")) {
120
+ if (k.startsWith(key)) {
121
+ __classPrivateFieldGet(this, _StorageLayer_store, "f").set(k, StorageValueKind.Deleted);
122
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_removeKey).call(this, k);
123
+ }
124
+ }
125
+ break;
126
+ case undefined:
127
+ __classPrivateFieldGet(this, _StorageLayer_store, "f").delete(key);
128
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_removeKey).call(this, key);
129
+ break;
130
+ default:
131
+ __classPrivateFieldGet(this, _StorageLayer_store, "f").set(key, value);
132
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_addKey).call(this, key);
133
+ break;
134
+ }
135
+ }
136
+ setAll(values) {
137
+ if (!Array.isArray(values)) {
138
+ values = Object.entries(values);
139
+ }
140
+ for (const [key, value] of values) {
141
+ this.set(key, value || StorageValueKind.Deleted);
142
+ }
143
+ }
144
+ async foldInto(into) {
145
+ const newParent = await __classPrivateFieldGet(this, _StorageLayer_parent, "f")?.foldInto(into);
146
+ for (const deletedPrefix of __classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f")) {
147
+ into.set(deletedPrefix, StorageValueKind.DeletedPrefix);
148
+ }
149
+ for (const [key, value] of __classPrivateFieldGet(this, _StorageLayer_store, "f")) {
150
+ into.set(key, await value);
151
+ }
152
+ return newParent;
153
+ }
154
+ async fold() {
155
+ if (__classPrivateFieldGet(this, _StorageLayer_parent, "f")) {
156
+ __classPrivateFieldSet(this, _StorageLayer_parent, await __classPrivateFieldGet(this, _StorageLayer_parent, "f").foldInto(this), "f");
157
+ }
158
+ }
159
+ async getKeysPaged(prefix, pageSize, startKey) {
160
+ if (!__classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").some((dp) => startKey.startsWith(dp))) {
161
+ const remote = (await __classPrivateFieldGet(this, _StorageLayer_parent, "f")?.getKeysPaged(prefix, pageSize, startKey)) ?? [];
162
+ for (const key of remote) {
163
+ if (__classPrivateFieldGet(this, _StorageLayer_store, "f").get(key) === StorageValueKind.Deleted) {
164
+ continue;
165
+ }
166
+ if (__classPrivateFieldGet(this, _StorageLayer_deletedPrefix, "f").some((dp) => key.startsWith(dp))) {
167
+ continue;
168
+ }
169
+ __classPrivateFieldGet(this, _StorageLayer_instances, "m", _StorageLayer_addKey).call(this, key);
170
+ }
171
+ }
172
+ let idx = _.sortedIndex(__classPrivateFieldGet(this, _StorageLayer_keys, "f"), startKey);
173
+ if (__classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx] === startKey) {
174
+ ++idx;
175
+ }
176
+ const res = [];
177
+ while (res.length < pageSize) {
178
+ const key = __classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx];
179
+ if (!key || !key.startsWith(prefix)) {
180
+ break;
181
+ }
182
+ res.push(key);
183
+ ++idx;
184
+ }
185
+ return res;
186
+ }
187
+ /**
188
+ * Merge the storage layer into the given object, can be used to get sotrage diff.
189
+ */
190
+ async mergeInto(into) {
191
+ for (const [key, maybeValue] of __classPrivateFieldGet(this, _StorageLayer_store, "f")) {
192
+ const value = await maybeValue;
193
+ if (value === StorageValueKind.Deleted) {
194
+ into[key] = null;
195
+ }
196
+ else {
197
+ into[key] = value;
198
+ }
199
+ }
200
+ }
201
+ }
202
+ _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) {
203
+ const idx = _.sortedIndex(__classPrivateFieldGet(this, _StorageLayer_keys, "f"), key);
204
+ const key2 = __classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx];
205
+ if (key === key2) {
206
+ return;
207
+ }
208
+ __classPrivateFieldGet(this, _StorageLayer_keys, "f").splice(idx, 0, key);
209
+ }, _StorageLayer_removeKey = function _StorageLayer_removeKey(key) {
210
+ const idx = _.sortedIndex(__classPrivateFieldGet(this, _StorageLayer_keys, "f"), key);
211
+ const key2 = __classPrivateFieldGet(this, _StorageLayer_keys, "f")[idx];
212
+ if (key === key2) {
213
+ __classPrivateFieldGet(this, _StorageLayer_keys, "f").splice(idx, 1);
214
+ }
215
+ };
@@ -0,0 +1,208 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ 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");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ 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");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _TxPool_instances, _TxPool_chain, _TxPool_pool, _TxPool_ump, _TxPool_dmp, _TxPool_hrmp, _TxPool_mode, _TxPool_inherentProvider, _TxPool_pendingBlocks, _TxPool_isBuilding, _TxPool_getSigner, _TxPool_maybeBuildBlock, _TxPool_batchBuildBlock, _TxPool_buildBlockIfNeeded, _TxPool_buildBlock;
13
+ import { EventEmitter } from 'eventemitter3';
14
+ import _ from 'lodash';
15
+ import { defer } from '../utils';
16
+ import { buildBlock } from './block-builder';
17
+ import { defaultLogger, truncate } from '../logger';
18
+ const logger = defaultLogger.child({ name: 'txpool' });
19
+ export const APPLY_EXTRINSIC_ERROR = 'TxPool::ApplyExtrinsicError';
20
+ export var BuildBlockMode;
21
+ (function (BuildBlockMode) {
22
+ /** One block per batch (default) */
23
+ BuildBlockMode[BuildBlockMode["Batch"] = 0] = "Batch";
24
+ /** One block per tx */
25
+ BuildBlockMode[BuildBlockMode["Instant"] = 1] = "Instant";
26
+ /** Only build when triggered */
27
+ BuildBlockMode[BuildBlockMode["Manual"] = 2] = "Manual";
28
+ })(BuildBlockMode || (BuildBlockMode = {}));
29
+ export class TxPool {
30
+ constructor(chain, inherentProvider, mode = BuildBlockMode.Batch) {
31
+ _TxPool_instances.add(this);
32
+ _TxPool_chain.set(this, void 0);
33
+ _TxPool_pool.set(this, []);
34
+ _TxPool_ump.set(this, {});
35
+ _TxPool_dmp.set(this, []);
36
+ _TxPool_hrmp.set(this, {});
37
+ _TxPool_mode.set(this, void 0);
38
+ _TxPool_inherentProvider.set(this, void 0);
39
+ _TxPool_pendingBlocks.set(this, []);
40
+ this.event = new EventEmitter();
41
+ _TxPool_isBuilding.set(this, false);
42
+ _TxPool_batchBuildBlock.set(this, _.debounce(this.buildBlock, 100, { maxWait: 1000 }));
43
+ __classPrivateFieldSet(this, _TxPool_chain, chain, "f");
44
+ __classPrivateFieldSet(this, _TxPool_mode, mode, "f");
45
+ __classPrivateFieldSet(this, _TxPool_inherentProvider, inherentProvider, "f");
46
+ }
47
+ get pendingExtrinsics() {
48
+ return __classPrivateFieldGet(this, _TxPool_pool, "f").map(({ extrinsic }) => extrinsic);
49
+ }
50
+ get ump() {
51
+ return __classPrivateFieldGet(this, _TxPool_ump, "f");
52
+ }
53
+ get dmp() {
54
+ return __classPrivateFieldGet(this, _TxPool_dmp, "f");
55
+ }
56
+ get hrmp() {
57
+ return __classPrivateFieldGet(this, _TxPool_hrmp, "f");
58
+ }
59
+ get mode() {
60
+ return __classPrivateFieldGet(this, _TxPool_mode, "f");
61
+ }
62
+ set mode(mode) {
63
+ __classPrivateFieldSet(this, _TxPool_mode, mode, "f");
64
+ }
65
+ clear() {
66
+ __classPrivateFieldGet(this, _TxPool_pool, "f").length = 0;
67
+ for (const id of Object.keys(__classPrivateFieldGet(this, _TxPool_ump, "f"))) {
68
+ delete __classPrivateFieldGet(this, _TxPool_ump, "f")[id];
69
+ }
70
+ __classPrivateFieldGet(this, _TxPool_dmp, "f").length = 0;
71
+ for (const id of Object.keys(__classPrivateFieldGet(this, _TxPool_hrmp, "f"))) {
72
+ delete __classPrivateFieldGet(this, _TxPool_hrmp, "f")[id];
73
+ }
74
+ }
75
+ pendingExtrinsicsBy(address) {
76
+ return __classPrivateFieldGet(this, _TxPool_pool, "f").filter(({ signer }) => signer === address).map(({ extrinsic }) => extrinsic);
77
+ }
78
+ async submitExtrinsic(extrinsic) {
79
+ logger.debug({ extrinsic: truncate(extrinsic) }, 'submit extrinsic');
80
+ __classPrivateFieldGet(this, _TxPool_pool, "f").push({ extrinsic, signer: await __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_getSigner).call(this, extrinsic) });
81
+ __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_maybeBuildBlock).call(this);
82
+ }
83
+ submitUpwardMessages(id, ump) {
84
+ logger.debug({ id, ump: truncate(ump) }, 'submit upward messages');
85
+ if (!__classPrivateFieldGet(this, _TxPool_ump, "f")[id]) {
86
+ __classPrivateFieldGet(this, _TxPool_ump, "f")[id] = [];
87
+ }
88
+ __classPrivateFieldGet(this, _TxPool_ump, "f")[id].push(...ump);
89
+ __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_maybeBuildBlock).call(this);
90
+ }
91
+ submitDownwardMessages(dmp) {
92
+ logger.debug({ dmp: truncate(dmp) }, 'submit downward messages');
93
+ __classPrivateFieldGet(this, _TxPool_dmp, "f").push(...dmp);
94
+ __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_maybeBuildBlock).call(this);
95
+ }
96
+ submitHorizontalMessages(id, hrmp) {
97
+ logger.debug({ id, hrmp: truncate(hrmp) }, 'submit horizontal messages');
98
+ if (!__classPrivateFieldGet(this, _TxPool_hrmp, "f")[id]) {
99
+ __classPrivateFieldGet(this, _TxPool_hrmp, "f")[id] = [];
100
+ }
101
+ __classPrivateFieldGet(this, _TxPool_hrmp, "f")[id].push(...hrmp);
102
+ __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_maybeBuildBlock).call(this);
103
+ }
104
+ async buildBlockWithParams(params) {
105
+ __classPrivateFieldGet(this, _TxPool_pendingBlocks, "f").push({
106
+ params,
107
+ deferred: defer(),
108
+ });
109
+ __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_buildBlockIfNeeded).call(this);
110
+ await this.upcomingBlocks();
111
+ }
112
+ async buildBlock(params) {
113
+ const transactions = params?.transactions || __classPrivateFieldGet(this, _TxPool_pool, "f").splice(0).map(({ extrinsic }) => extrinsic);
114
+ const upwardMessages = params?.upwardMessages || { ...__classPrivateFieldGet(this, _TxPool_ump, "f") };
115
+ const downwardMessages = params?.downwardMessages || __classPrivateFieldGet(this, _TxPool_dmp, "f").splice(0);
116
+ const horizontalMessages = params?.horizontalMessages || { ...__classPrivateFieldGet(this, _TxPool_hrmp, "f") };
117
+ const unsafeBlockHeight = params?.unsafeBlockHeight;
118
+ if (!params?.upwardMessages) {
119
+ for (const id of Object.keys(__classPrivateFieldGet(this, _TxPool_ump, "f"))) {
120
+ delete __classPrivateFieldGet(this, _TxPool_ump, "f")[id];
121
+ }
122
+ }
123
+ if (!params?.horizontalMessages) {
124
+ for (const id of Object.keys(__classPrivateFieldGet(this, _TxPool_hrmp, "f"))) {
125
+ delete __classPrivateFieldGet(this, _TxPool_hrmp, "f")[id];
126
+ }
127
+ }
128
+ await this.buildBlockWithParams({
129
+ transactions,
130
+ upwardMessages,
131
+ downwardMessages,
132
+ horizontalMessages,
133
+ unsafeBlockHeight,
134
+ });
135
+ }
136
+ async upcomingBlocks() {
137
+ const count = __classPrivateFieldGet(this, _TxPool_pendingBlocks, "f").length;
138
+ if (count > 0) {
139
+ await __classPrivateFieldGet(this, _TxPool_pendingBlocks, "f")[count - 1].deferred.promise;
140
+ }
141
+ return count;
142
+ }
143
+ }
144
+ _TxPool_chain = new WeakMap(), _TxPool_pool = new WeakMap(), _TxPool_ump = new WeakMap(), _TxPool_dmp = new WeakMap(), _TxPool_hrmp = new WeakMap(), _TxPool_mode = new WeakMap(), _TxPool_inherentProvider = new WeakMap(), _TxPool_pendingBlocks = new WeakMap(), _TxPool_isBuilding = new WeakMap(), _TxPool_batchBuildBlock = new WeakMap(), _TxPool_instances = new WeakSet(), _TxPool_getSigner = async function _TxPool_getSigner(extrinsic) {
145
+ const registry = await __classPrivateFieldGet(this, _TxPool_chain, "f").head.registry;
146
+ const tx = registry.createType('GenericExtrinsic', extrinsic);
147
+ return tx.signer.toString();
148
+ }, _TxPool_maybeBuildBlock = function _TxPool_maybeBuildBlock() {
149
+ switch (__classPrivateFieldGet(this, _TxPool_mode, "f")) {
150
+ case BuildBlockMode.Batch:
151
+ __classPrivateFieldGet(this, _TxPool_batchBuildBlock, "f").call(this);
152
+ break;
153
+ case BuildBlockMode.Instant:
154
+ this.buildBlock();
155
+ break;
156
+ case BuildBlockMode.Manual:
157
+ // does nothing
158
+ break;
159
+ }
160
+ }, _TxPool_buildBlockIfNeeded = async function _TxPool_buildBlockIfNeeded() {
161
+ if (__classPrivateFieldGet(this, _TxPool_isBuilding, "f"))
162
+ return;
163
+ if (__classPrivateFieldGet(this, _TxPool_pendingBlocks, "f").length === 0)
164
+ return;
165
+ __classPrivateFieldSet(this, _TxPool_isBuilding, true, "f");
166
+ try {
167
+ await __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_buildBlock).call(this);
168
+ }
169
+ finally {
170
+ __classPrivateFieldSet(this, _TxPool_isBuilding, false, "f");
171
+ }
172
+ __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_buildBlockIfNeeded).call(this);
173
+ }, _TxPool_buildBlock = async function _TxPool_buildBlock() {
174
+ await __classPrivateFieldGet(this, _TxPool_chain, "f").api.isReady;
175
+ const pending = __classPrivateFieldGet(this, _TxPool_pendingBlocks, "f")[0];
176
+ if (!pending) {
177
+ throw new Error('Unreachable');
178
+ }
179
+ const { params, deferred } = pending;
180
+ logger.trace({ params }, 'build block');
181
+ const head = __classPrivateFieldGet(this, _TxPool_chain, "f").head;
182
+ const inherents = await __classPrivateFieldGet(this, _TxPool_inherentProvider, "f").createInherents(head, params);
183
+ const [newBlock, pendingExtrinsics] = await buildBlock(head, inherents, params.transactions, params.upwardMessages, {
184
+ onApplyExtrinsicError: (extrinsic, error) => {
185
+ this.event.emit(APPLY_EXTRINSIC_ERROR, [extrinsic, error]);
186
+ },
187
+ onPhaseApplied: logger.level.toLowerCase() === 'trace'
188
+ ? (phase, resp) => {
189
+ switch (phase) {
190
+ case 'initialize':
191
+ logger.trace(truncate(resp.storageDiff), 'Initialize block');
192
+ break;
193
+ case 'finalize':
194
+ logger.trace(truncate(resp.storageDiff), 'Finalize block');
195
+ break;
196
+ default:
197
+ logger.trace(truncate(resp.storageDiff), `Apply extrinsic ${phase}`);
198
+ }
199
+ }
200
+ : undefined,
201
+ }, params.unsafeBlockHeight);
202
+ for (const extrinsic of pendingExtrinsics) {
203
+ __classPrivateFieldGet(this, _TxPool_pool, "f").push({ extrinsic, signer: await __classPrivateFieldGet(this, _TxPool_instances, "m", _TxPool_getSigner).call(this, extrinsic) });
204
+ }
205
+ await __classPrivateFieldGet(this, _TxPool_chain, "f").onNewBlock(newBlock);
206
+ __classPrivateFieldGet(this, _TxPool_pendingBlocks, "f").shift();
207
+ deferred.resolve();
208
+ };