@typeberry/lib 0.5.3 → 0.5.4-b101fe6

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 (205) hide show
  1. package/package.json +8 -4
  2. package/packages/core/hash/hash.d.ts.map +1 -1
  3. package/packages/core/hash/hash.js +1 -0
  4. package/packages/core/networking/certificate.d.ts.map +1 -1
  5. package/packages/core/networking/certificate.js +1 -0
  6. package/packages/core/networking/package.json +1 -1
  7. package/packages/core/networking/setup.d.ts.map +1 -1
  8. package/packages/core/networking/setup.js +16 -12
  9. package/packages/core/numbers/index.d.ts +4 -0
  10. package/packages/core/numbers/index.d.ts.map +1 -1
  11. package/packages/core/numbers/index.js +4 -4
  12. package/packages/core/pvm-host-calls/host-calls-executor.d.ts +23 -17
  13. package/packages/core/pvm-host-calls/host-calls-executor.d.ts.map +1 -1
  14. package/packages/core/pvm-host-calls/host-calls-executor.js +23 -31
  15. package/packages/core/pvm-interpreter/ops/math-consts.d.ts +2 -3
  16. package/packages/core/pvm-interpreter/ops/math-consts.d.ts.map +1 -1
  17. package/packages/core/pvm-interpreter/ops/math-consts.js +2 -3
  18. package/packages/core/pvm-interpreter/ops/math-ops.js +3 -3
  19. package/packages/core/pvm-interpreter/ops/math-utils.js +13 -13
  20. package/packages/core/pvm-interpreter/ops/math-utils.test.js +17 -16
  21. package/packages/core/telemetry/package.json +1 -1
  22. package/packages/core/utils/compatibility.d.ts +0 -1
  23. package/packages/core/utils/compatibility.d.ts.map +1 -1
  24. package/packages/core/utils/compatibility.js +1 -2
  25. package/packages/core/utils/compatibility.test.js +6 -10
  26. package/packages/extensions/ipc/jamnp/handler.d.ts +5 -4
  27. package/packages/extensions/ipc/jamnp/handler.d.ts.map +1 -1
  28. package/packages/extensions/ipc/jamnp/handler.js +59 -34
  29. package/packages/extensions/ipc/jamnp/stream.d.ts +6 -4
  30. package/packages/extensions/ipc/jamnp/stream.d.ts.map +1 -1
  31. package/packages/jam/block/work-item.d.ts +13 -4
  32. package/packages/jam/block/work-item.d.ts.map +1 -1
  33. package/packages/jam/block/work-package.d.ts +3 -1
  34. package/packages/jam/block/work-package.d.ts.map +1 -1
  35. package/packages/jam/block/work-package.js +6 -2
  36. package/packages/jam/block/work-result.d.ts +3 -5
  37. package/packages/jam/block/work-result.d.ts.map +1 -1
  38. package/packages/jam/block/work-result.js +6 -0
  39. package/packages/jam/block-json/block.d.ts +125 -0
  40. package/packages/jam/block-json/block.d.ts.map +1 -1
  41. package/packages/jam/block-json/block.js +9 -2
  42. package/packages/jam/block-json/work-result.d.ts.map +1 -1
  43. package/packages/jam/block-json/work-result.js +6 -6
  44. package/packages/jam/database-lmdb/states.test.js +2 -3
  45. package/packages/jam/executor/index.d.ts +4 -0
  46. package/packages/jam/executor/index.d.ts.map +1 -0
  47. package/packages/jam/executor/index.js +2 -0
  48. package/packages/jam/{transition/accumulate → executor}/pvm-executor.d.ts +19 -16
  49. package/packages/jam/executor/pvm-executor.d.ts.map +1 -0
  50. package/packages/jam/{transition/accumulate → executor}/pvm-executor.js +46 -3
  51. package/packages/jam/fuzz-proto/v1/handler.d.ts +1 -1
  52. package/packages/jam/fuzz-proto/v1/handler.d.ts.map +1 -1
  53. package/packages/jam/fuzz-proto/v1/handler.js +43 -19
  54. package/packages/jam/in-core/externalities/refine.d.ts +24 -0
  55. package/packages/jam/in-core/externalities/refine.d.ts.map +1 -0
  56. package/packages/jam/in-core/externalities/refine.js +36 -0
  57. package/packages/jam/in-core/in-core.d.ts +60 -0
  58. package/packages/jam/in-core/in-core.d.ts.map +1 -0
  59. package/packages/jam/in-core/in-core.js +294 -0
  60. package/packages/jam/in-core/in-core.test.d.ts +2 -0
  61. package/packages/jam/in-core/in-core.test.d.ts.map +1 -0
  62. package/packages/jam/in-core/in-core.test.js +81 -0
  63. package/packages/jam/in-core/index.d.ts +2 -0
  64. package/packages/jam/in-core/index.d.ts.map +1 -0
  65. package/packages/jam/in-core/index.js +1 -0
  66. package/packages/jam/jam-host-calls/accumulate/bless.d.ts.map +1 -1
  67. package/packages/jam/jam-host-calls/accumulate/bless.js +6 -10
  68. package/packages/jam/jam-host-calls/accumulate/bless.test.js +32 -73
  69. package/packages/jam/jam-host-calls/accumulate/new.d.ts.map +1 -1
  70. package/packages/jam/jam-host-calls/accumulate/new.js +2 -4
  71. package/packages/jam/jam-host-calls/accumulate/new.test.js +4 -5
  72. package/packages/jam/jam-host-calls/general/fetch.d.ts +1 -57
  73. package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
  74. package/packages/jam/jam-host-calls/general/fetch.js +6 -29
  75. package/packages/jam/jam-host-calls/general/fetch.test.js +2 -58
  76. package/packages/jam/jamnp-s/peers.d.ts.map +1 -1
  77. package/packages/jam/jamnp-s/peers.js +10 -0
  78. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts +1 -1
  79. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts.map +1 -1
  80. package/packages/jam/jamnp-s/protocol/ce-128-block-request.js +10 -8
  81. package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts.map +1 -1
  82. package/packages/jam/jamnp-s/protocol/ce-129-state-request.js +11 -9
  83. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +3 -3
  84. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
  85. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +2 -2
  86. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +5 -5
  87. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts.map +1 -1
  88. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.js +2 -2
  89. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts.map +1 -1
  90. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.js +8 -6
  91. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts +3 -3
  92. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts.map +1 -1
  93. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.js +2 -2
  94. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.test.js +2 -2
  95. package/packages/jam/jamnp-s/protocol/stream.d.ts +13 -7
  96. package/packages/jam/jamnp-s/protocol/stream.d.ts.map +1 -1
  97. package/packages/jam/jamnp-s/protocol/stream.js +5 -4
  98. package/packages/jam/jamnp-s/protocol/test-utils.d.ts +1 -1
  99. package/packages/jam/jamnp-s/protocol/test-utils.d.ts.map +1 -1
  100. package/packages/jam/jamnp-s/protocol/test-utils.js +9 -12
  101. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts +1 -1
  102. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts.map +1 -1
  103. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.js +1 -1
  104. package/packages/jam/jamnp-s/stream-manager.d.ts.map +1 -1
  105. package/packages/jam/jamnp-s/stream-manager.js +7 -5
  106. package/packages/jam/jamnp-s/stream-manager.test.js +8 -5
  107. package/packages/jam/jamnp-s/tasks/sync.js +1 -1
  108. package/packages/jam/node/jam-config.d.ts +4 -1
  109. package/packages/jam/node/jam-config.d.ts.map +1 -1
  110. package/packages/jam/node/jam-config.js +6 -2
  111. package/packages/jam/node/main.d.ts.map +1 -1
  112. package/packages/jam/node/main.js +5 -4
  113. package/packages/jam/node/package.json +1 -1
  114. package/packages/jam/rpc-validation/types.d.ts +7 -3
  115. package/packages/jam/rpc-validation/types.d.ts.map +1 -1
  116. package/packages/jam/rpc-validation/validation.d.ts +254 -36
  117. package/packages/jam/rpc-validation/validation.d.ts.map +1 -1
  118. package/packages/jam/rpc-validation/validation.js +20 -2
  119. package/packages/jam/state/in-memory-state.d.ts.map +1 -1
  120. package/packages/jam/state/in-memory-state.js +2 -3
  121. package/packages/jam/state/privileged-services.d.ts +1 -1
  122. package/packages/jam/state/privileged-services.d.ts.map +1 -1
  123. package/packages/jam/state/privileged-services.js +1 -6
  124. package/packages/jam/state/service.d.ts +1 -1
  125. package/packages/jam/state/service.d.ts.map +1 -1
  126. package/packages/jam/state/statistics.d.ts +0 -8
  127. package/packages/jam/state/statistics.d.ts.map +1 -1
  128. package/packages/jam/state/statistics.js +14 -44
  129. package/packages/jam/state/statistics.test.js +1 -8
  130. package/packages/jam/state/test.utils.d.ts +1 -1
  131. package/packages/jam/state/test.utils.d.ts.map +1 -1
  132. package/packages/jam/state/test.utils.js +6 -25
  133. package/packages/jam/state-json/accounts.d.ts +10 -0
  134. package/packages/jam/state-json/accounts.d.ts.map +1 -1
  135. package/packages/jam/state-json/accounts.js +47 -19
  136. package/packages/jam/state-json/dump.d.ts.map +1 -1
  137. package/packages/jam/state-json/dump.js +5 -9
  138. package/packages/jam/state-json/dump.test.js +2 -10
  139. package/packages/jam/state-json/statistics.d.ts +1 -1
  140. package/packages/jam/state-json/statistics.d.ts.map +1 -1
  141. package/packages/jam/state-json/statistics.js +1 -13
  142. package/packages/jam/state-merkleization/in-memory-state-codec.d.ts +0 -2
  143. package/packages/jam/state-merkleization/in-memory-state-codec.d.ts.map +1 -1
  144. package/packages/jam/state-merkleization/serialize.d.ts +4 -4
  145. package/packages/jam/state-merkleization/serialize.d.ts.map +1 -1
  146. package/packages/jam/state-merkleization/serialize.js +5 -8
  147. package/packages/jam/state-merkleization/serialized-state-view.d.ts.map +1 -1
  148. package/packages/jam/state-merkleization/state-entries.test.js +1 -7
  149. package/packages/jam/state-vectors/index.d.ts +377 -5
  150. package/packages/jam/state-vectors/index.d.ts.map +1 -1
  151. package/packages/jam/state-vectors/index.js +3 -3
  152. package/packages/jam/transition/accumulate/accumulate-data.d.ts.map +1 -1
  153. package/packages/jam/transition/accumulate/accumulate-data.js +1 -2
  154. package/packages/jam/transition/accumulate/accumulate-queue.test.js +2 -2
  155. package/packages/jam/transition/accumulate/accumulate-state.d.ts +1 -2
  156. package/packages/jam/transition/accumulate/accumulate-state.d.ts.map +1 -1
  157. package/packages/jam/transition/accumulate/accumulate-utils.d.ts.map +1 -1
  158. package/packages/jam/transition/accumulate/accumulate-utils.js +2 -6
  159. package/packages/jam/transition/accumulate/accumulate-utils.test.js +4 -6
  160. package/packages/jam/transition/accumulate/accumulate.d.ts.map +1 -1
  161. package/packages/jam/transition/accumulate/accumulate.js +19 -33
  162. package/packages/jam/transition/accumulate/accumulate.test.js +2 -2
  163. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.d.ts.map +1 -1
  164. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +1 -2
  165. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.test.js +1 -2
  166. package/packages/jam/transition/accumulate/index.d.ts +0 -1
  167. package/packages/jam/transition/accumulate/index.d.ts.map +1 -1
  168. package/packages/jam/transition/accumulate/index.js +0 -1
  169. package/packages/jam/transition/chain-stf.d.ts +3 -5
  170. package/packages/jam/transition/chain-stf.d.ts.map +1 -1
  171. package/packages/jam/transition/chain-stf.js +5 -29
  172. package/packages/jam/transition/disputes/disputes.test.data2.js +2 -2
  173. package/packages/jam/transition/externalities/accumulate-externalities.d.ts.map +1 -1
  174. package/packages/jam/transition/externalities/accumulate-externalities.js +22 -49
  175. package/packages/jam/transition/externalities/accumulate-externalities.test.js +8 -72
  176. package/packages/jam/transition/externalities/fetch-externalities.d.ts +8 -21
  177. package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
  178. package/packages/jam/transition/externalities/fetch-externalities.js +5 -53
  179. package/packages/jam/transition/externalities/fetch-externalities.test.js +201 -114
  180. package/packages/jam/transition/hasher.test.js +2 -2
  181. package/packages/jam/transition/reports/error.d.ts +3 -1
  182. package/packages/jam/transition/reports/error.d.ts.map +1 -1
  183. package/packages/jam/transition/reports/error.js +2 -0
  184. package/packages/jam/transition/reports/test.utils.d.ts.map +1 -1
  185. package/packages/jam/transition/reports/test.utils.js +2 -2
  186. package/packages/jam/transition/reports/verify-basic.d.ts.map +1 -1
  187. package/packages/jam/transition/reports/verify-basic.js +10 -0
  188. package/packages/jam/transition/reports/verify-basic.test.js +29 -0
  189. package/packages/jam/transition/statistics.d.ts +0 -7
  190. package/packages/jam/transition/statistics.d.ts.map +1 -1
  191. package/packages/jam/transition/statistics.js +2 -11
  192. package/packages/jam/transition/statistics.test.js +0 -40
  193. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  194. package/packages/workers/block-authorship/main.js +23 -4
  195. package/packages/workers/block-authorship/package.json +1 -1
  196. package/packages/workers/block-authorship/protocol.d.ts +3 -1
  197. package/packages/workers/block-authorship/protocol.d.ts.map +1 -1
  198. package/packages/workers/block-authorship/protocol.js +6 -3
  199. package/packages/workers/importer/importer.d.ts.map +1 -1
  200. package/packages/workers/importer/importer.js +0 -1
  201. package/packages/workers/importer/package.json +1 -1
  202. package/packages/jam/transition/accumulate/deferred-transfers.d.ts +0 -36
  203. package/packages/jam/transition/accumulate/deferred-transfers.d.ts.map +0 -1
  204. package/packages/jam/transition/accumulate/deferred-transfers.js +0 -95
  205. package/packages/jam/transition/accumulate/pvm-executor.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import assert from "node:assert";
