fix: [BUG] - readStateBatch returns null for contract with no interactions #495

This commit is contained in:
ppedziwiatr
2024-01-08 19:46:28 +01:00
committed by just_ppe
parent 01d69d811b
commit 0da5da3e05
2 changed files with 7 additions and 6 deletions

View File

@@ -254,22 +254,23 @@ export class HandlerBasedContract<State> implements Contract<State> {
let batchesLoaded = 0; let batchesLoaded = 0;
do { do {
const batchBenchmark = Benchmark.measure(); const batchBenchmark = Benchmark.measure();
this.logger.debug(`Loading ${++batchesLoaded}`, evaluationOptions); this.logger.debug(`Loading ${batchesLoaded + 1} batch`, evaluationOptions);
interactions = await interactionsLoader.load(contractTxId, cachedState?.sortKey, sortKey, evaluationOptions); interactions = await interactionsLoader.load(contractTxId, cachedState?.sortKey, sortKey, evaluationOptions);
if (signal?.aborted) { if (signal?.aborted) {
throw new AbortError('readStateBatch aborted'); throw new AbortError('readStateBatch aborted');
} }
if (interactions.length == 0) { if (interactions.length == 0 && batchesLoaded > 0) {
break; break;
} }
this.logger.debug(`Evaluating ${interactions.length} in ${batchesLoaded}`); this.logger.debug(`Evaluating ${interactions.length} in ${batchesLoaded + 1} batch`);
cachedState = await this.readStateFor(cachedState?.sortKey || genesisSortKey, interactions, signal); cachedState = await this.readStateFor(cachedState?.sortKey || genesisSortKey, interactions, signal);
if (signal?.aborted) { if (signal?.aborted) {
throw new AbortError('readStateBatch aborted'); throw new AbortError('readStateBatch aborted');
} }
this.logger.debug( this.logger.debug(
`Batch ${batchesLoaded} evaluated in ${batchBenchmark.elapsed()} at sortKey ${cachedState.sortKey}` `Batch ${batchesLoaded + 1} evaluated in ${batchBenchmark.elapsed()} at sortKey ${cachedState.sortKey}`
); );
batchesLoaded++;
} while (interactions.length > 0); } while (interactions.length > 0);
return cachedState; return cachedState;

View File

@@ -18,7 +18,7 @@ async function main() {
try { try {
const signal = AbortSignal.timeout(2000); const signal = AbortSignal.timeout(10000);
const contract = warp const contract = warp
.contract("Daj-MNSnH55TDfxqC7v4eq0lKzVIwh98srUaWqyuZtY") .contract("Daj-MNSnH55TDfxqC7v4eq0lKzVIwh98srUaWqyuZtY")
.setEvaluationOptions({ .setEvaluationOptions({
@@ -27,7 +27,7 @@ async function main() {
allowBigInt: true, allowBigInt: true,
unsafeClient: 'skip', unsafeClient: 'skip',
}); });
const result = await contract.readStateBatch(1, signal); const result = await contract.readStateBatch(1, undefined, signal);
console.dir(result.cachedValue.state, {depth: null}); console.dir(result.cachedValue.state, {depth: null});
} catch (e) { } catch (e) {
console.error(e); console.error(e);