@typeberry/lib 0.5.3 → 0.5.4
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 +8 -4
- package/packages/core/hash/hash.d.ts.map +1 -1
- package/packages/core/hash/hash.js +1 -0
- package/packages/core/networking/certificate.d.ts.map +1 -1
- package/packages/core/networking/certificate.js +1 -0
- package/packages/core/networking/package.json +1 -1
- package/packages/core/networking/setup.d.ts.map +1 -1
- package/packages/core/networking/setup.js +16 -12
- package/packages/core/numbers/index.d.ts +4 -0
- package/packages/core/numbers/index.d.ts.map +1 -1
- package/packages/core/numbers/index.js +4 -4
- package/packages/core/pvm-host-calls/host-calls-executor.d.ts +23 -17
- package/packages/core/pvm-host-calls/host-calls-executor.d.ts.map +1 -1
- package/packages/core/pvm-host-calls/host-calls-executor.js +23 -31
- package/packages/core/pvm-interpreter/ops/math-consts.d.ts +2 -3
- package/packages/core/pvm-interpreter/ops/math-consts.d.ts.map +1 -1
- package/packages/core/pvm-interpreter/ops/math-consts.js +2 -3
- package/packages/core/pvm-interpreter/ops/math-ops.js +3 -3
- package/packages/core/pvm-interpreter/ops/math-utils.js +13 -13
- package/packages/core/pvm-interpreter/ops/math-utils.test.js +17 -16
- package/packages/core/telemetry/package.json +1 -1
- package/packages/extensions/ipc/jamnp/handler.d.ts +5 -4
- package/packages/extensions/ipc/jamnp/handler.d.ts.map +1 -1
- package/packages/extensions/ipc/jamnp/handler.js +59 -34
- package/packages/extensions/ipc/jamnp/stream.d.ts +6 -4
- package/packages/extensions/ipc/jamnp/stream.d.ts.map +1 -1
- package/packages/jam/block/work-item.d.ts +13 -4
- package/packages/jam/block/work-item.d.ts.map +1 -1
- package/packages/jam/block/work-package.d.ts +3 -1
- package/packages/jam/block/work-package.d.ts.map +1 -1
- package/packages/jam/block/work-package.js +6 -2
- package/packages/jam/block/work-result.d.ts +3 -5
- package/packages/jam/block/work-result.d.ts.map +1 -1
- package/packages/jam/block/work-result.js +6 -0
- package/packages/jam/block-json/block.d.ts +125 -0
- package/packages/jam/block-json/block.d.ts.map +1 -1
- package/packages/jam/block-json/block.js +9 -2
- package/packages/jam/block-json/work-result.d.ts.map +1 -1
- package/packages/jam/block-json/work-result.js +6 -6
- package/packages/jam/database-lmdb/states.test.js +4 -3
- package/packages/jam/executor/index.d.ts +4 -0
- package/packages/jam/executor/index.d.ts.map +1 -0
- package/packages/jam/executor/index.js +2 -0
- package/packages/jam/{transition/accumulate → executor}/pvm-executor.d.ts +19 -16
- package/packages/jam/executor/pvm-executor.d.ts.map +1 -0
- package/packages/jam/{transition/accumulate → executor}/pvm-executor.js +46 -3
- package/packages/jam/fuzz-proto/v1/handler.d.ts +1 -1
- package/packages/jam/fuzz-proto/v1/handler.d.ts.map +1 -1
- package/packages/jam/fuzz-proto/v1/handler.js +43 -19
- package/packages/jam/in-core/externalities/refine.d.ts +24 -0
- package/packages/jam/in-core/externalities/refine.d.ts.map +1 -0
- package/packages/jam/in-core/externalities/refine.js +36 -0
- package/packages/jam/in-core/in-core.d.ts +60 -0
- package/packages/jam/in-core/in-core.d.ts.map +1 -0
- package/packages/jam/in-core/in-core.js +294 -0
- package/packages/jam/in-core/in-core.test.d.ts +2 -0
- package/packages/jam/in-core/in-core.test.d.ts.map +1 -0
- package/packages/jam/in-core/in-core.test.js +81 -0
- package/packages/jam/in-core/index.d.ts +2 -0
- package/packages/jam/in-core/index.d.ts.map +1 -0
- package/packages/jam/in-core/index.js +1 -0
- package/packages/jam/jam-host-calls/accumulate/bless.test.js +4 -5
- package/packages/jam/jamnp-s/peers.d.ts.map +1 -1
- package/packages/jam/jamnp-s/peers.js +10 -0
- package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts +1 -1
- package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-128-block-request.js +10 -8
- package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-129-state-request.js +11 -9
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +3 -3
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +2 -2
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +5 -5
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.js +2 -2
- package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.js +8 -6
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts +3 -3
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.js +2 -2
- package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.test.js +2 -2
- package/packages/jam/jamnp-s/protocol/stream.d.ts +13 -7
- package/packages/jam/jamnp-s/protocol/stream.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/stream.js +5 -4
- package/packages/jam/jamnp-s/protocol/test-utils.d.ts +1 -1
- package/packages/jam/jamnp-s/protocol/test-utils.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/test-utils.js +9 -12
- package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts +1 -1
- package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts.map +1 -1
- package/packages/jam/jamnp-s/protocol/up-0-block-announcement.js +1 -1
- package/packages/jam/jamnp-s/stream-manager.d.ts.map +1 -1
- package/packages/jam/jamnp-s/stream-manager.js +7 -5
- package/packages/jam/jamnp-s/stream-manager.test.js +8 -5
- package/packages/jam/jamnp-s/tasks/sync.js +1 -1
- package/packages/jam/node/jam-config.d.ts +4 -1
- package/packages/jam/node/jam-config.d.ts.map +1 -1
- package/packages/jam/node/jam-config.js +6 -2
- package/packages/jam/node/main.d.ts.map +1 -1
- package/packages/jam/node/main.js +5 -4
- package/packages/jam/node/package.json +1 -1
- package/packages/jam/rpc-validation/types.d.ts +7 -3
- package/packages/jam/rpc-validation/types.d.ts.map +1 -1
- package/packages/jam/rpc-validation/validation.d.ts +254 -36
- package/packages/jam/rpc-validation/validation.d.ts.map +1 -1
- package/packages/jam/rpc-validation/validation.js +20 -2
- package/packages/jam/state/in-memory-state.d.ts.map +1 -1
- package/packages/jam/state/in-memory-state.js +2 -3
- package/packages/jam/state/test.utils.d.ts.map +1 -1
- package/packages/jam/state/test.utils.js +2 -3
- package/packages/jam/state-vectors/index.d.ts +377 -5
- package/packages/jam/state-vectors/index.d.ts.map +1 -1
- package/packages/jam/state-vectors/index.js +3 -3
- package/packages/jam/transition/accumulate/accumulate-data.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulate-data.js +1 -2
- package/packages/jam/transition/accumulate/accumulate-queue.test.js +2 -2
- package/packages/jam/transition/accumulate/accumulate-utils.test.js +2 -2
- package/packages/jam/transition/accumulate/accumulate.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulate.js +8 -13
- package/packages/jam/transition/accumulate/accumulate.test.js +2 -2
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +1 -2
- package/packages/jam/transition/accumulate/accumulation-result-merge-utils.test.js +1 -2
- package/packages/jam/transition/accumulate/deferred-transfers.d.ts +1 -1
- package/packages/jam/transition/accumulate/deferred-transfers.d.ts.map +1 -1
- package/packages/jam/transition/accumulate/deferred-transfers.js +6 -7
- package/packages/jam/transition/disputes/disputes.test.data2.js +2 -2
- package/packages/jam/transition/externalities/fetch-externalities.d.ts +7 -1
- package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
- package/packages/jam/transition/externalities/fetch-externalities.js +4 -0
- package/packages/jam/transition/externalities/fetch-externalities.test.js +2 -2
- package/packages/jam/transition/hasher.test.js +2 -2
- package/packages/jam/transition/reports/error.d.ts +3 -1
- package/packages/jam/transition/reports/error.d.ts.map +1 -1
- package/packages/jam/transition/reports/error.js +2 -0
- package/packages/jam/transition/reports/test.utils.d.ts.map +1 -1
- package/packages/jam/transition/reports/test.utils.js +2 -2
- package/packages/jam/transition/reports/verify-basic.d.ts.map +1 -1
- package/packages/jam/transition/reports/verify-basic.js +10 -0
- package/packages/jam/transition/reports/verify-basic.test.js +29 -0
- package/packages/workers/block-authorship/main.d.ts.map +1 -1
- package/packages/workers/block-authorship/main.js +23 -4
- package/packages/workers/block-authorship/package.json +1 -1
- package/packages/workers/block-authorship/protocol.d.ts +3 -1
- package/packages/workers/block-authorship/protocol.d.ts.map +1 -1
- package/packages/workers/block-authorship/protocol.js +6 -3
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +0 -1
- package/packages/workers/importer/package.json +1 -1
- package/packages/jam/transition/accumulate/pvm-executor.d.ts.map +0 -1
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { tryAsCoreIndex, tryAsServiceGas, } from "#@typeberry/block";
|
|
2
|
+
import { W_C } from "#@typeberry/block/gp-constants.js";
|
|
3
|
+
import { WorkPackageInfo, } from "#@typeberry/block/refine-context.js";
|
|
4
|
+
import { WorkPackageSpec, WorkReport } from "#@typeberry/block/work-report.js";
|
|
5
|
+
import { WorkExecResult, WorkExecResultKind, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
|
|
6
|
+
import { Bytes, BytesBlob } from "#@typeberry/bytes";
|
|
7
|
+
import { codec, Encoder } from "#@typeberry/codec";
|
|
8
|
+
import { asKnownSize, FixedSizeArray } from "#@typeberry/collections";
|
|
9
|
+
import { PvmExecutor, ReturnStatus } from "#@typeberry/executor";
|
|
10
|
+
import { HASH_SIZE } from "#@typeberry/hash";
|
|
11
|
+
import { Logger } from "#@typeberry/logger";
|
|
12
|
+
import { tryAsU8, tryAsU16, tryAsU32 } from "#@typeberry/numbers";
|
|
13
|
+
import { FetchExternalities } from "#@typeberry/transition/externalities/fetch-externalities.js";
|
|
14
|
+
import { assertEmpty, assertNever, Result } from "#@typeberry/utils";
|
|
15
|
+
import { RefineExternalitiesImpl } from "./externalities/refine.js";
|
|
16
|
+
export var RefineError;
|
|
17
|
+
(function (RefineError) {
|
|
18
|
+
/** State for context anchor block or lookup anchor is not found in the DB. */
|
|
19
|
+
RefineError[RefineError["StateMissing"] = 0] = "StateMissing";
|
|
20
|
+
/** Posterior state root of context anchor block does not match the one in the DB. */
|
|
21
|
+
RefineError[RefineError["StateRootMismatch"] = 1] = "StateRootMismatch";
|
|
22
|
+
/** Lookup anchor state-slot does not match the one given in context. */
|
|
23
|
+
RefineError[RefineError["InvalidLookupAnchorSlot"] = 2] = "InvalidLookupAnchorSlot";
|
|
24
|
+
/** Authorization error. */
|
|
25
|
+
RefineError[RefineError["AuthorizationError"] = 3] = "AuthorizationError";
|
|
26
|
+
})(RefineError || (RefineError = {}));
|
|
27
|
+
var ServiceCodeError;
|
|
28
|
+
(function (ServiceCodeError) {
|
|
29
|
+
/** Service id is not found in the state. */
|
|
30
|
+
ServiceCodeError[ServiceCodeError["ServiceNotFound"] = 0] = "ServiceNotFound";
|
|
31
|
+
/** Expected service code does not match the state one. */
|
|
32
|
+
ServiceCodeError[ServiceCodeError["ServiceCodeMismatch"] = 1] = "ServiceCodeMismatch";
|
|
33
|
+
/** Code preimage missing. */
|
|
34
|
+
ServiceCodeError[ServiceCodeError["ServiceCodeMissing"] = 2] = "ServiceCodeMissing";
|
|
35
|
+
/** Code blob is too big. */
|
|
36
|
+
ServiceCodeError[ServiceCodeError["ServiceCodeTooBig"] = 3] = "ServiceCodeTooBig";
|
|
37
|
+
})(ServiceCodeError || (ServiceCodeError = {}));
|
|
38
|
+
var AuthorizationError;
|
|
39
|
+
(function (AuthorizationError) {
|
|
40
|
+
})(AuthorizationError || (AuthorizationError = {}));
|
|
41
|
+
const logger = Logger.new(import.meta.filename, "refine");
|
|
42
|
+
/** https://graypaper.fluffylabs.dev/#/ab2cdbd/2ffe002ffe00?v=0.7.2 */
|
|
43
|
+
const ARGS_CODEC = codec.object({
|
|
44
|
+
core: codec.varU32.convert((x) => tryAsU32(x), (x) => tryAsCoreIndex(x)),
|
|
45
|
+
workItemIndex: codec.varU32,
|
|
46
|
+
serviceId: codec.varU32.asOpaque(),
|
|
47
|
+
payloadLength: codec.varU32,
|
|
48
|
+
packageHash: codec.bytes(HASH_SIZE).asOpaque(),
|
|
49
|
+
});
|
|
50
|
+
export class InCore {
|
|
51
|
+
chainSpec;
|
|
52
|
+
states;
|
|
53
|
+
pvmBackend;
|
|
54
|
+
blake2b;
|
|
55
|
+
constructor(chainSpec, states, pvmBackend, blake2b) {
|
|
56
|
+
this.chainSpec = chainSpec;
|
|
57
|
+
this.states = states;
|
|
58
|
+
this.pvmBackend = pvmBackend;
|
|
59
|
+
this.blake2b = blake2b;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Work-report computation function.
|
|
63
|
+
*
|
|
64
|
+
* Note this requires all of the imports and extrinsics to be already fetched
|
|
65
|
+
* and only performs the refinement.
|
|
66
|
+
*
|
|
67
|
+
* Any validation must be done externally!
|
|
68
|
+
*
|
|
69
|
+
* https://graypaper.fluffylabs.dev/#/ab2cdbd/1b7f021b7f02?v=0.7.2
|
|
70
|
+
*/
|
|
71
|
+
async refine(workPackageAndHash, core, imports, extrinsics) {
|
|
72
|
+
const workPackageHash = workPackageAndHash.hash;
|
|
73
|
+
const { context, authorization, authCodeHash, authCodeHost, parametrization, items, ...rest } = workPackageAndHash.data;
|
|
74
|
+
assertEmpty(rest);
|
|
75
|
+
// TODO [ToDr] Verify BEEFY root
|
|
76
|
+
// TODO [ToDr] Verify prerequisites
|
|
77
|
+
logger.log `[core:${core}] Attempting to refine work package with ${items.length} items.`;
|
|
78
|
+
// TODO [ToDr] GP link
|
|
79
|
+
// Verify anchor block
|
|
80
|
+
const state = this.states.getState(context.anchor);
|
|
81
|
+
if (state === null) {
|
|
82
|
+
return Result.error(RefineError.StateMissing, () => `State at anchor block ${context.anchor} is missing.`);
|
|
83
|
+
}
|
|
84
|
+
const stateRoot = await this.states.getStateRoot(state);
|
|
85
|
+
if (!stateRoot.isEqualTo(context.stateRoot)) {
|
|
86
|
+
return Result.error(RefineError.StateRootMismatch, () => `State at ${context.anchor} does not match expected root hash. Ours: ${stateRoot}, expected: ${context.stateRoot}`);
|
|
87
|
+
}
|
|
88
|
+
// TODO [ToDr] GP link
|
|
89
|
+
// Verify lookup anchor state
|
|
90
|
+
const lookupState = this.states.getState(context.lookupAnchor);
|
|
91
|
+
if (lookupState === null) {
|
|
92
|
+
return Result.error(RefineError.StateMissing, () => `Lookup state at block ${context.lookupAnchor} is missing.`);
|
|
93
|
+
}
|
|
94
|
+
// TODO [ToDr] GP link
|
|
95
|
+
if (lookupState.timeslot !== context.lookupAnchorSlot) {
|
|
96
|
+
return Result.error(RefineError.InvalidLookupAnchorSlot, () => `Lookup anchor slot does not match the one is state. Ours: ${lookupState.timeslot}, expected: ${context.lookupAnchorSlot}`);
|
|
97
|
+
}
|
|
98
|
+
// Check authorization
|
|
99
|
+
const authResult = await this.authorizePackage(authorization, authCodeHost, authCodeHash, parametrization);
|
|
100
|
+
if (authResult.isError) {
|
|
101
|
+
return Result.error(RefineError.AuthorizationError, () => `Authorization error: ${AuthorizationError[authResult.error]}: ${authResult.details()}.`);
|
|
102
|
+
}
|
|
103
|
+
logger.log `[core:${core}] Authorized. Proceeding with work items verification. Anchor=${context.anchor}`;
|
|
104
|
+
// Verify the work items
|
|
105
|
+
const refineResults = [];
|
|
106
|
+
for (const [idx, item] of items.entries()) {
|
|
107
|
+
logger.info `[core:${core}][i:${idx}] Refining item for service ${item.service}.`;
|
|
108
|
+
refineResults.push(await this.refineItem(state, idx, item, imports, extrinsics, core, workPackageHash));
|
|
109
|
+
}
|
|
110
|
+
// amalgamate the work report now
|
|
111
|
+
return Result.ok(this.amalgamateWorkReport(asKnownSize(refineResults), authResult.ok, workPackageHash, context, core));
|
|
112
|
+
}
|
|
113
|
+
amalgamateWorkReport(refineResults, authResult, workPackageHash, context, coreIndex) {
|
|
114
|
+
// unzip exports and work results for each work item
|
|
115
|
+
const exports = refineResults.map((x) => x.exports);
|
|
116
|
+
const results = refineResults.map((x) => x.result);
|
|
117
|
+
const { authorizerHash, authorizationGasUsed, authorizationOutput, ...authRest } = authResult;
|
|
118
|
+
assertEmpty(authRest);
|
|
119
|
+
// TODO [ToDr] Compute erasure root
|
|
120
|
+
const erasureRoot = Bytes.zero(HASH_SIZE);
|
|
121
|
+
// TODO [ToDr] Compute exports root
|
|
122
|
+
const exportsRoot = Bytes.zero(HASH_SIZE).asOpaque();
|
|
123
|
+
const exportsCount = exports.reduce((acc, x) => acc + x.length, 0);
|
|
124
|
+
// TODO [ToDr] Segment root lookup computation?
|
|
125
|
+
const segmentRootLookup = [
|
|
126
|
+
WorkPackageInfo.create({
|
|
127
|
+
workPackageHash,
|
|
128
|
+
segmentTreeRoot: exportsRoot,
|
|
129
|
+
}),
|
|
130
|
+
];
|
|
131
|
+
// TODO [ToDr] Auditable work bundle length?
|
|
132
|
+
const workBundleLength = tryAsU32(0);
|
|
133
|
+
return {
|
|
134
|
+
report: WorkReport.create({
|
|
135
|
+
workPackageSpec: WorkPackageSpec.create({
|
|
136
|
+
length: workBundleLength,
|
|
137
|
+
hash: workPackageHash,
|
|
138
|
+
erasureRoot,
|
|
139
|
+
exportsRoot,
|
|
140
|
+
// safe to convert, since we have limit on number of
|
|
141
|
+
// exports per item and a limit for number of items
|
|
142
|
+
exportsCount: tryAsU16(exportsCount),
|
|
143
|
+
}),
|
|
144
|
+
context,
|
|
145
|
+
coreIndex,
|
|
146
|
+
authorizerHash,
|
|
147
|
+
authorizationGasUsed,
|
|
148
|
+
authorizationOutput,
|
|
149
|
+
segmentRootLookup,
|
|
150
|
+
// safe to convert, since we know that number of work items is limited
|
|
151
|
+
results: FixedSizeArray.new(results, tryAsU8(refineResults.length)),
|
|
152
|
+
}),
|
|
153
|
+
exports: asKnownSize(exports),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async authorizePackage(_authorization, _authCodeHost, _authCodeHash, _parametrization) {
|
|
157
|
+
// TODO [ToDr] Check authorization?
|
|
158
|
+
const authorizerHash = Bytes.zero(HASH_SIZE).asOpaque();
|
|
159
|
+
const authorizationGasUsed = tryAsServiceGas(0);
|
|
160
|
+
const authorizationOutput = BytesBlob.empty();
|
|
161
|
+
return Result.ok({
|
|
162
|
+
authorizerHash,
|
|
163
|
+
authorizationGasUsed,
|
|
164
|
+
authorizationOutput,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
async refineItem(state, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash) {
|
|
168
|
+
const payloadHash = this.blake2b.hashBytes(item.payload);
|
|
169
|
+
const baseResult = {
|
|
170
|
+
serviceId: item.service,
|
|
171
|
+
codeHash: item.codeHash,
|
|
172
|
+
payloadHash,
|
|
173
|
+
gas: item.refineGasLimit,
|
|
174
|
+
};
|
|
175
|
+
const imports = allImports[idx];
|
|
176
|
+
const extrinsics = allExtrinsics[idx];
|
|
177
|
+
const baseLoad = {
|
|
178
|
+
importedSegments: tryAsU32(imports.length),
|
|
179
|
+
extrinsicCount: tryAsU32(extrinsics.length),
|
|
180
|
+
extrinsicSize: tryAsU32(extrinsics.reduce((acc, x) => acc + x.length, 0)),
|
|
181
|
+
};
|
|
182
|
+
const maybeCode = this.getServiceCode(state, idx, item);
|
|
183
|
+
if (maybeCode.isError) {
|
|
184
|
+
const error = maybeCode.error === ServiceCodeError.ServiceCodeTooBig
|
|
185
|
+
? WorkExecResultKind.codeOversize
|
|
186
|
+
: WorkExecResultKind.badCode;
|
|
187
|
+
return {
|
|
188
|
+
exports: [],
|
|
189
|
+
result: WorkResult.create({
|
|
190
|
+
...baseResult,
|
|
191
|
+
result: WorkExecResult.error(error),
|
|
192
|
+
load: WorkRefineLoad.create({
|
|
193
|
+
...baseLoad,
|
|
194
|
+
gasUsed: tryAsServiceGas(item.refineGasLimit),
|
|
195
|
+
exportedSegments: tryAsU32(0),
|
|
196
|
+
}),
|
|
197
|
+
}),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const code = maybeCode.ok;
|
|
201
|
+
const externalities = this.createRefineExternalities({
|
|
202
|
+
payload: item.payload,
|
|
203
|
+
imports: allImports,
|
|
204
|
+
extrinsics: allExtrinsics,
|
|
205
|
+
});
|
|
206
|
+
const executor = await PvmExecutor.createRefineExecutor(item.service, code, externalities, this.pvmBackend);
|
|
207
|
+
const args = Encoder.encodeObject(ARGS_CODEC, {
|
|
208
|
+
serviceId: item.service,
|
|
209
|
+
core: coreIndex,
|
|
210
|
+
workItemIndex: tryAsU32(idx),
|
|
211
|
+
payloadLength: tryAsU32(item.payload.length),
|
|
212
|
+
packageHash: workPackageHash,
|
|
213
|
+
});
|
|
214
|
+
const execResult = await executor.run(args, item.refineGasLimit);
|
|
215
|
+
// TODO [ToDr] get exports from externalities
|
|
216
|
+
const exports = [];
|
|
217
|
+
if (exports.length !== item.exportCount) {
|
|
218
|
+
return {
|
|
219
|
+
exports,
|
|
220
|
+
result: WorkResult.create({
|
|
221
|
+
...baseResult,
|
|
222
|
+
result: WorkExecResult.error(WorkExecResultKind.incorrectNumberOfExports),
|
|
223
|
+
load: WorkRefineLoad.create({
|
|
224
|
+
...baseLoad,
|
|
225
|
+
gasUsed: tryAsServiceGas(item.refineGasLimit),
|
|
226
|
+
exportedSegments: tryAsU32(0),
|
|
227
|
+
}),
|
|
228
|
+
}),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const result = this.extractWorkResult(execResult);
|
|
232
|
+
return {
|
|
233
|
+
exports,
|
|
234
|
+
result: WorkResult.create({
|
|
235
|
+
...baseResult,
|
|
236
|
+
result,
|
|
237
|
+
load: WorkRefineLoad.create({
|
|
238
|
+
...baseLoad,
|
|
239
|
+
gasUsed: tryAsServiceGas(execResult.consumedGas),
|
|
240
|
+
exportedSegments: tryAsU32(exports.length),
|
|
241
|
+
}),
|
|
242
|
+
}),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
extractWorkResult(execResult) {
|
|
246
|
+
if (execResult.status === ReturnStatus.OK) {
|
|
247
|
+
const slice = execResult.memorySlice;
|
|
248
|
+
// TODO [ToDr] Verify the output size and change digestTooBig?
|
|
249
|
+
return WorkExecResult.ok(BytesBlob.blobFrom(slice));
|
|
250
|
+
}
|
|
251
|
+
switch (execResult.status) {
|
|
252
|
+
case ReturnStatus.OOG:
|
|
253
|
+
return WorkExecResult.error(WorkExecResultKind.outOfGas);
|
|
254
|
+
case ReturnStatus.PANIC:
|
|
255
|
+
return WorkExecResult.error(WorkExecResultKind.panic);
|
|
256
|
+
default:
|
|
257
|
+
assertNever(execResult);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
getServiceCode(state, idx, item) {
|
|
261
|
+
const serviceId = item.service;
|
|
262
|
+
const service = state.getService(serviceId);
|
|
263
|
+
// TODO [ToDr] GP link
|
|
264
|
+
// missing service
|
|
265
|
+
if (service === null) {
|
|
266
|
+
return Result.error(ServiceCodeError.ServiceNotFound, () => `[i:${idx}] Service ${serviceId} is missing in state.`);
|
|
267
|
+
}
|
|
268
|
+
// TODO [ToDr] GP link
|
|
269
|
+
// TODO [ToDr] shall we rather use the old codehash instead
|
|
270
|
+
if (!service.getInfo().codeHash.isEqualTo(item.codeHash)) {
|
|
271
|
+
return Result.error(ServiceCodeError.ServiceCodeMismatch, () => `[i:${idx}] Service ${serviceId} has invalid code hash. Ours: ${service.getInfo().codeHash}, expected: ${item.codeHash}`);
|
|
272
|
+
}
|
|
273
|
+
const code = service.getPreimage(item.codeHash.asOpaque());
|
|
274
|
+
if (code === null) {
|
|
275
|
+
return Result.error(ServiceCodeError.ServiceCodeMissing, () => `[i:${idx}] Code ${item.codeHash} for service ${serviceId} was not found.`);
|
|
276
|
+
}
|
|
277
|
+
if (code.length > W_C) {
|
|
278
|
+
return Result.error(ServiceCodeError.ServiceCodeTooBig, () => `[i:${idx}] Code ${item.codeHash} for service ${serviceId} is too big! ${code.length} bytes vs ${W_C} bytes max.`);
|
|
279
|
+
}
|
|
280
|
+
return Result.ok(code);
|
|
281
|
+
}
|
|
282
|
+
createRefineExternalities(args) {
|
|
283
|
+
// TODO [ToDr] Pass all required fetch data
|
|
284
|
+
const fetchExternalities = FetchExternalities.createForRefine({
|
|
285
|
+
entropy: undefined,
|
|
286
|
+
...args,
|
|
287
|
+
}, this.chainSpec);
|
|
288
|
+
const refine = RefineExternalitiesImpl.create();
|
|
289
|
+
return {
|
|
290
|
+
fetchExternalities,
|
|
291
|
+
refine,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-core.test.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/in-core.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { before, describe, it } from "node:test";
|
|
3
|
+
import { tryAsCoreIndex, tryAsServiceGas, tryAsServiceId, tryAsTimeSlot } from "#@typeberry/block";
|
|
4
|
+
import { RefineContext } from "#@typeberry/block/refine-context.js";
|
|
5
|
+
import { WorkItem } from "#@typeberry/block/work-item.js";
|
|
6
|
+
import { tryAsWorkItemsCount, WorkPackage } from "#@typeberry/block/work-package.js";
|
|
7
|
+
import { Bytes, BytesBlob } from "#@typeberry/bytes";
|
|
8
|
+
import { Encoder } from "#@typeberry/codec";
|
|
9
|
+
import { asKnownSize, FixedSizeArray } from "#@typeberry/collections";
|
|
10
|
+
import { PvmBackend, tinyChainSpec } from "#@typeberry/config";
|
|
11
|
+
import { InMemoryStates } from "#@typeberry/database";
|
|
12
|
+
import { Blake2b, HASH_SIZE, WithHash } from "#@typeberry/hash";
|
|
13
|
+
import { tryAsU16 } from "#@typeberry/numbers";
|
|
14
|
+
import { testState } from "#@typeberry/state/test.utils.js";
|
|
15
|
+
import { InCore, RefineError } from "./in-core.js";
|
|
16
|
+
let blake2b;
|
|
17
|
+
before(async () => {
|
|
18
|
+
blake2b = await Blake2b.createHasher();
|
|
19
|
+
});
|
|
20
|
+
function createWorkItem(serviceId = 1) {
|
|
21
|
+
return WorkItem.create({
|
|
22
|
+
service: tryAsServiceId(serviceId),
|
|
23
|
+
codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
24
|
+
payload: BytesBlob.empty(),
|
|
25
|
+
refineGasLimit: tryAsServiceGas(1_000_000),
|
|
26
|
+
accumulateGasLimit: tryAsServiceGas(1_000_000),
|
|
27
|
+
importSegments: asKnownSize([]),
|
|
28
|
+
extrinsic: [],
|
|
29
|
+
exportCount: tryAsU16(0),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function createWorkPackage(anchorHash, stateRoot, lookupAnchorSlot = 0) {
|
|
33
|
+
return WorkPackage.create({
|
|
34
|
+
authorization: BytesBlob.empty(),
|
|
35
|
+
authCodeHost: tryAsServiceId(1),
|
|
36
|
+
authCodeHash: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
37
|
+
parametrization: BytesBlob.empty(),
|
|
38
|
+
context: RefineContext.create({
|
|
39
|
+
anchor: anchorHash,
|
|
40
|
+
stateRoot,
|
|
41
|
+
beefyRoot: Bytes.zero(HASH_SIZE).asOpaque(),
|
|
42
|
+
lookupAnchor: anchorHash,
|
|
43
|
+
lookupAnchorSlot: tryAsTimeSlot(lookupAnchorSlot),
|
|
44
|
+
prerequisites: [],
|
|
45
|
+
}),
|
|
46
|
+
items: FixedSizeArray.new([createWorkItem()], tryAsWorkItemsCount(1)),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function hashWorkPackage(spec, workPackage) {
|
|
50
|
+
const workPackageHash = blake2b
|
|
51
|
+
.hashBytes(Encoder.encodeObject(WorkPackage.Codec, workPackage, spec))
|
|
52
|
+
.asOpaque();
|
|
53
|
+
return new WithHash(workPackageHash, workPackage);
|
|
54
|
+
}
|
|
55
|
+
describe("InCore", () => {
|
|
56
|
+
it("should return StateMissing error when anchor block state is not in DB", async () => {
|
|
57
|
+
const spec = tinyChainSpec;
|
|
58
|
+
const states = new InMemoryStates(spec);
|
|
59
|
+
const inCore = new InCore(spec, states, PvmBackend.BuiltIn, blake2b);
|
|
60
|
+
const anchorHash = Bytes.fill(HASH_SIZE, 1).asOpaque();
|
|
61
|
+
const stateRoot = Bytes.zero(HASH_SIZE).asOpaque();
|
|
62
|
+
const workPackage = createWorkPackage(anchorHash, stateRoot);
|
|
63
|
+
const result = await inCore.refine(hashWorkPackage(spec, workPackage), tryAsCoreIndex(0), asKnownSize([[]]), asKnownSize([[]]));
|
|
64
|
+
assert.strictEqual(result.isError, true);
|
|
65
|
+
assert.strictEqual(result.error, RefineError.StateMissing);
|
|
66
|
+
});
|
|
67
|
+
it("should refine work package and produce a report when state is set up", async () => {
|
|
68
|
+
const spec = tinyChainSpec;
|
|
69
|
+
const states = new InMemoryStates(spec);
|
|
70
|
+
const inCore = new InCore(spec, states, PvmBackend.BuiltIn, blake2b);
|
|
71
|
+
const anchorHash = Bytes.fill(HASH_SIZE, 1).asOpaque();
|
|
72
|
+
const state = testState();
|
|
73
|
+
await states.insertInitialState(anchorHash, state);
|
|
74
|
+
const correctStateRoot = await states.getStateRoot(state);
|
|
75
|
+
const workPackage = createWorkPackage(anchorHash, correctStateRoot, state.timeslot);
|
|
76
|
+
const result = await inCore.refine(hashWorkPackage(spec, workPackage), tryAsCoreIndex(0), asKnownSize([[]]), asKnownSize([[]]));
|
|
77
|
+
assert.strictEqual(result.isOk, true);
|
|
78
|
+
assert.strictEqual(result.ok.report.coreIndex, 0);
|
|
79
|
+
assert.strictEqual(result.ok.report.results.length, 1);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./in-core.js";
|
|
@@ -3,14 +3,13 @@ import { describe, it } from "node:test";
|
|
|
3
3
|
import { tryAsServiceGas, tryAsServiceId } from "#@typeberry/block";
|
|
4
4
|
import { codec, Encoder } from "#@typeberry/codec";
|
|
5
5
|
import { tinyChainSpec } from "#@typeberry/config";
|
|
6
|
-
import { tryAsU64 } from "#@typeberry/numbers";
|
|
6
|
+
import { MAX_VALUE_U32, MAX_VALUE_U64, tryAsU64 } from "#@typeberry/numbers";
|
|
7
7
|
import { HostCallMemory, HostCallRegisters, PvmExecution } from "#@typeberry/pvm-host-calls";
|
|
8
8
|
import { tryAsGas } from "#@typeberry/pvm-interface";
|
|
9
9
|
import { gasCounter } from "#@typeberry/pvm-interpreter/gas.js";
|
|
10
10
|
import { MemoryBuilder, tryAsMemoryIndex } from "#@typeberry/pvm-interpreter/memory/index.js";
|
|
11
11
|
import { PAGE_SIZE } from "#@typeberry/pvm-interpreter/memory/memory-consts.js";
|
|
12
12
|
import { tryAsSbrkIndex } from "#@typeberry/pvm-interpreter/memory/memory-index.js";
|
|
13
|
-
import { MAX_VALUE, MAX_VALUE_U64 } from "#@typeberry/pvm-interpreter/ops/math-consts.js";
|
|
14
13
|
import { codecPerCore, tryAsPerCore } from "#@typeberry/state";
|
|
15
14
|
import { Compatibility, deepEqual, GpVersion, Result } from "#@typeberry/utils";
|
|
16
15
|
import { UpdatePrivilegesError } from "../externalities/partial-state.js";
|
|
@@ -99,7 +98,7 @@ describe("HostCalls: Bless", () => {
|
|
|
99
98
|
tryAsServiceId(5),
|
|
100
99
|
tryAsPerCore([tryAsServiceId(10), tryAsServiceId(15)], tinyChainSpec),
|
|
101
100
|
tryAsServiceId(20),
|
|
102
|
-
tryAsServiceId(
|
|
101
|
+
tryAsServiceId(MAX_VALUE_U32),
|
|
103
102
|
new Map(entries),
|
|
104
103
|
],
|
|
105
104
|
]);
|
|
@@ -161,7 +160,7 @@ describe("HostCalls: Bless", () => {
|
|
|
161
160
|
tryAsServiceId(5),
|
|
162
161
|
tryAsPerCore([tryAsServiceId(10), tryAsServiceId(15)], tinyChainSpec),
|
|
163
162
|
tryAsServiceId(20),
|
|
164
|
-
tryAsServiceId(
|
|
163
|
+
tryAsServiceId(MAX_VALUE_U32),
|
|
165
164
|
new Map(entries),
|
|
166
165
|
],
|
|
167
166
|
]);
|
|
@@ -197,7 +196,7 @@ describe("HostCalls: Bless", () => {
|
|
|
197
196
|
tryAsServiceId(5),
|
|
198
197
|
tryAsPerCore([tryAsServiceId(10), tryAsServiceId(15)], tinyChainSpec),
|
|
199
198
|
tryAsServiceId(20),
|
|
200
|
-
tryAsServiceId(
|
|
199
|
+
tryAsServiceId(MAX_VALUE_U32),
|
|
201
200
|
new Map(entries),
|
|
202
201
|
],
|
|
203
202
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/jamnp-s/peers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IAErB,iDAAiD;IACjD,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE,eAAe,CAAC;IAEhC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,CAAC;AAWF;;;;;;;GAOG;AACH,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;gBAEhC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;IAWnD,qDAAqD;IACrD,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAInD,yDAAyD;IACzD,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;IAI1D,sDAAsD;IACtD,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC;IAM7E,sDAAsD;IACtD,YAAY;IAIZ,iDAAiD;IAChD,iBAAiB;IAQlB,oDAAoD;IACpD,OAAO,CAAC,UAAU;IAyBlB,8EAA8E;YAChE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/jamnp-s/peers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IAErB,iDAAiD;IACjD,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE,eAAe,CAAC;IAEhC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,CAAC;AAWF;;;;;;;GAOG;AACH,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;gBAEhC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;IAWnD,qDAAqD;IACrD,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAInD,yDAAyD;IACzD,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;IAI1D,sDAAsD;IACtD,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC;IAM7E,sDAAsD;IACtD,YAAY;IAIZ,iDAAiD;IAChD,iBAAiB;IAQlB,oDAAoD;IACpD,OAAO,CAAC,UAAU;IAyBlB,8EAA8E;YAChE,iBAAiB;IAqE/B;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE;CAezC"}
|
|
@@ -90,6 +90,8 @@ export class Connections {
|
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
if (markAsDisconnected) {
|
|
93
|
+
// abort any existing reconnect task
|
|
94
|
+
meta.backgroundTask.abort();
|
|
93
95
|
// mark the peer as disconnected
|
|
94
96
|
meta.peerRef = null;
|
|
95
97
|
meta.backgroundTask = new AbortController();
|
|
@@ -120,6 +122,10 @@ export class Connections {
|
|
|
120
122
|
if (meta.peerRef !== null) {
|
|
121
123
|
return;
|
|
122
124
|
}
|
|
125
|
+
// also check via network.peers to handle race with incoming connections
|
|
126
|
+
if (this.network.peers.isConnected(id)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
123
129
|
// attempt to connect to the peer
|
|
124
130
|
try {
|
|
125
131
|
logger.trace `[${id}] Attempting to connect to peer at ${meta.address.host}:${meta.address.port}.`;
|
|
@@ -130,6 +136,10 @@ export class Connections {
|
|
|
130
136
|
if (signal.aborted) {
|
|
131
137
|
return;
|
|
132
138
|
}
|
|
139
|
+
// check if we got connected via incoming connection while dialing
|
|
140
|
+
if (this.network.peers.isConnected(id)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
133
143
|
// failing to connect, will retry.
|
|
134
144
|
logger.trace `[${id}] Failure reason: ${e}`;
|
|
135
145
|
logger.trace `[${id}] attempt failed. Will retry (${meta.currentRetry}/${meta.maxRetries})`;
|
|
@@ -44,7 +44,7 @@ export declare class ServerHandler implements StreamHandler<typeof STREAM_KIND>
|
|
|
44
44
|
kind: 128 & import("@typeberry/numbers").WithBytesRepresentation<1>;
|
|
45
45
|
constructor(chainSpec: ChainSpec, getBlockSequence: (streamId: StreamId, hash: HeaderHash, direction: Direction, maxBlocks: U32) => BlockView[]);
|
|
46
46
|
onStreamMessage(sender: StreamMessageSender, message: BytesBlob): void;
|
|
47
|
-
onClose(): void;
|
|
47
|
+
onClose(_streamId: StreamId): void;
|
|
48
48
|
}
|
|
49
49
|
export declare class ClientHandler implements StreamHandler<typeof STREAM_KIND> {
|
|
50
50
|
private readonly chainSpec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ce-128-block-request.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jamnp-s/protocol/ce-128-block-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAW,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAmB,MAAM,aAAa,CAAC;AAE3G;;;;GAIG;AAEH,eAAO,MAAM,WAAW,+DAAuB,CAAC;AAEhD,oBAAY,SAAS;IACnB;;;;OAIG;IACH,OAAO,IAAI;IACX;;;;OAIG;IACH,QAAQ,IAAI;CACb;AAED,qBAAa,YAAa,SAAQ,SAAS;aAwBvB,UAAU,EAAE,UAAU;aACtB,SAAS,EAAE,SAAS;aACpB,SAAS,EAAE,GAAG;IAzBhC,MAAM,CAAC,KAAK;;;;QAgBT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC;IAI7E,OAAO;CAOR;AAID,qBAAa,aAAc,YAAW,aAAa,CAAC,OAAO,WAAW,CAAC;IAInE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAJnC,IAAI,gEAAe;gBAGA,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,CACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,GAAG,KACX,SAAS,EAAE;IAGlB,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;IAYtE,OAAO;
|
|
1
|
+
{"version":3,"file":"ce-128-block-request.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jamnp-s/protocol/ce-128-block-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAW,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAmB,MAAM,aAAa,CAAC;AAE3G;;;;GAIG;AAEH,eAAO,MAAM,WAAW,+DAAuB,CAAC;AAEhD,oBAAY,SAAS;IACnB;;;;OAIG;IACH,OAAO,IAAI;IACX;;;;OAIG;IACH,QAAQ,IAAI;CACb;AAED,qBAAa,YAAa,SAAQ,SAAS;aAwBvB,UAAU,EAAE,UAAU;aACtB,SAAS,EAAE,SAAS;aACpB,SAAS,EAAE,GAAG;IAzBhC,MAAM,CAAC,KAAK;;;;QAgBT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC;IAI7E,OAAO;CAOR;AAID,qBAAa,aAAc,YAAW,aAAa,CAAC,OAAO,WAAW,CAAC;IAInE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAJnC,IAAI,gEAAe;gBAGA,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,CACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,GAAG,KACX,SAAS,EAAE;IAGlB,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;IAYtE,OAAO,CAAC,SAAS,EAAE,QAAQ;CAC5B;AAED,qBAAa,aAAc,YAAW,aAAa,CAAC,OAAO,WAAW,CAAC;IAMzD,OAAO,CAAC,QAAQ,CAAC,SAAS;IALtC,IAAI,gEAAe;IAEnB,OAAO,CAAC,gBAAgB,CAA0D;IAClF,OAAO,CAAC,gBAAgB,CAAwD;gBAEnD,SAAS,EAAE,SAAS;IAEjD,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;IAWtE,OAAO,CAAC,QAAQ,EAAE,QAAQ;IAOpB,oBAAoB,CACxB,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,GAAG,GACb,OAAO,CAAC,SAAS,EAAE,CAAC;CAgBxB;AAED,0CAA0C;AAC1C,oBAAY,kBAAkB;IAC5B,+CAA+C;IAC/C,YAAY,IAAI;IAChB,iFAAiF;IACjF,WAAW,IAAI;CAChB;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,QAAQ,EAChB,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,GAAG,GACT,MAAM,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAmEzC"}
|
|
@@ -71,7 +71,7 @@ export class ServerHandler {
|
|
|
71
71
|
sender.bufferAndSend(Encoder.encodeObject(codec.sequenceFixLen(Block.Codec.View, blocks.length), blocks, this.chainSpec));
|
|
72
72
|
sender.close();
|
|
73
73
|
}
|
|
74
|
-
onClose() { }
|
|
74
|
+
onClose(_streamId) { }
|
|
75
75
|
}
|
|
76
76
|
export class ClientHandler {
|
|
77
77
|
chainSpec;
|
|
@@ -82,13 +82,14 @@ export class ClientHandler {
|
|
|
82
82
|
this.chainSpec = chainSpec;
|
|
83
83
|
}
|
|
84
84
|
onStreamMessage(sender, message) {
|
|
85
|
-
|
|
85
|
+
const { streamId } = sender;
|
|
86
|
+
if (!this.promiseResolvers.has(streamId)) {
|
|
86
87
|
throw new Error("Received an unexpected message from the server.");
|
|
87
88
|
}
|
|
88
89
|
const blocks = Decoder.decodeSequence(Block.Codec.View, message, this.chainSpec);
|
|
89
|
-
logger.log `[${
|
|
90
|
-
this.promiseResolvers.get(
|
|
91
|
-
this.promiseResolvers.delete(
|
|
90
|
+
logger.log `[${streamId}] Server returned ${blocks.length} blocks in ${message.length} bytes of data.`;
|
|
91
|
+
this.promiseResolvers.get(streamId)?.(blocks);
|
|
92
|
+
this.promiseResolvers.delete(streamId);
|
|
92
93
|
}
|
|
93
94
|
onClose(streamId) {
|
|
94
95
|
this.promiseRejectors.get(streamId)?.("Stream closed.");
|
|
@@ -96,12 +97,13 @@ export class ClientHandler {
|
|
|
96
97
|
this.promiseRejectors.delete(streamId);
|
|
97
98
|
}
|
|
98
99
|
async requestBlockSequence(sender, headerHash, direction, maxBlocks) {
|
|
99
|
-
|
|
100
|
+
const { streamId } = sender;
|
|
101
|
+
if (this.promiseResolvers.has(streamId)) {
|
|
100
102
|
throw new Error("It is disallowed to use the same stream for multiple requests.");
|
|
101
103
|
}
|
|
102
104
|
return new Promise((resolve, reject) => {
|
|
103
|
-
this.promiseResolvers.set(
|
|
104
|
-
this.promiseRejectors.set(
|
|
105
|
+
this.promiseResolvers.set(streamId, resolve);
|
|
106
|
+
this.promiseRejectors.set(streamId, reject);
|
|
105
107
|
sender.bufferAndSend(Encoder.encodeObject(BlockRequest.Codec, BlockRequest.create({ headerHash, direction, maxBlocks })));
|
|
106
108
|
sender.close();
|
|
107
109
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ce-129-state-request.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jamnp-s/protocol/ce-129-state-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAG7E,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAmB,MAAM,aAAa,CAAC;AAE3G;;;;GAIG;AAEH,eAAO,MAAM,WAAW,+DAAuB,CAAC;AAGhD,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAO7C,qBAAa,YAAa,SAAQ,SAAS;aAWvB,GAAG,EAAE,GAAG;aACR,KAAK,EAAE,SAAS;IAXlC,MAAM,CAAC,KAAK;;;QAGT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC;gBAKrC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,SAAS;CAInC;AAED,qBAAa,aAAc,SAAQ,SAAS;aASN,aAAa,EAAE,YAAY,EAAE;IARjE,MAAM,CAAC,KAAK;;;;;QAET;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC;IAI3D,OAAO;CAGR;AAED,qBAAa,YAAa,SAAQ,SAAS;aAavB,UAAU,EAAE,UAAU;aACtB,QAAQ,EAAE,GAAG;aACb,MAAM,EAAE,GAAG;aACX,WAAW,EAAE,GAAG;IAflC,MAAM,CAAC,KAAK;;;;;QAKT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC;IAItF,OAAO;CAQR;AAID,qBAAa,OAAQ,YAAW,aAAa,CAAC,OAAO,WAAW,CAAC;IAO7D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IARpC,IAAI,gEAAe;IAEnB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4D;gBAGpE,QAAQ,GAAE,OAAe,EACzB,gBAAgB,CAAC,GAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,QAAQ,EAAE,aAAA,EAC/E,gBAAgB,CAAC,GAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,YAAY,EAAE,aAAA;IAOtG,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"ce-129-state-request.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jamnp-s/protocol/ce-129-state-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAG7E,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAmB,MAAM,aAAa,CAAC;AAE3G;;;;GAIG;AAEH,eAAO,MAAM,WAAW,+DAAuB,CAAC;AAGhD,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAO7C,qBAAa,YAAa,SAAQ,SAAS;aAWvB,GAAG,EAAE,GAAG;aACR,KAAK,EAAE,SAAS;IAXlC,MAAM,CAAC,KAAK;;;QAGT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC;gBAKrC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,SAAS;CAInC;AAED,qBAAa,aAAc,SAAQ,SAAS;aASN,aAAa,EAAE,YAAY,EAAE;IARjE,MAAM,CAAC,KAAK;;;;;QAET;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC;IAI3D,OAAO;CAGR;AAED,qBAAa,YAAa,SAAQ,SAAS;aAavB,UAAU,EAAE,UAAU;aACtB,QAAQ,EAAE,GAAG;aACb,MAAM,EAAE,GAAG;aACX,WAAW,EAAE,GAAG;IAflC,MAAM,CAAC,KAAK;;;;;QAKT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC;IAItF,OAAO;CAQR;AAID,qBAAa,OAAQ,YAAW,aAAa,CAAC,OAAO,WAAW,CAAC;IAO7D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IARpC,IAAI,gEAAe;IAEnB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4D;gBAGpE,QAAQ,GAAE,OAAe,EACzB,gBAAgB,CAAC,GAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,QAAQ,EAAE,aAAA,EAC/E,gBAAgB,CAAC,GAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,YAAY,EAAE,aAAA;IAOtG,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;IAgCtE,OAAO,CAAC,QAAQ,EAAE,QAAQ;IAK1B,aAAa,CACX,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;CAe7C"}
|
|
@@ -82,37 +82,39 @@ export class Handler {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
onStreamMessage(sender, message) {
|
|
85
|
+
const { streamId } = sender;
|
|
85
86
|
if (this.isServer) {
|
|
86
|
-
logger.info `[${
|
|
87
|
+
logger.info `[${streamId}][server]: Received request.`;
|
|
87
88
|
if (this.getBoundaryNodes === undefined || this.getKeyValuePairs === undefined) {
|
|
88
89
|
return;
|
|
89
90
|
}
|
|
90
91
|
const request = Decoder.decodeObject(StateRequest.Codec, message);
|
|
91
92
|
const boundaryNodes = this.getBoundaryNodes(request.headerHash, request.startKey, request.endKey);
|
|
92
93
|
const keyValuePairs = this.getKeyValuePairs(request.headerHash, request.startKey, request.endKey);
|
|
93
|
-
logger.info `[${
|
|
94
|
+
logger.info `[${streamId}][server]: <-- responding with boundary nodes and key value pairs.`;
|
|
94
95
|
sender.bufferAndSend(Encoder.encodeObject(codec.sequenceVarLen(trieNodeCodec), boundaryNodes));
|
|
95
96
|
sender.bufferAndSend(Encoder.encodeObject(StateResponse.Codec, StateResponse.create({ keyValuePairs })));
|
|
96
97
|
sender.close();
|
|
97
98
|
return;
|
|
98
99
|
}
|
|
99
|
-
if (!this.boundaryNodes.has(
|
|
100
|
-
this.boundaryNodes.set(
|
|
101
|
-
logger.info `[${
|
|
100
|
+
if (!this.boundaryNodes.has(streamId)) {
|
|
101
|
+
this.boundaryNodes.set(streamId, Decoder.decodeObject(codec.sequenceVarLen(trieNodeCodec), message));
|
|
102
|
+
logger.info `[${streamId}][client]: Received boundary nodes.`;
|
|
102
103
|
return;
|
|
103
104
|
}
|
|
104
|
-
this.onResponse.get(
|
|
105
|
-
logger.info `[${
|
|
105
|
+
this.onResponse.get(streamId)?.(Decoder.decodeObject(StateResponse.Codec, message));
|
|
106
|
+
logger.info `[${streamId}][client]: Received state values.`;
|
|
106
107
|
}
|
|
107
108
|
onClose(streamId) {
|
|
108
109
|
this.boundaryNodes.delete(streamId);
|
|
109
110
|
this.onResponse.delete(streamId);
|
|
110
111
|
}
|
|
111
112
|
getStateByKey(sender, headerHash, startKey, onResponse) {
|
|
112
|
-
|
|
113
|
+
const { streamId } = sender;
|
|
114
|
+
if (this.onResponse.has(streamId)) {
|
|
113
115
|
throw new Error("It is disallowed to use the same stream for multiple requests.");
|
|
114
116
|
}
|
|
115
|
-
this.onResponse.set(
|
|
117
|
+
this.onResponse.set(streamId, onResponse);
|
|
116
118
|
sender.bufferAndSend(Encoder.encodeObject(StateRequest.Codec, StateRequest.create({ headerHash, startKey, endKey: startKey, maximumSize: tryAsU32(4096) })));
|
|
117
119
|
sender.close();
|
|
118
120
|
}
|
|
@@ -3,7 +3,7 @@ import { SignedTicket } from "#@typeberry/block/tickets.js";
|
|
|
3
3
|
import type { BytesBlob } from "#@typeberry/bytes";
|
|
4
4
|
import { type CodecRecord } from "#@typeberry/codec";
|
|
5
5
|
import { WithDebug } from "#@typeberry/utils";
|
|
6
|
-
import { type StreamHandler, type StreamMessageSender } from "./stream.js";
|
|
6
|
+
import { type StreamHandler, type StreamId, type StreamMessageSender } from "./stream.js";
|
|
7
7
|
/**
|
|
8
8
|
* JAM-SNP CE-131 and CE-132 streams.
|
|
9
9
|
*
|
|
@@ -32,13 +32,13 @@ export declare class ServerHandler<T extends STREAM_KIND> implements StreamHandl
|
|
|
32
32
|
private readonly onTicketReceived;
|
|
33
33
|
constructor(kind: T, onTicketReceived: (epochIndex: Epoch, ticket: SignedTicket) => void);
|
|
34
34
|
onStreamMessage(sender: StreamMessageSender, message: BytesBlob): void;
|
|
35
|
-
onClose(): void;
|
|
35
|
+
onClose(_streamId: StreamId): void;
|
|
36
36
|
}
|
|
37
37
|
export declare class ClientHandler<T extends STREAM_KIND> implements StreamHandler<T> {
|
|
38
38
|
readonly kind: T;
|
|
39
39
|
constructor(kind: T);
|
|
40
40
|
onStreamMessage(sender: StreamMessageSender): void;
|
|
41
|
-
onClose(): void;
|
|
41
|
+
onClose(_streamId: StreamId): void;
|
|
42
42
|
sendTicket(sender: StreamMessageSender, epochIndex: Epoch, ticket: SignedTicket): void;
|
|
43
43
|
}
|
|
44
44
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ce-131-ce-132-safrole-ticket-distribution.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAmB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ce-131-ce-132-safrole-ticket-distribution.d.ts","sourceRoot":"","sources":["../../../../../../packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAmB,MAAM,aAAa,CAAC;AAE3G;;;;;;GAMG;AAEH,eAAO,MAAM,8BAA8B,+DAAuB,CAAC;AACnE,eAAO,MAAM,wBAAwB,+DAAuB,CAAC;AAE7D,KAAK,WAAW,GAAG,OAAO,8BAA8B,GAAG,OAAO,wBAAwB,CAAC;AAE3F,qBAAa,yBAA0B,SAAQ,SAAS;aAWpC,UAAU,EAAE,KAAK;aACjB,MAAM,EAAE,YAAY;IAXtC,MAAM,CAAC,KAAK;;;;;;QAGT;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,yBAAyB,CAAC;IAI5E,OAAO;CAMR;AAID,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;aAEzD,IAAI,EAAE,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBADjB,IAAI,EAAE,CAAC,EACN,gBAAgB,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI;IAGtF,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;IAOtE,OAAO,CAAC,SAAS,EAAE,QAAQ;CAC5B;AAED,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;aAC/C,IAAI,EAAE,CAAC;gBAAP,IAAI,EAAE,CAAC;IAEnC,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAKlD,OAAO,CAAC,SAAS,EAAE,QAAQ;IAE3B,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY;CAKhF"}
|