2
2
  import { describe, it } from "node:test";
3
3
  import { tryAsServiceGas, tryAsServiceId } from "#@typeberry/block";
4
- import { WorkExecResult, WorkExecResultKind } from "#@typeberry/block/work-result.js";
4
+ import { WorkExecResult } from "#@typeberry/block/work-result.js";
5
5
  import { Bytes, BytesBlob } from "#@typeberry/bytes";
6
6
  import { codec, Encoder } from "#@typeberry/codec";
7
7
  import { fullChainSpec, tinyChainSpec } from "#@typeberry/config";
@@ -10,7 +10,7 @@ import { TRANSFER_MEMO_BYTES } from "#@typeberry/jam-host-calls/externalities/pa
10
10
  import { PendingTransfer } from "#@typeberry/jam-host-calls/externalities/pending-transfer.js";
11
11
  import { tryAsU64 } from "#@typeberry/numbers";
12
12
  import { Operand } from "../accumulate/operand.js";
13
- import { FetchExternalities } from "./fetch-externalities.js";
13
+ import { FetchExternalities, TRANSFER_OR_OPERAND, TransferOperandKind, } from "./fetch-externalities.js";
14
14
  describe("fetch-externalities", () => {
15
15
  const prepareOperands = (length) => {
16
16
  const operands = [];
@@ -21,7 +21,7 @@ describe("fetch-externalities", () => {
21
21
  exportsRoot: Bytes.fill(HASH_SIZE, i + 2).asOpaque(),
22
22
  hash: Bytes.fill(HASH_SIZE, i + 4).asOpaque(),
23
23
  payloadHash: Bytes.fill(HASH_SIZE, i + 5).asOpaque(),
24
- result: new WorkExecResult(WorkExecResultKind.ok, BytesBlob.empty()),
24
+ result: WorkExecResult.ok(BytesBlob.empty()),
25
25
  gas: tryAsServiceGas(1_000),
26
26
  }));
27
27
  }
@@ -40,17 +40,30 @@ describe("fetch-externalities", () => {
40
40
  }
41
41
  return transfers;
42
42
  };
43
- const prepareLegacyAccumulateData = ({ chainSpec, operands, entropy, }) => {
44
- const defaultChainSpec = tinyChainSpec;
45
- const defaultEntropy = Bytes.zero(HASH_SIZE).asOpaque();
46
- const defaultOperands = [];
47
- const fetchData = {
48
- entropy: entropy ?? defaultEntropy,
49
- operands: operands ?? defaultOperands,
50
- };
51
- return FetchExternalities.createForPre071Accumulate(fetchData, chainSpec ?? defaultChainSpec);
43
+ // allTransfersAndOperands: transfers first, then operands
44
+ const toAllTransfersAndOperands = (operands, transfers) => {
45
+ return [
46
+ ...transfers.map((t) => ({ kind: TransferOperandKind.TRANSFER, value: t })),
47
+ ...operands.map((o) => ({ kind: TransferOperandKind.OPERAND, value: o })),
48
+ ];
49
+ };
50
+ // oneTransferOrOperand: operands first (index < operands.length), then transfers
51
+ const toOneTransferOrOperandAt = (operands, transfers, index) => {
52
+ if (index >= operands.length + transfers.length) {
53
+ return null;
54
+ }
55
+ if (index < operands.length) {
56
+ return { kind: TransferOperandKind.OPERAND, value: operands[index] };
57
+ }
58
+ return { kind: TransferOperandKind.TRANSFER, value: transfers[index - operands.length] };
59
+ };
60
+ const encodeOneTransferOrOperand = (item, chainSpec) => {
61
+ if (item === null) {
62
+ return null;
63
+ }
64
+ return Encoder.encodeObject(TRANSFER_OR_OPERAND, item, chainSpec);
52
65
  };
53
- const prepareOnTransferData = ({ chainSpec, operands, entropy, transfers, }) => {
66
+ const prepareAccumulateData = ({ chainSpec, operands, entropy, transfers, }) => {
54
67
  const defaultChainSpec = tinyChainSpec;
55
68
  const defaultEntropy = Bytes.zero(HASH_SIZE).asOpaque();
56
69
  const defaultOperands = [];
@@ -60,108 +73,182 @@ describe("fetch-externalities", () => {
60
73
  operands: operands ?? defaultOperands,
61
74
  transfers: transfers ?? defaultTransfers,
62
75
  };
63
- return FetchExternalities.createForOnTransfer(fetchData, chainSpec ?? defaultChainSpec);
76
+ return FetchExternalities.createForAccumulate(fetchData, chainSpec ?? defaultChainSpec);
64
77
  };
65
- it("should return different constants for different chain specs (Accumulate)", () => {
66
- const tinyFetchExternalities = prepareLegacyAccumulateData({ chainSpec: tinyChainSpec });
67
- const fullFetchExternalities = prepareLegacyAccumulateData({ chainSpec: fullChainSpec });
68
- const tinyContants = tinyFetchExternalities.constants();
69
- const fullContants = fullFetchExternalities.constants();
70
- assert.notStrictEqual(tinyContants.length, 0);
71
- assert.notStrictEqual(fullContants.length, 0);
72
- assert.notDeepStrictEqual(tinyContants, fullContants);
73
- });
74
- it("should return different constants for different chain specs (OnTransfer)", () => {
75
- const tinyFetchExternalities = prepareOnTransferData({ chainSpec: tinyChainSpec });
76
- const fullFetchExternalities = prepareOnTransferData({ chainSpec: fullChainSpec });
77
- const tinyContants = tinyFetchExternalities.constants();
78
- const fullContants = fullFetchExternalities.constants();
79
- assert.notStrictEqual(tinyContants.length, 0);
80
- assert.notStrictEqual(fullContants.length, 0);
81
- assert.notDeepStrictEqual(tinyContants, fullContants);
82
- });
83
- it("should return entropy hash (Accumulate)", () => {
84
- const expectedEntropy = Bytes.fill(HASH_SIZE, 5).asOpaque();
85
- const fetchExternalities = prepareLegacyAccumulateData({ entropy: expectedEntropy });
86
- const entropy = fetchExternalities.entropy();
87
- assert.deepStrictEqual(entropy, expectedEntropy);
88
- });
89
- it("should return entropy hash (OnTransfer)", () => {
90
- const expectedEntropy = Bytes.fill(HASH_SIZE, 5).asOpaque();
91
- const fetchExternalities = prepareOnTransferData({ entropy: expectedEntropy });
92
- const entropy = fetchExternalities.entropy();
93
- assert.deepStrictEqual(entropy, expectedEntropy);
94
- });
95
- it("should return all operands", () => {
96
- const expectedOperands = prepareOperands(5);
97
- const chainSpec = tinyChainSpec;
98
- const encodedOperands = Encoder.encodeObject(codec.sequenceVarLen(Operand.Codec), expectedOperands, chainSpec);
99
- const fetchExternalities = prepareLegacyAccumulateData({ operands: expectedOperands, chainSpec });
100
- const operands = fetchExternalities.allOperands();
101
- assert.deepStrictEqual(operands, encodedOperands);
102
- });
103
- it("should null when operand index is not U32", () => {
104
- const operands = prepareOperands(5);
105
- const chainSpec = tinyChainSpec;
106
- const expectedOperandIndex = 2 ** 32 + 3;
107
- const expectedOperand = null;
108
- const fetchExternalities = prepareLegacyAccumulateData({ operands, chainSpec });
109
- const operand = fetchExternalities.oneOperand(tryAsU64(expectedOperandIndex));
110
- assert.deepStrictEqual(operand, expectedOperand);
111
- });
112
- it("should null when operand index is U32 but is incorrect", () => {
113
- const operands = prepareOperands(5);
114
- const chainSpec = tinyChainSpec;
115
- const expectedOperandIndex = 153;
116
- const expectedOperand = null;
117
- const fetchExternalities = prepareLegacyAccumulateData({ operands, chainSpec });
118
- const operand = fetchExternalities.oneOperand(tryAsU64(expectedOperandIndex));
119
- assert.deepStrictEqual(operand, expectedOperand);
120
- });
121
- it("should return one operand", () => {
122
- const operands = prepareOperands(5);
123
- const chainSpec = tinyChainSpec;
124
- const expectedOperandIndex = 3;
125
- const expectedOperand = operands[expectedOperandIndex];
126
- const encodedOperand = Encoder.encodeObject(Operand.Codec, expectedOperand, chainSpec);
127
- const fetchExternalities = prepareLegacyAccumulateData({ operands, chainSpec });
128
- const operand = fetchExternalities.oneOperand(tryAsU64(expectedOperandIndex));
129
- assert.deepStrictEqual(operand, encodedOperand);
130
- });
131
- it("should return all transfers", () => {
132
- const transfersToEncode = prepareTransfers(5);
133
- const chainSpec = tinyChainSpec;
134
- const encodedTransfers = Encoder.encodeObject(codec.sequenceVarLen(PendingTransfer.Codec), transfersToEncode, chainSpec);
135
- const fetchExternalities = prepareOnTransferData({ transfers: transfersToEncode, chainSpec });
136
- const transfers = fetchExternalities.allTransfers();
137
- assert.deepStrictEqual(transfers, encodedTransfers);
138
- });
139
- it("should null when transfer index is not U32", () => {
140
- const transfers = prepareTransfers(5);
141
- const chainSpec = tinyChainSpec;
142
- const expectedTransferIndex = tryAsU64(2 ** 32 + 3);
143
- const expectedTransfer = null;
144
- const fetchExternalities = prepareOnTransferData({ transfers, chainSpec });
145
- const transfer = fetchExternalities.oneTransfer(expectedTransferIndex);
146
- assert.deepStrictEqual(transfer, expectedTransfer);
147
- });
148
- it("should null when transfer index is U32 but is incorrect", () => {
149
- const transfers = prepareTransfers(5);
150
- const chainSpec = tinyChainSpec;
151
- const expectedTransferIndex = tryAsU64(153);
152
- const expectedTransfer = null;
153
- const fetchExternalities = prepareOnTransferData({ transfers, chainSpec });
154
- const transfer = fetchExternalities.oneTransfer(expectedTransferIndex);
155
- assert.deepStrictEqual(transfer, expectedTransfer);
78
+ const prepareRefineData = ({ chainSpec } = {}) => {
79
+ const defaultChainSpec = tinyChainSpec;
80
+ return FetchExternalities.createForRefine({ entropy: undefined }, chainSpec ?? defaultChainSpec);
81
+ };
82
+ describe("Accumulate", () => {
83
+ it("should return different constants for different chain specs", () => {
84
+ const tinyFetchExternalities = prepareAccumulateData({ chainSpec: tinyChainSpec });
85
+ const fullFetchExternalities = prepareAccumulateData({ chainSpec: fullChainSpec });
86
+ const tinyConstants = tinyFetchExternalities.constants();
87
+ const fullConstants = fullFetchExternalities.constants();
88
+ assert.notStrictEqual(tinyConstants.length, 0);
89
+ assert.notStrictEqual(fullConstants.length, 0);
90
+ assert.notDeepStrictEqual(tinyConstants, fullConstants);
91
+ });
92
+ it("should return entropy hash", () => {
93
+ const expectedEntropy = Bytes.fill(HASH_SIZE, 5).asOpaque();
94
+ const fetchExternalities = prepareAccumulateData({ entropy: expectedEntropy });
95
+ const entropy = fetchExternalities.entropy();
96
+ assert.deepStrictEqual(entropy, expectedEntropy);
97
+ });
98
+ it("should return all transfers and operands", () => {
99
+ const operands = prepareOperands(3);
100
+ const transfers = prepareTransfers(2);
101
+ const chainSpec = tinyChainSpec;
102
+ const expected = toAllTransfersAndOperands(operands, transfers);
103
+ const encodedExpected = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), expected, chainSpec);
104
+ const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
105
+ const result = fetchExternalities.allTransfersAndOperands();
106
+ assert.deepStrictEqual(result, encodedExpected);
107
+ });
108
+ it("should return empty encoded sequence when no transfers and no operands", () => {
109
+ const chainSpec = tinyChainSpec;
110
+ const encodedExpected = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), [], chainSpec);
111
+ const fetchExternalities = prepareAccumulateData({ operands: [], transfers: [], chainSpec });
112
+ const result = fetchExternalities.allTransfersAndOperands();
113
+ assert.deepStrictEqual(result, encodedExpected);
114
+ });
115
+ it("should return one operand by index", () => {
116
+ const operands = prepareOperands(3);
117
+ const transfers = prepareTransfers(2);
118
+ const chainSpec = tinyChainSpec;
119
+ const encodedExpected = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, 0), chainSpec);
120
+ const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
121
+ // Operands come first (indices 0..2), then transfers (indices 3..4)
122
+ const result = fetchExternalities.oneTransferOrOperand(tryAsU64(0));
123
+ assert.deepStrictEqual(result, encodedExpected);
124
+ });
125
+ it("should return one transfer by index", () => {
126
+ const operands = prepareOperands(3);
127
+ const transfers = prepareTransfers(2);
128
+ const chainSpec = tinyChainSpec;
129
+ const encodedExpected = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, 3), chainSpec);
130
+ const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
131
+ // Transfers start after operands, so index 3 is the first transfer
132
+ const result = fetchExternalities.oneTransferOrOperand(tryAsU64(3));
133
+ assert.deepStrictEqual(result, encodedExpected);
134
+ });
135
+ it("should return null when index is out of bounds", () => {
136
+ const operands = prepareOperands(3);
137
+ const transfers = prepareTransfers(2);
138
+ const chainSpec = tinyChainSpec;
139
+ const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
140
+ // Total items: 3 operands + 2 transfers = 5, so index 5 is out of bounds
141
+ const result = fetchExternalities.oneTransferOrOperand(tryAsU64(5));
142
+ assert.strictEqual(result, null);
143
+ });
144
+ it("should return null when index is far out of bounds", () => {
145
+ const operands = prepareOperands(3);
146
+ const transfers = prepareTransfers(2);
147
+ const chainSpec = tinyChainSpec;
148
+ const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
149
+ const result = fetchExternalities.oneTransferOrOperand(tryAsU64(153));
150
+ assert.strictEqual(result, null);
151
+ });
152
+ it("should have consistent encoding between all and one", () => {
153
+ const operands = prepareOperands(2);
154
+ const transfers = prepareTransfers(2);
155
+ const chainSpec = tinyChainSpec;
156
+ const allItems = toAllTransfersAndOperands(operands, transfers);
157
+ const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
158
+ const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
159
+ const all = fetchExternalities.allTransfersAndOperands();
160
+ assert.deepStrictEqual(all, encodedAll);
161
+ for (let i = 0; i < operands.length + transfers.length; i++) {
162
+ const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
163
+ const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, i), chainSpec);
164
+ assert.deepStrictEqual(one, encodedOne, `Mismatch at index ${i}`);
165
+ }
166
+ const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(operands.length + transfers.length));
167
+ assert.strictEqual(outOfRange, null);
168
+ });
169
+ it("should handle only operands without transfers", () => {
170
+ const operands = prepareOperands(5);
171
+ const chainSpec = tinyChainSpec;
172
+ const allItems = toAllTransfersAndOperands(operands, []);
173
+ const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
174
+ const fetchExternalities = prepareAccumulateData({ operands, transfers: [], chainSpec });
175
+ const result = fetchExternalities.allTransfersAndOperands();
176
+ assert.deepStrictEqual(result, encodedAll);
177
+ for (let i = 0; i < operands.length; i++) {
178
+ const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
179
+ const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, [], i), chainSpec);
180
+ assert.deepStrictEqual(one, encodedOne, `Mismatch at operand index ${i}`);
181
+ }
182
+ const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(operands.length));
183
+ assert.strictEqual(outOfRange, null);
184
+ });
185
+ it("should handle only transfers without operands", () => {
186
+ const transfers = prepareTransfers(5);
187
+ const chainSpec = tinyChainSpec;
188
+ const allItems = toAllTransfersAndOperands([], transfers);
189
+ const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
190
+ const fetchExternalities = prepareAccumulateData({ operands: [], transfers, chainSpec });
191
+ const result = fetchExternalities.allTransfersAndOperands();
192
+ assert.deepStrictEqual(result, encodedAll);
193
+ for (let i = 0; i < transfers.length; i++) {
194
+ const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
195
+ const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt([], transfers, i), chainSpec);
196
+ assert.deepStrictEqual(one, encodedOne, `Mismatch at transfer index ${i}`);
197
+ }
198
+ const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(transfers.length));
199
+ assert.strictEqual(outOfRange, null);
200
+ });
201
+ it("should return null for unimplemented methods", () => {
202
+ const fetchExternalities = prepareAccumulateData({});
203
+ assert.strictEqual(fetchExternalities.authorizerTrace(), null);
204
+ assert.strictEqual(fetchExternalities.workItemExtrinsic(null, tryAsU64(0)), null);
205
+ assert.strictEqual(fetchExternalities.workItemImport(null, tryAsU64(0)), null);
206
+ assert.strictEqual(fetchExternalities.workPackage(), null);
207
+ assert.strictEqual(fetchExternalities.authorizer(), null);
208
+ assert.strictEqual(fetchExternalities.authorizationToken(), null);
209
+ assert.strictEqual(fetchExternalities.refineContext(), null);
210
+ assert.strictEqual(fetchExternalities.allWorkItems(), null);
211
+ assert.strictEqual(fetchExternalities.oneWorkItem(tryAsU64(0)), null);
212
+ assert.strictEqual(fetchExternalities.workItemPayload(tryAsU64(0)), null);
213
+ });
156
214
  });
