@typeberry/lib 0.5.10-6cb1bd5 → 0.5.10-ca4935b

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 (40) hide show
  1. package/package.json +1 -1
  2. package/packages/core/codec/encoder.d.ts +1 -1
  3. package/packages/core/codec/encoder.d.ts.map +1 -1
  4. package/packages/core/codec/encoder.js +3 -2
  5. package/packages/core/pvm-interface/pvm.d.ts +2 -0
  6. package/packages/core/pvm-interface/pvm.d.ts.map +1 -1
  7. package/packages/jam/executor/pvm-executor.d.ts +2 -2
  8. package/packages/jam/executor/pvm-executor.d.ts.map +1 -1
  9. package/packages/jam/in-core/externalities/refine.d.ts +14 -4
  10. package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
  11. package/packages/jam/in-core/externalities/refine.js +47 -3
  12. package/packages/jam/in-core/externalities/refine.test.js +49 -2
  13. package/packages/jam/in-core/in-core.d.ts.map +1 -1
  14. package/packages/jam/in-core/in-core.js +3 -5
  15. package/packages/jam/jam-host-calls/general/fetch.d.ts +159 -98
  16. package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
  17. package/packages/jam/jam-host-calls/general/fetch.js +110 -16
  18. package/packages/jam/jam-host-calls/general/fetch.test.js +87 -56
  19. package/packages/jam/transition/accumulate/accumulate.js +2 -2
  20. package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts +19 -0
  21. package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts.map +1 -0
  22. package/packages/jam/transition/externalities/accumulate-fetch-externalities.js +45 -0
  23. package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts +2 -0
  24. package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts.map +1 -0
  25. package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.js +192 -0
  26. package/packages/jam/transition/externalities/fetch-externalities.d.ts +3 -39
  27. package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
  28. package/packages/jam/transition/externalities/fetch-externalities.js +2 -88
  29. package/packages/jam/transition/externalities/index.d.ts +2 -0
  30. package/packages/jam/transition/externalities/index.d.ts.map +1 -1
  31. package/packages/jam/transition/externalities/index.js +2 -0
  32. package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts +23 -0
  33. package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts.map +1 -0
  34. package/packages/jam/transition/externalities/refine-fetch-externalities.js +48 -0
  35. package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts +2 -0
  36. package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts.map +1 -0
  37. package/packages/jam/transition/externalities/refine-fetch-externalities.test.js +32 -0
  38. package/packages/jam/transition/externalities/fetch-externalities.test.d.ts +0 -2
  39. package/packages/jam/transition/externalities/fetch-externalities.test.d.ts.map +0 -1
  40. package/packages/jam/transition/externalities/fetch-externalities.test.js +0 -254
@@ -1,8 +1,6 @@
1
- import type { EntropyHash } from "#@typeberry/block";
2
1
  import type { BytesBlob } from "#@typeberry/bytes";
3
2
  import type { ChainSpec } from "#@typeberry/config";
4
- import { type general, PendingTransfer } from "#@typeberry/jam-host-calls";
5
- import { type U64 } from "#@typeberry/numbers";
3
+ import { PendingTransfer } from "#@typeberry/jam-host-calls";
6
4
  import { Operand } from "../accumulate/operand.js";
