@typeberry/lib 0.5.10-6cb1bd5 → 0.5.10-7338c21
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.
- package/package.json +1 -1
- package/packages/core/codec/encoder.d.ts +1 -1
- package/packages/core/codec/encoder.d.ts.map +1 -1
- package/packages/core/codec/encoder.js +3 -2
- package/packages/core/pvm-interface/pvm.d.ts +2 -0
- package/packages/core/pvm-interface/pvm.d.ts.map +1 -1
- package/packages/jam/block/work-package.d.ts +7 -7
- package/packages/jam/block/work-package.d.ts.map +1 -1
- package/packages/jam/block/work-package.js +12 -12
- package/packages/jam/executor/pvm-executor.d.ts +9 -2
- package/packages/jam/executor/pvm-executor.d.ts.map +1 -1
- package/packages/jam/executor/pvm-executor.js +15 -0
- package/packages/jam/in-core/externalities/refine.d.ts +18 -8
- package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
- package/packages/jam/in-core/externalities/refine.js +86 -7
- package/packages/jam/in-core/externalities/refine.test.js +167 -2
- package/packages/jam/in-core/in-core.d.ts +7 -22
- package/packages/jam/in-core/in-core.d.ts.map +1 -1
- package/packages/jam/in-core/in-core.js +16 -186
- package/packages/jam/in-core/in-core.test.js +47 -15
- package/packages/jam/in-core/is-authorized.d.ts +33 -0
- package/packages/jam/in-core/is-authorized.d.ts.map +1 -0
- package/packages/jam/in-core/is-authorized.js +72 -0
- package/packages/jam/in-core/is-authorized.test.d.ts +2 -0
- package/packages/jam/in-core/is-authorized.test.d.ts.map +1 -0
- package/packages/jam/in-core/is-authorized.test.js +125 -0
- package/packages/jam/in-core/refine.d.ts +34 -0
- package/packages/jam/in-core/refine.d.ts.map +1 -0
- package/packages/jam/in-core/refine.js +176 -0
- package/packages/jam/in-core/refine.test.d.ts +2 -0
- package/packages/jam/in-core/refine.test.d.ts.map +1 -0
- package/packages/jam/in-core/refine.test.js +6 -0
- package/packages/jam/jam-host-calls/accumulate/bless.js +9 -9
- package/packages/jam/jam-host-calls/externalities/partial-state.d.ts +1 -1
- package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts +1 -1
- package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/general/fetch.d.ts +164 -103
- package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
- package/packages/jam/jam-host-calls/general/fetch.js +117 -23
- package/packages/jam/jam-host-calls/general/fetch.test.js +100 -66
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +2 -2
- package/packages/jam/transition/accumulate/accumulate.js +2 -2
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +48 -39
- package/packages/jam/transition/externalities/accumulate-externalities.d.ts +2 -2
- package/packages/jam/transition/externalities/accumulate-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/accumulate-externalities.js +20 -7
- package/packages/jam/transition/externalities/accumulate-externalities.test.js +74 -4
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts +19 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts.map +1 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.js +45 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts +2 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts.map +1 -0
- package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.js +192 -0
- package/packages/jam/transition/externalities/fetch-externalities.d.ts +3 -39
- package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/fetch-externalities.js +2 -88
- package/packages/jam/transition/externalities/index.d.ts +3 -0
- package/packages/jam/transition/externalities/index.d.ts.map +1 -1
- package/packages/jam/transition/externalities/index.js +3 -0
- package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts +22 -0
- package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts.map +1 -0
- package/packages/jam/transition/externalities/is-authorized-fetch-externalities.js +41 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts +23 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts.map +1 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.js +56 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts +2 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts.map +1 -0
- package/packages/jam/transition/externalities/refine-fetch-externalities.test.js +32 -0
- package/packages/jam/transition/externalities/fetch-externalities.test.d.ts +0 -2
- package/packages/jam/transition/externalities/fetch-externalities.test.d.ts.map +0 -1
- package/packages/jam/transition/externalities/fetch-externalities.test.js +0 -254
|
@@ -6,7 +6,7 @@ import { asKnownSize, FixedSizeArray, HashDictionary } from "#@typeberry/collect
|
|
|
6
6
|
import { tinyChainSpec } from "#@typeberry/config";
|
|
7
7
|
import { BANDERSNATCH_KEY_BYTES, BLS_KEY_BYTES, ED25519_KEY_BYTES } from "#@typeberry/crypto";
|
|
8
8
|
import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
|
|
9
|
-
import { EjectError, ForgetPreimageError, NewServiceError, PartiallyUpdatedState, PendingTransfer, PreimageStatusKind, ProvidePreimageError, RequestPreimageError, TRANSFER_MEMO_BYTES, TransferError, UnprivilegedError, UpdatePrivilegesError, writeServiceIdAsLeBytes, } from "#@typeberry/jam-host-calls";
|
|
9
|
+
import { CURRENT_SERVICE_ID, EjectError, ForgetPreimageError, NewServiceError, PartiallyUpdatedState, PendingTransfer, PreimageStatusKind, ProvidePreimageError, RequestPreimageError, TRANSFER_MEMO_BYTES, TransferError, UnprivilegedError, UpdatePrivilegesError, writeServiceIdAsLeBytes, } from "#@typeberry/jam-host-calls";
|
|
10
10
|
import { tryAsU32, tryAsU64 } from "#@typeberry/numbers";
|
|
11
11
|
import { AUTHORIZATION_QUEUE_SIZE, InMemoryService, InMemoryState, LookupHistoryItem, PreimageItem, PrivilegedServices, ServiceAccountInfo, StorageItem, tryAsLookupHistorySlots, tryAsPerCore, UpdatePreimage, UpdateService, VALIDATOR_META_BYTES, ValidatorData, } from "#@typeberry/state";
|
|
12
12
|
import { testState } from "#@typeberry/state/test.utils.js";
|
|
@@ -663,16 +663,28 @@ describe("PartialState.upgradeService", () => {
|
|
|
663
663
|
});
|
|
664
664
|
});
|
|
665
665
|
describe("PartialState.updateAuthorizationQueue", () => {
|
|
666
|
-
it("should update the authorization queue for
|
|
666
|
+
it("should update the authorization queue and transfer the assigner for the given core", () => {
|
|
667
667
|
const state = partiallyUpdatedState();
|
|
668
|
+
const initialPrivileged = state.state.privilegedServices;
|
|
668
669
|
const partialState = new AccumulateExternalities(tinyChainSpec, blake2b, state, tryAsServiceId(0), tryAsServiceId(10), tryAsTimeSlot(16));
|
|
669
670
|
const coreIndex = tryAsCoreIndex(0);
|
|
670
|
-
const
|
|
671
|
+
const newAssigner = tryAsServiceId(99);
|
|
671
672
|
const queue = FixedSizeArray.new(Array.from({ length: AUTHORIZATION_QUEUE_SIZE }, () => Bytes.fill(HASH_SIZE, 0xee).asOpaque()), AUTHORIZATION_QUEUE_SIZE);
|
|
672
673
|
// when
|
|
673
|
-
partialState.updateAuthorizationQueue(coreIndex, queue,
|
|
674
|
+
const result = partialState.updateAuthorizationQueue(coreIndex, queue, newAssigner);
|
|
674
675
|
// then
|
|
676
|
+
deepEqual(result, Result.ok(OK));
|
|
675
677
|
assert.deepStrictEqual(state.stateUpdate.authorizationQueues.get(coreIndex), queue);
|
|
678
|
+
// the privilegedServices update must be written, with only the targeted
|
|
679
|
+
// core's assigner transferred; all other fields must be preserved.
|
|
680
|
+
const updated = state.stateUpdate.privilegedServices;
|
|
681
|
+
assert.ok(updated !== null, "stateUpdate.privilegedServices should be written");
|
|
682
|
+
assert.strictEqual(updated.assigners[0], newAssigner);
|
|
683
|
+
assert.strictEqual(updated.assigners[1], initialPrivileged.assigners[1]);
|
|
684
|
+
assert.strictEqual(updated.manager, initialPrivileged.manager);
|
|
685
|
+
assert.strictEqual(updated.delegator, initialPrivileged.delegator);
|
|
686
|
+
assert.strictEqual(updated.registrar, initialPrivileged.registrar);
|
|
687
|
+
assert.strictEqual(updated.autoAccumulateServices, initialPrivileged.autoAccumulateServices);
|
|
676
688
|
});
|
|
677
689
|
it("should return InvalidServiceId when given auth manager is invalid", () => {
|
|
678
690
|
const state = partiallyUpdatedState();
|
|
@@ -685,6 +697,8 @@ describe("PartialState.updateAuthorizationQueue", () => {
|
|
|
685
697
|
// then
|
|
686
698
|
deepEqual(result, Result.error(UpdatePrivilegesError.InvalidServiceId, () => "New auth manager is null for core 0"));
|
|
687
699
|
assert.deepStrictEqual(state.stateUpdate.authorizationQueues.get(coreIndex), undefined);
|
|
700
|
+
// no partial privilegedServices write on error
|
|
701
|
+
assert.strictEqual(state.stateUpdate.privilegedServices, null);
|
|
688
702
|
});
|
|
689
703
|
it("should return UnprivilegedService when current service is not privileged", () => {
|
|
690
704
|
const state = partiallyUpdatedState();
|
|
@@ -701,6 +715,8 @@ describe("PartialState.updateAuthorizationQueue", () => {
|
|
|
701
715
|
// then
|
|
702
716
|
deepEqual(result, Result.error(UpdatePrivilegesError.UnprivilegedService, () => "Service 0 not assigner for core 0 (expected: 1)"));
|
|
703
717
|
assert.deepStrictEqual(state.stateUpdate.authorizationQueues.get(coreIndex), undefined);
|
|
718
|
+
// no partial privilegedServices write on error
|
|
719
|
+
assert.strictEqual(state.stateUpdate.privilegedServices, null);
|
|
704
720
|
});
|
|
705
721
|
it("should return UnprivilegedService before InvalidServiceId if given auth manager is incorrect, but current servis is also unprivileged", () => {
|
|
706
722
|
const state = partiallyUpdatedState();
|
|
@@ -717,6 +733,60 @@ describe("PartialState.updateAuthorizationQueue", () => {
|
|
|
717
733
|
// then
|
|
718
734
|
deepEqual(result, Result.error(UpdatePrivilegesError.UnprivilegedService, () => "Service 0 not assigner for core 0 (expected: 1)"));
|
|
719
735
|
assert.deepStrictEqual(state.stateUpdate.authorizationQueues.get(coreIndex), undefined);
|
|
736
|
+
// no partial privilegedServices write on error
|
|
737
|
+
assert.strictEqual(state.stateUpdate.privilegedServices, null);
|
|
738
|
+
});
|
|
739
|
+
it("should succeed on a self-transfer using CURRENT_SERVICE_ID", () => {
|
|
740
|
+
const state = partiallyUpdatedState();
|
|
741
|
+
// inject a service info for CURRENT_SERVICE_ID so it can act as the
|
|
742
|
+
// current (and assigning) service on core 0
|
|
743
|
+
const baseService = state.state.services.get(tryAsServiceId(0));
|
|
744
|
+
if (baseService === undefined) {
|
|
745
|
+
throw new Error("Invalid service!");
|
|
746
|
+
}
|
|
747
|
+
state.state.services.set(CURRENT_SERVICE_ID, new InMemoryService(CURRENT_SERVICE_ID, {
|
|
748
|
+
info: baseService.data.info,
|
|
749
|
+
preimages: HashDictionary.new(),
|
|
750
|
+
lookupHistory: HashDictionary.new(),
|
|
751
|
+
storage: new Map(),
|
|
752
|
+
}));
|
|
753
|
+
state.state.privilegedServices = PrivilegedServices.create({
|
|
754
|
+
...state.state.privilegedServices,
|
|
755
|
+
assigners: asOpaqueType(FixedSizeArray.new([CURRENT_SERVICE_ID, tryAsServiceId(0)], tinyChainSpec.coresCount)),
|
|
756
|
+
});
|
|
757
|
+
const partialState = new AccumulateExternalities(tinyChainSpec, blake2b, state, CURRENT_SERVICE_ID, tryAsServiceId(10), tryAsTimeSlot(16));
|
|
758
|
+
const coreIndex = tryAsCoreIndex(0);
|
|
759
|
+
const queue = FixedSizeArray.new(Array.from({ length: AUTHORIZATION_QUEUE_SIZE }, () => Bytes.fill(HASH_SIZE, 0xee).asOpaque()), AUTHORIZATION_QUEUE_SIZE);
|
|
760
|
+
// when
|
|
761
|
+
const result = partialState.updateAuthorizationQueue(coreIndex, queue, CURRENT_SERVICE_ID);
|
|
762
|
+
// then
|
|
763
|
+
deepEqual(result, Result.ok(OK));
|
|
764
|
+
assert.deepStrictEqual(state.stateUpdate.authorizationQueues.get(coreIndex), queue);
|
|
765
|
+
const updated = state.stateUpdate.privilegedServices;
|
|
766
|
+
assert.ok(updated !== null, "stateUpdate.privilegedServices should be written");
|
|
767
|
+
assert.strictEqual(updated.assigners[0], CURRENT_SERVICE_ID);
|
|
768
|
+
assert.strictEqual(updated.assigners[1], tryAsServiceId(0));
|
|
769
|
+
});
|
|
770
|
+
it("should prevent the previous assigner from re-assigning after transfer", () => {
|
|
771
|
+
const state = partiallyUpdatedState();
|
|
772
|
+
const partialState = new AccumulateExternalities(tinyChainSpec, blake2b, state, tryAsServiceId(0), tryAsServiceId(10), tryAsTimeSlot(16));
|
|
773
|
+
const coreIndex = tryAsCoreIndex(0);
|
|
774
|
+
const newAssigner = tryAsServiceId(99);
|
|
775
|
+
const firstQueue = FixedSizeArray.new(Array.from({ length: AUTHORIZATION_QUEUE_SIZE }, () => Bytes.fill(HASH_SIZE, 0xee).asOpaque()), AUTHORIZATION_QUEUE_SIZE);
|
|
776
|
+
const secondQueue = FixedSizeArray.new(Array.from({ length: AUTHORIZATION_QUEUE_SIZE }, () => Bytes.fill(HASH_SIZE, 0xff).asOpaque()), AUTHORIZATION_QUEUE_SIZE);
|
|
777
|
+
// when: first call succeeds and transfers the assigner to service 99
|
|
778
|
+
const first = partialState.updateAuthorizationQueue(coreIndex, firstQueue, newAssigner);
|
|
779
|
+
// and the previous assigner (service 0) immediately tries to re-assign
|
|
780
|
+
const second = partialState.updateAuthorizationQueue(coreIndex, secondQueue, tryAsServiceId(0));
|
|
781
|
+
// then
|
|
782
|
+
deepEqual(first, Result.ok(OK));
|
|
783
|
+
deepEqual(second, Result.error(UpdatePrivilegesError.UnprivilegedService, () => "Service 0 not assigner for core 0 (expected: 99)"));
|
|
784
|
+
// the first queue remains — the failing second call must not overwrite it
|
|
785
|
+
assert.deepStrictEqual(state.stateUpdate.authorizationQueues.get(coreIndex), firstQueue);
|
|
786
|
+
// and the transferred assigner is still in place
|
|
787
|
+
const updated = state.stateUpdate.privilegedServices;
|
|
788
|
+
assert.ok(updated !== null);
|
|
789
|
+
assert.strictEqual(updated.assigners[0], newAssigner);
|
|
720
790
|
});
|
|
721
791
|
});
|
|
722
792
|
describe("PartialState.updatePrivilegedServices", () => {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EntropyHash } from "#@typeberry/block";
|
|
2
|
+
import type { BytesBlob } from "#@typeberry/bytes";
|
|
3
|
+
import type { ChainSpec } from "#@typeberry/config";
|
|
4
|
+
import { general, type PendingTransfer } from "#@typeberry/jam-host-calls";
|
|
5
|
+
import type { U64 } from "#@typeberry/numbers";
|
|
6
|
+
import type { Operand } from "../accumulate/operand.js";
|
|
7
|
+
export declare class AccumulateFetchExternalities implements general.IAccumulateFetch {
|
|
8
|
+
private readonly entropyHash;
|
|
9
|
+
private readonly transfers;
|
|
10
|
+
private readonly operands;
|
|
11
|
+
private readonly chainSpec;
|
|
12
|
+
readonly context = general.FetchContext.Accumulate;
|
|
13
|
+
constructor(entropyHash: EntropyHash, transfers: PendingTransfer[], operands: Operand[], chainSpec: ChainSpec);
|
|
14
|
+
constants(): BytesBlob;
|
|
15
|
+
entropy(): EntropyHash;
|
|
16
|
+
allTransfersAndOperands(): BytesBlob | null;
|
|
17
|
+
oneTransferOrOperand(index: U64): BytesBlob | null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=accumulate-fetch-externalities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accumulate-fetch-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/accumulate-fetch-externalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AASxD,qBAAa,4BAA6B,YAAW,OAAO,CAAC,gBAAgB;IAIzE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,QAAQ,CAAC,OAAO,mCAAmC;gBAGhC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,eAAe,EAAE,EAC5B,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS;IAGvC,SAAS,IAAI,SAAS;IAItB,OAAO,IAAI,WAAW;IAItB,uBAAuB,IAAI,SAAS,GAAG,IAAI;IAU3C,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;CAqBnD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Encoder } from "#@typeberry/codec";
|
|
2
|
+
import { general } from "#@typeberry/jam-host-calls";
|
|
3
|
+
import { getEncodedConstants, TRANSFER_OR_OPERAND, TRANSFERS_AND_OPERANDS, TransferOperandKind, } from "./fetch-externalities.js";
|
|
4
|
+
export class AccumulateFetchExternalities {
|
|
5
|
+
entropyHash;
|
|
6
|
+
transfers;
|
|
7
|
+
operands;
|
|
8
|
+
chainSpec;
|
|
9
|
+
context = general.FetchContext.Accumulate;
|
|
10
|
+
constructor(entropyHash, transfers, operands, chainSpec) {
|
|
11
|
+
this.entropyHash = entropyHash;
|
|
12
|
+
this.transfers = transfers;
|
|
13
|
+
this.operands = operands;
|
|
14
|
+
this.chainSpec = chainSpec;
|
|
15
|
+
}
|
|
16
|
+
constants() {
|
|
17
|
+
return getEncodedConstants(this.chainSpec);
|
|
18
|
+
}
|
|
19
|
+
entropy() {
|
|
20
|
+
return this.entropyHash;
|
|
21
|
+
}
|
|
22
|
+
allTransfersAndOperands() {
|
|
23
|
+
const transfersAndOperands = this.transfers
|
|
24
|
+
.map((transfer) => ({ kind: TransferOperandKind.TRANSFER, value: transfer }))
|
|
25
|
+
.concat(this.operands.map((operand) => ({ kind: TransferOperandKind.OPERAND, value: operand })));
|
|
26
|
+
return Encoder.encodeObject(TRANSFERS_AND_OPERANDS, transfersAndOperands, this.chainSpec);
|
|
27
|
+
}
|
|
28
|
+
oneTransferOrOperand(index) {
|
|
29
|
+
if (index >= this.transfers.length + this.operands.length) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// Transfers-first ordering, consistent with allTransfersAndOperands()
|
|
33
|
+
const kind = index < this.transfers.length ? TransferOperandKind.TRANSFER : TransferOperandKind.OPERAND;
|
|
34
|
+
const transferOrOperand = kind === TransferOperandKind.TRANSFER
|
|
35
|
+
? { kind: TransferOperandKind.TRANSFER, value: this.transfers[Number(index)] }
|
|
36
|
+
: {
|
|
37
|
+
kind: TransferOperandKind.OPERAND,
|
|
38
|
+
value: this.operands[Number(index) - this.transfers.length],
|
|
39
|
+
};
|
|
40
|
+
if (transferOrOperand.value === undefined) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return Encoder.encodeObject(TRANSFER_OR_OPERAND, transferOrOperand, this.chainSpec);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accumulate-fetch-externalities.test.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/accumulate-fetch-externalities.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
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 { AccumulateFetchExternalities } from "./accumulate-fetch-externalities.js";
|
|
14
|
+
import { TRANSFER_OR_OPERAND, TransferOperandKind } from "./fetch-externalities.js";
|
|
15
|
+
describe("AccumulateFetchExternalities", () => {
|
|
16
|
+
const prepareOperands = (length) => {
|
|
17
|
+
const operands = [];
|
|
18
|
+
for (let i = 0; i < length; i++) {
|
|
19
|
+
operands.push(Operand.create({
|
|
20
|
+
authorizationOutput: BytesBlob.empty(),
|
|
21
|
+
authorizerHash: Bytes.fill(HASH_SIZE, i + 1).asOpaque(),
|
|
22
|
+
exportsRoot: Bytes.fill(HASH_SIZE, i + 2).asOpaque(),
|
|
23
|
+
hash: Bytes.fill(HASH_SIZE, i + 4).asOpaque(),
|
|
24
|
+
payloadHash: Bytes.fill(HASH_SIZE, i + 5).asOpaque(),
|
|
25
|
+
result: WorkExecResult.ok(BytesBlob.empty()),
|
|
26
|
+
gas: tryAsServiceGas(1_000),
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
return operands;
|
|
30
|
+
};
|
|
31
|
+
const prepareTransfers = (length) => {
|
|
32
|
+
const transfers = [];
|
|
33
|
+
for (let i = 0; i < length; i++) {
|
|
34
|
+
transfers.push(PendingTransfer.create({
|
|
35
|
+
amount: tryAsU64(1000),
|
|
36
|
+
source: tryAsServiceId(i),
|
|
37
|
+
destination: tryAsServiceId(i + 1),
|
|
38
|
+
gas: tryAsServiceGas(10),
|
|
39
|
+
memo: Bytes.fill(TRANSFER_MEMO_BYTES, 0),
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
return transfers;
|
|
43
|
+
};
|
|
44
|
+
// allTransfersAndOperands: transfers first, then operands
|
|
45
|
+
const toAllTransfersAndOperands = (operands, transfers) => {
|
|
46
|
+
return [
|
|
47
|
+
...transfers.map((t) => ({ kind: TransferOperandKind.TRANSFER, value: t })),
|
|
48
|
+
...operands.map((o) => ({ kind: TransferOperandKind.OPERAND, value: o })),
|
|
49
|
+
];
|
|
50
|
+
};
|
|
51
|
+
// oneTransferOrOperand: transfers first, then operands (same as allTransfersAndOperands)
|
|
52
|
+
const toOneTransferOrOperandAt = (operands, transfers, index) => {
|
|
53
|
+
if (index >= transfers.length + operands.length) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (index < transfers.length) {
|
|
57
|
+
return { kind: TransferOperandKind.TRANSFER, value: transfers[index] };
|
|
58
|
+
}
|
|
59
|
+
return { kind: TransferOperandKind.OPERAND, value: operands[index - transfers.length] };
|
|
60
|
+
};
|
|
61
|
+
const encodeOneTransferOrOperand = (item, chainSpec) => {
|
|
62
|
+
if (item === null) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return Encoder.encodeObject(TRANSFER_OR_OPERAND, item, chainSpec);
|
|
66
|
+
};
|
|
67
|
+
const prepareAccumulateData = ({ chainSpec, operands, entropy, transfers, }) => {
|
|
68
|
+
const defaultChainSpec = tinyChainSpec;
|
|
69
|
+
const defaultEntropy = Bytes.zero(HASH_SIZE).asOpaque();
|
|
70
|
+
const defaultOperands = [];
|
|
71
|
+
const defaultTransfers = [];
|
|
72
|
+
return new AccumulateFetchExternalities(entropy ?? defaultEntropy, transfers ?? defaultTransfers, operands ?? defaultOperands, chainSpec ?? defaultChainSpec);
|
|
73
|
+
};
|
|
74
|
+
it("should return different constants for different chain specs", () => {
|
|
75
|
+
const tinyFetchExternalities = prepareAccumulateData({ chainSpec: tinyChainSpec });
|
|
76
|
+
const fullFetchExternalities = prepareAccumulateData({ chainSpec: fullChainSpec });
|
|
77
|
+
const tinyConstants = tinyFetchExternalities.constants();
|
|
78
|
+
const fullConstants = fullFetchExternalities.constants();
|
|
79
|
+
assert.notStrictEqual(tinyConstants.length, 0);
|
|
80
|
+
assert.notStrictEqual(fullConstants.length, 0);
|
|
81
|
+
assert.notDeepStrictEqual(tinyConstants, fullConstants);
|
|
82
|
+
});
|
|
83
|
+
it("should return entropy hash", () => {
|
|
84
|
+
const expectedEntropy = Bytes.fill(HASH_SIZE, 5).asOpaque();
|
|
85
|
+
const fetchExternalities = prepareAccumulateData({ entropy: expectedEntropy });
|
|
86
|
+
const entropy = fetchExternalities.entropy();
|
|
87
|
+
assert.deepStrictEqual(entropy, expectedEntropy);
|
|
88
|
+
});
|
|
89
|
+
it("should return all transfers and operands", () => {
|
|
90
|
+
const operands = prepareOperands(3);
|
|
91
|
+
const transfers = prepareTransfers(2);
|
|
92
|
+
const chainSpec = tinyChainSpec;
|
|
93
|
+
const expected = toAllTransfersAndOperands(operands, transfers);
|
|
94
|
+
const encodedExpected = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), expected, chainSpec);
|
|
95
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
96
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
97
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
98
|
+
});
|
|
99
|
+
it("should return empty encoded sequence when no transfers and no operands", () => {
|
|
100
|
+
const chainSpec = tinyChainSpec;
|
|
101
|
+
const encodedExpected = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), [], chainSpec);
|
|
102
|
+
const fetchExternalities = prepareAccumulateData({ operands: [], transfers: [], chainSpec });
|
|
103
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
104
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
105
|
+
});
|
|
106
|
+
it("should return one transfer by index (first range)", () => {
|
|
107
|
+
const operands = prepareOperands(3);
|
|
108
|
+
const transfers = prepareTransfers(2);
|
|
109
|
+
const chainSpec = tinyChainSpec;
|
|
110
|
+
const encodedExpected = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, 0), chainSpec);
|
|
111
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
112
|
+
// Transfers come first (indices 0..1), then operands (indices 2..4)
|
|
113
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(0));
|
|
114
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
115
|
+
});
|
|
116
|
+
it("should return one operand by index (second range)", () => {
|
|
117
|
+
const operands = prepareOperands(3);
|
|
118
|
+
const transfers = prepareTransfers(2);
|
|
119
|
+
const chainSpec = tinyChainSpec;
|
|
120
|
+
const encodedExpected = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, 2), chainSpec);
|
|
121
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
122
|
+
// Operands start after transfers, so index 2 is the first operand
|
|
123
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(2));
|
|
124
|
+
assert.deepStrictEqual(result, encodedExpected);
|
|
125
|
+
});
|
|
126
|
+
it("should return null when index is out of bounds", () => {
|
|
127
|
+
const operands = prepareOperands(3);
|
|
128
|
+
const transfers = prepareTransfers(2);
|
|
129
|
+
const chainSpec = tinyChainSpec;
|
|
130
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
131
|
+
// Total items: 3 operands + 2 transfers = 5, so index 5 is out of bounds
|
|
132
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(5));
|
|
133
|
+
assert.strictEqual(result, null);
|
|
134
|
+
});
|
|
135
|
+
it("should return null when index is far 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
|
+
const result = fetchExternalities.oneTransferOrOperand(tryAsU64(153));
|
|
141
|
+
assert.strictEqual(result, null);
|
|
142
|
+
});
|
|
143
|
+
it("should have consistent encoding between all and one", () => {
|
|
144
|
+
const operands = prepareOperands(2);
|
|
145
|
+
const transfers = prepareTransfers(2);
|
|
146
|
+
const chainSpec = tinyChainSpec;
|
|
147
|
+
const allItems = toAllTransfersAndOperands(operands, transfers);
|
|
148
|
+
const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
|
|
149
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers, chainSpec });
|
|
150
|
+
const all = fetchExternalities.allTransfersAndOperands();
|
|
151
|
+
assert.deepStrictEqual(all, encodedAll);
|
|
152
|
+
for (let i = 0; i < operands.length + transfers.length; i++) {
|
|
153
|
+
const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
|
|
154
|
+
const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, transfers, i), chainSpec);
|
|
155
|
+
assert.deepStrictEqual(one, encodedOne, `Mismatch at index ${i}`);
|
|
156
|
+
}
|
|
157
|
+
const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(operands.length + transfers.length));
|
|
158
|
+
assert.strictEqual(outOfRange, null);
|
|
159
|
+
});
|
|
160
|
+
it("should handle only operands without transfers", () => {
|
|
161
|
+
const operands = prepareOperands(5);
|
|
162
|
+
const chainSpec = tinyChainSpec;
|
|
163
|
+
const allItems = toAllTransfersAndOperands(operands, []);
|
|
164
|
+
const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
|
|
165
|
+
const fetchExternalities = prepareAccumulateData({ operands, transfers: [], chainSpec });
|
|
166
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
167
|
+
assert.deepStrictEqual(result, encodedAll);
|
|
168
|
+
for (let i = 0; i < operands.length; i++) {
|
|
169
|
+
const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
|
|
170
|
+
const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt(operands, [], i), chainSpec);
|
|
171
|
+
assert.deepStrictEqual(one, encodedOne, `Mismatch at operand index ${i}`);
|
|
172
|
+
}
|
|
173
|
+
const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(operands.length));
|
|
174
|
+
assert.strictEqual(outOfRange, null);
|
|
175
|
+
});
|
|
176
|
+
it("should handle only transfers without operands", () => {
|
|
177
|
+
const transfers = prepareTransfers(5);
|
|
178
|
+
const chainSpec = tinyChainSpec;
|
|
179
|
+
const allItems = toAllTransfersAndOperands([], transfers);
|
|
180
|
+
const encodedAll = Encoder.encodeObject(codec.sequenceVarLen(TRANSFER_OR_OPERAND), allItems, chainSpec);
|
|
181
|
+
const fetchExternalities = prepareAccumulateData({ operands: [], transfers, chainSpec });
|
|
182
|
+
const result = fetchExternalities.allTransfersAndOperands();
|
|
183
|
+
assert.deepStrictEqual(result, encodedAll);
|
|
184
|
+
for (let i = 0; i < transfers.length; i++) {
|
|
185
|
+
const one = fetchExternalities.oneTransferOrOperand(tryAsU64(i));
|
|
186
|
+
const encodedOne = encodeOneTransferOrOperand(toOneTransferOrOperandAt([], transfers, i), chainSpec);
|
|
187
|
+
assert.deepStrictEqual(one, encodedOne, `Mismatch at transfer index ${i}`);
|
|
188
|
+
}
|
|
189
|
+
const outOfRange = fetchExternalities.oneTransferOrOperand(tryAsU64(transfers.length));
|
|
190
|
+
assert.strictEqual(outOfRange, null);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
@@ -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 {
|
|
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
|
|
20
|
-
|
|
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":"
|
|
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,6 @@
|
|
|
1
1
|
export * from "./accumulate-externalities.js";
|
|
2
|
+
export * from "./accumulate-fetch-externalities.js";
|
|
2
3
|
export * from "./fetch-externalities.js";
|
|
4
|
+
export * from "./is-authorized-fetch-externalities.js";
|
|
5
|
+
export * from "./refine-fetch-externalities.js";
|
|
3
6
|
//# 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,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BytesBlob } from "#@typeberry/bytes";
|
|
2
|
+
import type { ChainSpec } from "#@typeberry/config";
|
|
3
|
+
import { general } from "#@typeberry/jam-host-calls";
|
|
4
|
+
import type { U64 } from "#@typeberry/numbers";
|
|
5
|
+
export declare class IsAuthorizedFetchExternalities implements general.IIsAuthorizedFetch {
|
|
6
|
+
private readonly chainSpec;
|
|
7
|
+
private readonly params;
|
|
8
|
+
readonly context = general.FetchContext.IsAuthorized;
|
|
9
|
+
constructor(chainSpec: ChainSpec, params: {
|
|
10
|
+
authToken: BytesBlob;
|
|
11
|
+
authConfiguration: BytesBlob;
|
|
12
|
+
});
|
|
13
|
+
constants(): BytesBlob;
|
|
14
|
+
workPackage(): BytesBlob;
|
|
15
|
+
authConfiguration(): BytesBlob;
|
|
16
|
+
authToken(): BytesBlob;
|
|
17
|
+
refineContext(): BytesBlob;
|
|
18
|
+
allWorkItems(): BytesBlob;
|
|
19
|
+
oneWorkItem(_workItem: U64): BytesBlob | null;
|
|
20
|
+
workItemPayload(_workItem: U64): BytesBlob | null;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=is-authorized-fetch-externalities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-authorized-fetch-externalities.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/transition/externalities/is-authorized-fetch-externalities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAG9C,qBAAa,8BAA+B,YAAW,OAAO,CAAC,kBAAkB;IAI7E,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,QAAQ,CAAC,OAAO,qCAAqC;gBAGlC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE;QACvB,SAAS,EAAE,SAAS,CAAC;QACrB,iBAAiB,EAAE,SAAS,CAAC;KAC9B;IAGH,SAAS,IAAI,SAAS;IAKtB,WAAW,IAAI,SAAS;IAIxB,iBAAiB,IAAI,SAAS;IAI9B,SAAS,IAAI,SAAS;IAKtB,aAAa,IAAI,SAAS;IAK1B,YAAY,IAAI,SAAS;IAKzB,WAAW,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IAK7C,eAAe,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;CAGlD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BytesBlob } from "#@typeberry/bytes";
|
|
2
|
+
import { general } from "#@typeberry/jam-host-calls";
|
|
3
|
+
import { getEncodedConstants } from "./fetch-externalities.js";
|
|
4
|
+
export class IsAuthorizedFetchExternalities {
|
|
5
|
+
chainSpec;
|
|
6
|
+
params;
|
|
7
|
+
context = general.FetchContext.IsAuthorized;
|
|
8
|
+
constructor(chainSpec, params) {
|
|
9
|
+
this.chainSpec = chainSpec;
|
|
10
|
+
this.params = params;
|
|
11
|
+
}
|
|
12
|
+
constants() {
|
|
13
|
+
return getEncodedConstants(this.chainSpec);
|
|
14
|
+
}
|
|
15
|
+
// TODO [ToDr] Return encoded work package E(p)
|
|
16
|
+
workPackage() {
|
|
17
|
+
return BytesBlob.empty();
|
|
18
|
+
}
|
|
19
|
+
authConfiguration() {
|
|
20
|
+
return this.params.authConfiguration;
|
|
21
|
+
}
|
|
22
|
+
authToken() {
|
|
23
|
+
return this.params.authToken;
|
|
24
|
+
}
|
|
25
|
+
// TODO [ToDr] Return encoded refinement context
|
|
26
|
+
refineContext() {
|
|
27
|
+
return BytesBlob.empty();
|
|
28
|
+
}
|
|
29
|
+
// TODO [ToDr] Return encoded work items
|
|
30
|
+
allWorkItems() {
|
|
31
|
+
return BytesBlob.empty();
|
|
32
|
+
}
|
|
33
|
+
// TODO [ToDr] Return single work item summary
|
|
34
|
+
oneWorkItem(_workItem) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// TODO [ToDr] Return work item payload
|
|
38
|
+
workItemPayload(_workItem) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|