157
- it("should return one transfer", () => {
158
- const transfers = prepareTransfers(5);
159
- const chainSpec = tinyChainSpec;
160
- const expectedOperandIndex = 3;
161
- const expectedTransfer = transfers[expectedOperandIndex];
162
- const encodedTransfer = Encoder.encodeObject(PendingTransfer.Codec, expectedTransfer, chainSpec);
163
- const fetchExternalities = prepareOnTransferData({ transfers, chainSpec });
164
- const transfer = fetchExternalities.oneTransfer(tryAsU64(expectedOperandIndex));
165
- assert.deepStrictEqual(transfer, encodedTransfer);
215
+ describe("Refine", () => {
216
+ it("should return different constants for different chain specs", () => {
217
+ const tinyFetchExternalities = prepareRefineData({ chainSpec: tinyChainSpec });
218
+ const fullFetchExternalities = prepareRefineData({ chainSpec: fullChainSpec });
219
+ const tinyConstants = tinyFetchExternalities.constants();
220
+ const fullConstants = fullFetchExternalities.constants();
221
+ assert.notStrictEqual(tinyConstants.length, 0);
222
+ assert.notStrictEqual(fullConstants.length, 0);
223
+ assert.notDeepStrictEqual(tinyConstants, fullConstants);
224
+ });
225
+ it("should return null entropy", () => {
226
+ const fetchExternalities = prepareRefineData();
227
+ const entropy = fetchExternalities.entropy();
228
+ assert.strictEqual(entropy, null);
229
+ });
230
+ it("should return null for allTransfersAndOperands", () => {
231
+ const fetchExternalities = prepareRefineData();
232
+ const result = fetchExternalities.allTransfersAndOperands();
233
+ assert.strictEqual(result, null);
234
+ });
235
+ it("should return null for oneTransferOrOperand", () => {
236
+ const fetchExternalities = prepareRefineData();
237
+ const result = fetchExternalities.oneTransferOrOperand(tryAsU64(0));
238
+ assert.strictEqual(result, null);
239
+ });
240
+ it("should return null for unimplemented methods", () => {
241
+ const fetchExternalities = prepareRefineData();
242
+ assert.strictEqual(fetchExternalities.authorizerTrace(), null);
243
+ assert.strictEqual(fetchExternalities.workItemExtrinsic(null, tryAsU64(0)), null);
244
+ assert.strictEqual(fetchExternalities.workItemImport(null, tryAsU64(0)), null);
245
+ assert.strictEqual(fetchExternalities.workPackage(), null);
246
+ assert.strictEqual(fetchExternalities.authorizer(), null);
247
+ assert.strictEqual(fetchExternalities.authorizationToken(), null);
248
+ assert.strictEqual(fetchExternalities.refineContext(), null);
249
+ assert.strictEqual(fetchExternalities.allWorkItems(), null);
250
+ assert.strictEqual(fetchExternalities.oneWorkItem(tryAsU64(0)), null);
251
+ assert.strictEqual(fetchExternalities.workItemPayload(tryAsU64(0)), null);
252
+ });
166
253
  });
167
254
  });