7
5
  export declare enum TransferOperandKind {
8
6
  OPERAND = 0,
@@ -16,40 +14,6 @@ export type TransferOrOperand = {
16
14
  value: PendingTransfer;
17
15
  };
18
16
  export declare const TRANSFER_OR_OPERAND: import("@typeberry/codec").Descriptor<TransferOrOperand, TransferOrOperand>;
19
- declare enum FetchContext {
20
- Accumulate = 0,
21
- Refine = 1
22
- }
23
- type AccumulateFetchData = {
24
- context: FetchContext.Accumulate;
25
- entropy: EntropyHash;
26
- transfers: PendingTransfer[];
27
- operands: Operand[];
28
- };
29
- type RefineFetchData = {
30
- context: FetchContext.Refine;
31
- entropy: undefined;
32
- };
33
- export declare class FetchExternalities implements general.IFetchExternalities {
34
- private fetchData;
35
- private chainSpec;
36
- private constructor();
37
- static createForAccumulate(fetchData: Omit<AccumulateFetchData, "context">, chainSpec: ChainSpec): FetchExternalities;
38
- static createForRefine(fetchData: Omit<RefineFetchData, "context">, chainSpec: ChainSpec): FetchExternalities;
39
- constants(): BytesBlob;
40
- entropy(): BytesBlob | null;
41
- authorizerTrace(): BytesBlob | null;
42
- workItemExtrinsic(_workItem: U64 | null, _index: U64): BytesBlob | null;
43
- workItemImport(_workItem: U64 | null, _index: U64): BytesBlob | null;
44
- workPackage(): BytesBlob | null;
45
- authorizer(): BytesBlob | null;
46
- authorizationToken(): BytesBlob | null;
47
- refineContext(): BytesBlob | null;
48
- allWorkItems(): BytesBlob | null;
49
- oneWorkItem(_workItem: U64): BytesBlob | null;
50
- workItemPayload(_workItem: U64): BytesBlob | null;
51
- allTransfersAndOperands(): BytesBlob | null;
52
- oneTransferOrOperand(index: U64): BytesBlob | null;
53
- }
54
- export {};
17
+ export declare const TRANSFERS_AND_OPERANDS: import("@typeberry/codec").Descriptor<TransferOrOperand[], import("@typeberry/codec").SequenceView<TransferOrOperand, TransferOrOperand>>;
18
+ export declare function getEncodedConstants(chainSpec: ChainSpec): BytesBlob;
55
19
  //# sourceMappingURL=fetch-externalities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/fetch-externalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAgC,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAQ5E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAInD,oBAAY,mBAAmB;IAC7B,OAAO,IAAI;IACX,QAAQ,IAAI;CACb;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC;IACnC,KAAK,EAAE,eAAe,CAAC;CACxB,CAAC;AAEN,eAAO,MAAM,mBAAmB,6EAG9B,CAAC;AA2FH,aAAK,YAAY;IACf,UAAU,IAAI;IACd,MAAM,IAAI;CACX;AAED,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC;IAE7B,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAOF,qBAAa,kBAAmB,YAAW,OAAO,CAAC,mBAAmB;IAElE,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IAFnB,OAAO;IAKP,MAAM,CAAC,mBAAmB,CACxB,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAC/C,SAAS,EAAE,SAAS,GACnB,kBAAkB;IAIrB,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAI7G,SAAS,IAAI,SAAS;IAItB,OAAO,IAAI,SAAS,GAAG,IAAI;IAS3B,eAAe,IAAI,SAAS,GAAG,IAAI;IAInC,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAIvE,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAIpE,WAAW,IAAI,SAAS,GAAG,IAAI;IAI/B,UAAU,IAAI,SAAS,GAAG,IAAI;IAI9B,kBAAkB,IAAI,SAAS,GAAG,IAAI;IAItC,aAAa,IAAI,SAAS,GAAG,IAAI;IAIjC,YAAY,IAAI,SAAS,GAAG,IAAI;IAIhC,WAAW,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAI7C,eAAe,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAIjD,uBAAuB,IAAI,SAAS,GAAG,IAAI;IAa3C,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;CAuBnD"}
1
+ {"version":3,"file":"fetch-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/fetch-externalities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAS5D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAInD,oBAAY,mBAAmB;IAC7B,OAAO,IAAI;IACX,QAAQ,IAAI;CACb;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC;IACnC,KAAK,EAAE,eAAe,CAAC;CACxB,CAAC;AAEN,eAAO,MAAM,mBAAmB,6EAG9B,CAAC;AAEH,eAAO,MAAM,sBAAsB,2IAA4C,CAAC;AA0ChF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,aA6CvD"}
@@ -17,7 +17,7 @@ export const TRANSFER_OR_OPERAND = codec.union("TransferOrOperand", {
17
17
  [TransferOperandKind.OPERAND]: codec.object({ value: Operand.Codec }),
18
18
  [TransferOperandKind.TRANSFER]: codec.object({ value: PendingTransfer.Codec }),
19
19
  });
20
- const TRANSFERS_AND_OPERANDS = codec.sequenceVarLen(TRANSFER_OR_OPERAND);
20
+ export const TRANSFERS_AND_OPERANDS = codec.sequenceVarLen(TRANSFER_OR_OPERAND);
21
21
  // https://github.com/gavofyork/graypaper/pull/414
22
22
  // 0.7.0 encoding is used for prior versions as well.
23
23
  const CONSTANTS_CODEC = codec.object({
@@ -56,7 +56,7 @@ const CONSTANTS_CODEC = codec.object({
56
56
  Y: codec.u32,
57
57
  });
58
58
  const encodedConstantsCache = new Map();
59
- function getEncodedConstants(chainSpec) {
59
+ export function getEncodedConstants(chainSpec) {
60
60
  const constsFromCache = encodedConstantsCache.get(chainSpec);
61
61
  if (constsFromCache !== undefined) {
62
62
  return constsFromCache;
@@ -99,89 +99,3 @@ function getEncodedConstants(chainSpec) {
99
99
  encodedConstantsCache.set(chainSpec, encodedConsts);
100
100
  return encodedConsts;
101
101
  }
102
- var FetchContext;
103
- (function (FetchContext) {
104
- FetchContext[FetchContext["Accumulate"] = 0] = "Accumulate";
105
- FetchContext[FetchContext["Refine"] = 1] = "Refine";
106
- })(FetchContext || (FetchContext = {}));
107
- export class FetchExternalities {
108
- fetchData;
109
- chainSpec;
110
- constructor(fetchData, chainSpec) {
111
- this.fetchData = fetchData;
112
- this.chainSpec = chainSpec;
113
- }
114
- static createForAccumulate(fetchData, chainSpec) {
115
- return new FetchExternalities({ context: FetchContext.Accumulate, ...fetchData }, chainSpec);
116
- }
117
- static createForRefine(fetchData, chainSpec) {
118
- return new FetchExternalities({ context: FetchContext.Refine, ...fetchData }, chainSpec);
119
- }
120
- constants() {
121
- return getEncodedConstants(this.chainSpec);
122
- }
123
- entropy() {
124
- const { entropy } = this.fetchData;
125
- if (entropy === undefined) {
126
- return null;
127
- }
128
- return entropy.asOpaque();
129
- }
130
- authorizerTrace() {
131
- return null;
132
- }
133
- workItemExtrinsic(_workItem, _index) {
134
- return null;
135
- }
136
- workItemImport(_workItem, _index) {
137
- return null;
138
- }
139
- workPackage() {
140
- return null;
141
- }
142
- authorizer() {
143
- return null;
144
- }
145
- authorizationToken() {
146
- return null;
147
- }
148
- refineContext() {
149
- return null;
150
- }
151
- allWorkItems() {
152
- return null;
153
- }
154
- oneWorkItem(_workItem) {
155
- return null;
156
- }
157
- workItemPayload(_workItem) {
158
- return null;
159
- }
160
- allTransfersAndOperands() {
161
- if (this.fetchData.context === FetchContext.Accumulate) {
162
- const { transfers, operands } = this.fetchData;
163
- const transfersAndOperands = transfers
164
- .map((transfer) => ({ kind: TransferOperandKind.TRANSFER, value: transfer }))
165
- .concat(operands.map((operand) => ({ kind: TransferOperandKind.OPERAND, value: operand })));
166
- return Encoder.encodeObject(TRANSFERS_AND_OPERANDS, transfersAndOperands, this.chainSpec);
167
- }
168
- return null;
169
- }
170
- oneTransferOrOperand(index) {
171
- if (this.fetchData.context === FetchContext.Accumulate) {
172
- const { operands, transfers } = this.fetchData;
173
- if (index >= operands.length + transfers.length) {
174
- return null;
175
- }
176
- const kind = index < operands.length ? TransferOperandKind.OPERAND : TransferOperandKind.TRANSFER;
177
- const transferOrOperand = kind === TransferOperandKind.OPERAND
178
- ? { kind: TransferOperandKind.OPERAND, value: operands[Number(index)] }
179
- : { kind: TransferOperandKind.TRANSFER, value: transfers[Number(index) - operands.length] };
180
- if (transferOrOperand.value === undefined) {
181
- return null;
182
- }
183
- return Encoder.encodeObject(TRANSFER_OR_OPERAND, transferOrOperand, this.chainSpec);
184
- }
185
- return null;
186
- }
187
- }
@@ -1,3 +1,5 @@
1
1
  export * from "./accumulate-externalities.js";
2
+ export * from "./accumulate-fetch-externalities.js";
2
3
  export * from "./fetch-externalities.js";
4
+ export * from "./refine-fetch-externalities.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC"}
@@ -1,2 +1,4 @@
1
1
  export * from "./accumulate-externalities.js";
2
+ export * from "./accumulate-fetch-externalities.js";
2
3
  export * from "./fetch-externalities.js";
4
+ export * from "./refine-fetch-externalities.js";
@@ -0,0 +1,23 @@
1
+ import type { EntropyHash } from "#@typeberry/block";
2
+ import { type BytesBlob } from "#@typeberry/bytes";
3
+ import type { ChainSpec } from "#@typeberry/config";
4
+ import { general } from "#@typeberry/jam-host-calls";
5
+ import type { U64 } from "#@typeberry/numbers";
6
+ export declare class RefineFetchExternalities implements general.IRefineFetch {
7
+ private readonly chainSpec;
8
+ readonly context = general.FetchContext.Refine;
9
+ constructor(chainSpec: ChainSpec);
10
+ constants(): BytesBlob;
11
+ entropy(): EntropyHash;
12
+ authorizerTrace(): BytesBlob | null;
13
+ workItemExtrinsic(_workItem: U64 | null, _index: U64): BytesBlob | null;
14
+ workItemImport(_workItem: U64 | null, _index: U64): BytesBlob | null;
15
+ workPackage(): BytesBlob | null;
16
+ authorizer(): BytesBlob | null;
17
+ authorizationToken(): BytesBlob | null;
18
+ refineContext(): BytesBlob | null;
19
+ allWorkItems(): BytesBlob | null;
20
+ oneWorkItem(_workItem: U64): BytesBlob | null;
21
+ workItemPayload(_workItem: U64): BytesBlob | null;
22
+ }
23
+ //# sourceMappingURL=refine-fetch-externalities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine-fetch-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/refine-fetch-externalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAG9C,qBAAa,wBAAyB,YAAW,OAAO,CAAC,YAAY;IAGvD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,QAAQ,CAAC,OAAO,+BAA+B;gBAElB,SAAS,EAAE,SAAS;IAEjD,SAAS,IAAI,SAAS;IAKtB,OAAO,IAAI,WAAW;IAItB,eAAe,IAAI,SAAS,GAAG,IAAI;IAInC,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAIvE,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAIpE,WAAW,IAAI,SAAS,GAAG,IAAI;IAI/B,UAAU,IAAI,SAAS,GAAG,IAAI;IAI9B,kBAAkB,IAAI,SAAS,GAAG,IAAI;IAItC,aAAa,IAAI,SAAS,GAAG,IAAI;IAIjC,YAAY,IAAI,SAAS,GAAG,IAAI;IAIhC,WAAW,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAI7C,eAAe,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;CAGlD"}
@@ -0,0 +1,48 @@
1
+ import { Bytes } from "#@typeberry/bytes";
2
+ import { HASH_SIZE } from "#@typeberry/hash";
3
+ import { general } from "#@typeberry/jam-host-calls";
4
+ import { getEncodedConstants } from "./fetch-externalities.js";
5
+ export class RefineFetchExternalities {
6
+ chainSpec;
7
+ context = general.FetchContext.Refine;
8
+ constructor(chainSpec) {
9
+ this.chainSpec = chainSpec;
10
+ }
11
+ constants() {
12
+ return getEncodedConstants(this.chainSpec);
13
+ }
14
+ // Returns H₀ (zero hash)
15
+ entropy() {
16
+ return Bytes.zero(HASH_SIZE).asOpaque();
17
+ }
18
+ authorizerTrace() {
19
+ return null;
20
+ }
21
+ workItemExtrinsic(_workItem, _index) {
22
+ return null;
23
+ }
24
+ workItemImport(_workItem, _index) {
25
+ return null;
26
+ }
27
+ workPackage() {
28
+ return null;
29
+ }
30
+ authorizer() {
31
+ return null;
32
+ }
33
+ authorizationToken() {
34
+ return null;
35
+ }
36
+ refineContext() {
37
+ return null;
38
+ }
39
+ allWorkItems() {
40
+ return null;
41
+ }
42
+ oneWorkItem(_workItem) {
43
+ return null;
44
+ }
45
+ workItemPayload(_workItem) {
46
+ return null;
47
+ }
48
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=refine-fetch-externalities.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine-fetch-externalities.test.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/refine-fetch-externalities.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import assert from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { fullChainSpec, tinyChainSpec } from "#@typeberry/config";
4
+ import { RefineFetchExternalities } from "./refine-fetch-externalities.js";
5
+ describe("RefineFetchExternalities", () => {
6
+ const prepareRefineData = ({ chainSpec } = {}) => {
7
+ const defaultChainSpec = tinyChainSpec;
8
+ return new RefineFetchExternalities(chainSpec ?? defaultChainSpec);
9
+ };
10
+ it("should return different constants for different chain specs", () => {
11
+ const tinyFetchExternalities = prepareRefineData({ chainSpec: tinyChainSpec });
12
+ const fullFetchExternalities = prepareRefineData({ chainSpec: fullChainSpec });
13
+ const tinyConstants = tinyFetchExternalities.constants();
14
+ const fullConstants = fullFetchExternalities.constants();
15
+ assert.notStrictEqual(tinyConstants.length, 0);
16
+ assert.notStrictEqual(fullConstants.length, 0);
17
+ assert.notDeepStrictEqual(tinyConstants, fullConstants);
18
+ });
19
+ // Pending implementation — these should assert against real fixture values once
20
+ // RefineFetchExternalities accepts and exposes the required refine inputs.
21
+ it.todo("should return entropy (H₀ header hash of anchor block)");
22
+ it.todo("should return authorizer trace");
23
+ it.todo("should return work item extrinsic");
24
+ it.todo("should return work item import");
25
+ it.todo("should return work package");
26
+ it.todo("should return authorizer");
27
+ it.todo("should return authorization token");
28
+ it.todo("should return refine context");
29
+ it.todo("should return all work items");
30
+ it.todo("should return one work item");
31
+ it.todo("should return work item payload");
32
+ });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fetch-externalities.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-externalities.test.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/fetch-externalities.test.ts"],"names":[],"mappings":""}
@@ -1,254 +0,0 @@
1
- import assert from "node:assert";
2
- import { describe, it } from "node:test";
3
- import { tryAsServiceGas, tryAsServiceId } from "#@typeberry/block";
4
- import { WorkExecResult } from "#@typeberry/block/work-result.js";
5
- import { Bytes, BytesBlob } from "#@typeberry/bytes";
6
- import { codec, Encoder } from "#@typeberry/codec";
7
- import { fullChainSpec, tinyChainSpec } from "#@typeberry/config";
8
- import { HASH_SIZE } from "#@typeberry/hash";
9
- import { TRANSFER_MEMO_BYTES } from "#@typeberry/jam-host-calls/externalities/partial-state.js";
10
- import { PendingTransfer } from "#@typeberry/jam-host-calls/externalities/pending-transfer.js";
11
- import { tryAsU64 } from "#@typeberry/numbers";
12
- import { Operand } from "../accumulate/operand.js";
13
- import { FetchExternalities, TRANSFER_OR_OPERAND, TransferOperandKind, } from "./fetch-externalities.js";
14
- describe("fetch-externalities", () => {
15
- const prepareOperands = (length) => {
16
- const operands = [];
17
- for (let i = 0; i < length; i++) {
18
- operands.push(Operand.create({
19
- authorizationOutput: BytesBlob.empty(),
20
- authorizerHash: Bytes.fill(HASH_SIZE, i + 1).asOpaque(),
21
- exportsRoot: Bytes.fill(HASH_SIZE, i + 2).asOpaque(),
22
- hash: Bytes.fill(HASH_SIZE, i + 4).asOpaque(),
23
- payloadHash: Bytes.fill(HASH_SIZE, i + 5).asOpaque(),
24
- result: WorkExecResult.ok(BytesBlob.empty()),
25
- gas: tryAsServiceGas(1_000),
26
- }));
27
- }
28
- return operands;
29
- };
30
- const prepareTransfers = (length) => {
31
- const transfers = [];
32
- for (let i = 0; i < length; i++) {
33
- transfers.push(PendingTransfer.create({
34
- amount: tryAsU64(1000),
35
- source: tryAsServiceId(i),
36
- destination: tryAsServiceId(i + 1),
37
- gas: tryAsServiceGas(10),
38
- memo: Bytes.fill(TRANSFER_MEMO_BYTES, 0),
39
- }));
40
- }
41
- return transfers;
42
- };
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);
65
- };
66
- const prepareAccumulateData = ({ chainSpec, operands, entropy, transfers, }) => {
67
- const defaultChainSpec = tinyChainSpec;
68
- const defaultEntropy = Bytes.zero(HASH_SIZE).asOpaque();
69
- const defaultOperands = [];
70
- const defaultTransfers = [];
71
- const fetchData = {
72
- entropy: entropy ?? defaultEntropy,
73
- operands: operands ?? defaultOperands,
74
- transfers: transfers ?? defaultTransfers,
75
- };
76
- return FetchExternalities.createForAccumulate(fetchData, chainSpec ?? defaultChainSpec);
77
- };
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
- });
214
- });
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
- });
253
- });
254
- });