@@ -4,7 +4,7 @@ import { Credential, ReportGuarantee } from "#@typeberry/block/guarantees.js";
4
4
  import { RefineContext, WorkPackageInfo } from "#@typeberry/block/refine-context.js";
5
5
  import { SignedTicket, tryAsTicketAttempt } from "#@typeberry/block/tickets.js";
6
6
  import { WorkPackageSpec, WorkReport } from "#@typeberry/block/work-report.js";
7
- import { WorkExecResult, WorkExecResultKind, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
7
+ import { WorkExecResult, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
8
8
  import { Bytes, BytesBlob } from "#@typeberry/bytes";
9
9
  import { Decoder, Encoder } from "#@typeberry/codec";
10
10
  import { asKnownSize } from "#@typeberry/collections";
@@ -77,7 +77,7 @@ describe("TransitionHasher", () => {
77
77
  importedSegments: tryAsU32(result.refine_load.imports),
78
78
  }),
79
79
  payloadHash: Bytes.parseBytes(result.payload_hash, HASH_SIZE).asOpaque(),
80
- result: new WorkExecResult(WorkExecResultKind.ok, BytesBlob.parseBlob(result.result.ok)),
80
+ result: WorkExecResult.ok(BytesBlob.parseBlob(result.result.ok)),
81
81
  serviceId: tryAsServiceId(result.service_id),
82
82
  }))),
83
83
  segmentRootLookup: report.segment_root_lookup.map((l) => WorkPackageInfo.create(l)),
@@ -47,6 +47,8 @@ export declare enum ReportsError {
47
47
  /** Size of authorizer output and all work-item successful output blobs is too big. */
48
48
  WorkReportTooBig = 22,
49
49
  /** Contains guarantee from validator that is proven to be an offender. */
50
- BannedValidator = 23
50
+ BannedValidator = 23,
51
+ /** Number of work items/results is invalid. */
52
+ InvalidWorkItemsCount = 24
51
53
  }
52
54
  //# sourceMappingURL=error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/error.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,oBAAY,YAAY;IACtB,gEAAgE;IAChE,YAAY,IAAI;IAChB,8DAA8D;IAC9D,gBAAgB,IAAI;IACpB,0CAA0C;IAC1C,qBAAqB,IAAI;IACzB,gDAAgD;IAChD,sBAAsB,IAAI;IAC1B,oDAAoD;IACpD,mBAAmB,IAAI;IACvB,0DAA0D;IAC1D,2BAA2B,IAAI;IAC/B,gEAAgE;IAChE,eAAe,IAAI;IACnB,mEAAmE;IACnE,WAAW,IAAI;IACf,kDAAkD;IAClD,eAAe,IAAI;IACnB,yBAAyB;IACzB,YAAY,IAAI;IAChB,wDAAwD;IACxD,WAAW,KAAK;IAChB,yFAAyF;IACzF,iBAAiB,KAAK;IACtB,gEAAgE;IAChE,gBAAgB,KAAK;IACrB,wFAAwF;IACxF,YAAY,KAAK;IACjB,qCAAqC;IACrC,eAAe,KAAK;IACpB,qEAAqE;IACrE,gBAAgB,KAAK;IACrB,gEAAgE;IAChE,iBAAiB,KAAK;IACtB,4CAA4C;IAC5C,oBAAoB,KAAK;IACzB,oFAAoF;IACpF,oBAAoB,KAAK;IACzB,wFAAwF;IACxF,mBAAmB,KAAK;IACxB,2FAA2F;IAC3F,wBAAwB,KAAK;IAC7B,2CAA2C;IAC3C,YAAY,KAAK;IACjB,sFAAsF;IACtF,gBAAgB,KAAK;IACrB,0EAA0E;IAC1E,eAAe,KAAK;CACrB"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/error.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,oBAAY,YAAY;IACtB,gEAAgE;IAChE,YAAY,IAAI;IAChB,8DAA8D;IAC9D,gBAAgB,IAAI;IACpB,0CAA0C;IAC1C,qBAAqB,IAAI;IACzB,gDAAgD;IAChD,sBAAsB,IAAI;IAC1B,oDAAoD;IACpD,mBAAmB,IAAI;IACvB,0DAA0D;IAC1D,2BAA2B,IAAI;IAC/B,gEAAgE;IAChE,eAAe,IAAI;IACnB,mEAAmE;IACnE,WAAW,IAAI;IACf,kDAAkD;IAClD,eAAe,IAAI;IACnB,yBAAyB;IACzB,YAAY,IAAI;IAChB,wDAAwD;IACxD,WAAW,KAAK;IAChB,yFAAyF;IACzF,iBAAiB,KAAK;IACtB,gEAAgE;IAChE,gBAAgB,KAAK;IACrB,wFAAwF;IACxF,YAAY,KAAK;IACjB,qCAAqC;IACrC,eAAe,KAAK;IACpB,qEAAqE;IACrE,gBAAgB,KAAK;IACrB,gEAAgE;IAChE,iBAAiB,KAAK;IACtB,4CAA4C;IAC5C,oBAAoB,KAAK;IACzB,oFAAoF;IACpF,oBAAoB,KAAK;IACzB,wFAAwF;IACxF,mBAAmB,KAAK;IACxB,2FAA2F;IAC3F,wBAAwB,KAAK;IAC7B,2CAA2C;IAC3C,YAAY,KAAK;IACjB,sFAAsF;IACtF,gBAAgB,KAAK;IACrB,0EAA0E;IAC1E,eAAe,KAAK;IACpB,+CAA+C;IAC/C,qBAAqB,KAAK;CAC3B"}
@@ -49,4 +49,6 @@ export var ReportsError;
49
49
  ReportsError[ReportsError["WorkReportTooBig"] = 22] = "WorkReportTooBig";
50
50
  /** Contains guarantee from validator that is proven to be an offender. */
51
51
  ReportsError[ReportsError["BannedValidator"] = 23] = "BannedValidator";
52
+ /** Number of work items/results is invalid. */
53
+ ReportsError[ReportsError["InvalidWorkItemsCount"] = 24] = "InvalidWorkItemsCount";
52
54
  })(ReportsError || (ReportsError = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"test.utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/test.utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.utils.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/test.utils.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { Credential, GuaranteesExtrinsicBounds, guaranteesExtrinsicCodec, Report
4
4
  import { RefineContext } from "#@typeberry/block/refine-context.js";
5
5
  import { testWorkReportHex } from "#@typeberry/block/test-helpers.js";
6
6
  import { WorkReport } from "#@typeberry/block/work-report.js";
7
- import { WorkExecResult, WorkExecResultKind, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
7
+ import { WorkExecResult, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
8
8
  import { Bytes, BytesBlob } from "#@typeberry/bytes";
9
9
  import { codec, Decoder } from "#@typeberry/codec";
10
10
  import { asKnownSize, FixedSizeArray, HashDictionary } from "#@typeberry/collections";
@@ -41,7 +41,7 @@ export function newWorkReport({ core, authorizer, anchorBlock, stateRoot, beefyR
41
41
  codeHash: x.codeHash,
42
42
  payloadHash: x.payloadHash,
43
43
  gas: x.gas,
44
- result: resultSize !== undefined ? new WorkExecResult(WorkExecResultKind.ok, Bytes.fill(resultSize, 0)) : x.result,
44
+ result: resultSize !== undefined ? WorkExecResult.ok(Bytes.fill(resultSize, 0)) : x.result,
45
45
  load: WorkRefineLoad.create({
46
46
  gasUsed: tryAsServiceGas(5),
47
47
  importedSegments: tryAsU32(0),
@@ -1 +1 @@
1
- {"version":3,"file":"verify-basic.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/verify-basic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAe,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAkD3F"}
1
+ {"version":3,"file":"verify-basic.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/reports/verify-basic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAG9E,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAe,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CA8D3F"}
@@ -1,4 +1,5 @@
1
1
  import { MAX_REPORT_DEPENDENCIES } from "#@typeberry/block/gp-constants.js";
2
+ import { isWorkItemsCount, MAX_NUMBER_OF_WORK_ITEMS, MIN_NUMBER_OF_WORK_ITEMS } from "#@typeberry/block/work-package.js";
2
3
  import { WorkExecResultKind } from "#@typeberry/block/work-result.js";
3
4
  import { OK, Result } from "#@typeberry/utils";
4
5
  import { ReportsError } from "./error.js";
@@ -11,6 +12,15 @@ export const MAX_WORK_REPORT_SIZE_BYTES = 48 * 2 ** 10;
11
12
  export function verifyReportsBasic(input) {
12
13
  for (const guarantee of input) {
13
14
  const reportView = guarantee.view().report.view();
15
+ /**
16
+ * Make sure number of results is within correct range.
17
+ */
18
+ if (!isWorkItemsCount(reportView.results.view().length)) {
19
+ return Result.error(ReportsError.InvalidWorkItemsCount, () => `Number of work results is invalid.
20
+ Got: ${reportView.results.view().length},
21
+ expected between ${MIN_NUMBER_OF_WORK_ITEMS} and ${MAX_NUMBER_OF_WORK_ITEMS}
22
+ `);
23
+ }
14
24
  /**
15
25
  * We limit the sum of the number of items in the
16
26
  * segment-root lookup dictionary and the number of
@@ -2,8 +2,10 @@ import { describe, it } from "node:test";
2
2
  import { tryAsTimeSlot } from "#@typeberry/block";
3
3
  import { ReportGuarantee } from "#@typeberry/block/guarantees.js";
4
4
  import { Bytes } from "#@typeberry/bytes";
5
+ import { FixedSizeArray } from "#@typeberry/collections";
5
6
  import { tinyChainSpec } from "#@typeberry/config";
6
7
  import { HASH_SIZE } from "#@typeberry/hash";
8
+ import { tryAsU8 } from "#@typeberry/numbers";
7
9
  import { asOpaqueType, deepEqual, OK } from "#@typeberry/utils";
8
10
  import { ReportsError } from "./error.js";
9
11
  import { guaranteesAsView, newCredential, newWorkReport } from "./test.utils.js";
@@ -44,6 +46,33 @@ describe("Reports.verifyReportsBasic", () => {
44
46
  details: () => "Work report at 0 too big. Got 0 + 49153, max: 49152",
45
47
  });
46
48
  });
49
+ it("should reject if report has invalid number of work results (0)", () => {
50
+ // Create a minimal work report with 0 results by manually constructing it
51
+ const emptyResults = FixedSizeArray.new([], tryAsU8(0));
52
+ const report = newWorkReport({ core: 0 });
53
+ // Bypass the type system to set 0 results
54
+ const invalidReport = {
55
+ ...report,
56
+ results: emptyResults,
57
+ };
58
+ const guarantees = guaranteesAsView(tinyChainSpec, [
59
+ ReportGuarantee.create({
60
+ slot: tryAsTimeSlot(10),
61
+ report: invalidReport,
62
+ credentials: asOpaqueType([0, 3].map((x) => newCredential(x))),
63
+ }),
64
+ ]);
65
+ const result = verifyReportsBasic(guarantees);
66
+ deepEqual(result, {
67
+ isOk: false,
68
+ isError: true,
69
+ error: ReportsError.InvalidWorkItemsCount,
70
+ details: () => `Number of work results is invalid.
71
+ Got: 0,
72
+ expected between 1 and 16
73
+ `,
74
+ });
75
+ });
47
76
  it("should verify correctly", () => {
48
77
  const guarantees = guaranteesAsView(tinyChainSpec, [
49
78
  ReportGuarantee.create({
@@ -27,13 +27,6 @@ export type Input = {
27
27
  * https://graypaper.fluffylabs.dev/#/cc517d7/171f05171f05?v=0.6.5
28
28
  */
29
29
  accumulationStatistics: Map<ServiceId, CountAndGasUsed>;
30
- /**
31
- * `X`: Deffered transfer statistics
32
- * TODO [MaSo] Use fields from accumulation.
33
- *
34
- * https://graypaper.fluffylabs.dev/#/cc517d7/18dd0018dd00?v=0.6.5
35
- */
36
- transferStatistics: Map<ServiceId, CountAndGasUsed>;
37
30
  reporters: readonly Ed25519Key[];
38
31
  currentValidatorData: State["currentValidatorData"];
39
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/transition/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EAIb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAqB,KAAK,KAAK,EAAuC,MAAM,kBAAkB,CAAC;AAGtG,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACxD;;;;;OAKG;IACH,kBAAkB,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,SAAS,EAAE,SAAS,UAAU,EAAE,CAAC;IACjC,oBAAoB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG;IACrE;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;CAC9D,CAAC;AAEF,sCAAsC;AACtC,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAExE,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,SAAS;aACV,KAAK,EAAE,eAAe;gBADrB,SAAS,EAAE,SAAS,EACrB,KAAK,EAAE,eAAe;IAGxC,OAAO,CAAC,aAAa;IAyBrB,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IAe5B,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IA+B5B,sEAAsE;IACtE,OAAO,CAAC,6BAA6B;IAoBrC;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,qBAAqB;CAgJhD"}
1
+ {"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/transition/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EAIb,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAqB,KAAK,KAAK,EAAuC,MAAM,kBAAkB,CAAC;AAGtG,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,cAAc,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,sBAAsB,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACxD,SAAS,EAAE,SAAS,UAAU,EAAE,CAAC;IACjC,oBAAoB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG;IACrE;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;CAC9D,CAAC;AAEF,sCAAsC;AACtC,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAExE,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,SAAS;aACV,KAAK,EAAE,eAAe;gBADrB,SAAS,EAAE,SAAS,EACrB,KAAK,EAAE,eAAe;IAGxC,OAAO,CAAC,aAAa;IAyBrB,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IAe5B,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IA+B5B,sEAAsE;IACtE,OAAO,CAAC,6BAA6B;IAoBrC;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,qBAAqB;CAwIhD"}
@@ -96,7 +96,7 @@ export class Statistics {
96
96
  *
97
97
  * https://graypaper.fluffylabs.dev/#/cc517d7/195f04195f04?v=0.6.5
98
98
  */
99
- collectServiceIds(preimages, workResults, accumulationKeys, transferKeys) {
99
+ collectServiceIds(preimages, workResults, accumulationKeys) {
100
100
  const serviceIds = new Set();
101
101
  for (const preimage of preimages) {
102
102
  serviceIds.add(preimage.requester);
@@ -107,9 +107,6 @@ export class Statistics {
107
107
  for (const serviceId of accumulationKeys) {
108
108
  serviceIds.add(serviceId);
109
109
  }
110
- for (const serviceId of transferKeys) {
111
- serviceIds.add(serviceId);
112
- }
113
110
  return serviceIds;
114
111
  }
115
112
  /**
@@ -195,7 +192,7 @@ export class Statistics {
195
192
  }
196
193
  /** Update services statistics */
197
194
  services.clear();
198
- const serviceIds = this.collectServiceIds(extrinsic.preimages, incomingReports.flatMap((wr) => wr.results), input.accumulationStatistics.keys(), input.transferStatistics.keys());
195
+ const serviceIds = this.collectServiceIds(extrinsic.preimages, incomingReports.flatMap((wr) => wr.results), input.accumulationStatistics.keys());
199
196
  for (const serviceId of serviceIds) {
200
197
  const workResults = incomingReports.flatMap((wr) => wr.results.filter((r) => r.serviceId === serviceId));
201
198
  const { gasUsed, imported, extrinsicCount, extrinsicSize, exported } = this.calculateRefineScore(workResults);
@@ -205,10 +202,6 @@ export class Statistics {
205
202
  count: tryAsU32(0),
206
203
  gasUsed: tryAsServiceGas(0n),
207
204
  };
208
- const { count: transfersCount, gasUsed: transfersGasUsed } = input.transferStatistics.get(serviceId) ?? {
209
- count: tryAsU32(0),
210
- gasUsed: tryAsServiceGas(0n),
211
- };
212
205
  /**
213
206
  * Service statistics are tracked only per-block basis, so we override previous values.
214
207
  * https://graypaper.fluffylabs.dev/#/cc517d7/190201190501?v=0.6.5
@@ -226,8 +219,6 @@ export class Statistics {
226
219
  serviceStatistics.providedSize = providedSize;
227
220
  serviceStatistics.accumulateCount = accumulatedCount;
228
221
  serviceStatistics.accumulateGasUsed = accumulatedGasUsed;
229
- serviceStatistics.onTransfersCount = transfersCount;
230
- serviceStatistics.onTransfersGasUsed = transfersGasUsed;
231
222
  services.set(serviceId, serviceStatistics);
232
223
  }
233
224
  /** Update state */