Skip to content

Commit b61090c

Browse files
committed
feat: iw validation
1 parent 977ab7a commit b61090c

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

src/contract/InnerWritesEvaluator.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,19 @@ export class InnerWritesEvaluator {
1111
return result;
1212
}
1313

14-
private evalForeignCalls(rootContractTxId: string, interaction: InteractionCall, result: Array<string>) {
14+
evalForeignCalls(
15+
rootContractTxId: string,
16+
interaction: InteractionCall,
17+
result: Array<string>,
18+
onlyDryWrites = true
19+
) {
1520
Object.keys(interaction.interactionInput.foreignContractCalls).forEach((foreignContractCallKey) => {
1621
const foreignContractCall = interaction.interactionInput.foreignContractCalls[foreignContractCallKey];
1722
if (foreignContractCall.innerCallType == 'write') {
1823
Object.keys(foreignContractCall.interactions).forEach((k) => {
1924
const foreignInteraction = foreignContractCall.interactions[k];
2025
if (
21-
foreignInteraction.interactionInput.dryWrite &&
26+
((onlyDryWrites && foreignInteraction.interactionInput.dryWrite) || !onlyDryWrites) &&
2227
!result.includes(foreignContractCall.contractTxId) &&
2328
rootContractTxId !== foreignContractCall.contractTxId /*"write-backs"*/
2429
) {

src/core/modules/impl/DefaultStateEvaluator.ts

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ContractInteraction, HandlerApi, InteractionResult } from './HandlerExe
1313
import { TagsParser } from './TagsParser';
1414
import { VrfPluginFunctions } from '../../WarpPlugin';
1515
import { BasicSortKeyCache } from '../../../cache/BasicSortKeyCache';
16+
import { InnerWritesEvaluator } from '../../../contract/InnerWritesEvaluator';
1617

1718
type EvaluationProgressInput = {
1819
contractTxId: string;
@@ -239,22 +240,42 @@ export abstract class DefaultStateEvaluator implements StateEvaluator {
239240

240241
this.logger.debug(`${indent(depth)}Interaction evaluation`, singleInteractionBenchmark.elapsed());
241242

243+
if (result.type === 'exception' && ignoreExceptions !== true) {
244+
throw new Error(`Exception while processing ${JSON.stringify(interaction)}:\n${result.errorMessage}`);
245+
}
246+
247+
if (internalWrites && contract.isRoot() && result.type === 'ok') {
248+
const innerWritesEvaluator = new InnerWritesEvaluator();
249+
const iwEvaluatorResult = [];
250+
innerWritesEvaluator.evalForeignCalls(contract.txId(), interactionCall, iwEvaluatorResult, false);
251+
const tagsInnerWrites = this.tagsParser.getInteractWritesContracts(missingInteraction);
252+
if (
253+
iwEvaluatorResult.length == tagsInnerWrites.length &&
254+
tagsInnerWrites.every((elem) => iwEvaluatorResult.includes(elem))
255+
) {
256+
validity[missingInteraction.id] = result.type === 'ok';
257+
currentState = result.state;
258+
} else {
259+
validity[missingInteraction.id] = false;
260+
errorMessage = `[SDK] Inner writes do not match - tags: ${tagsInnerWrites}, evaluated: ${iwEvaluatorResult}`;
261+
// console.error(errorMessage);
262+
// console.dir(interactionCall, { depth: null });
263+
errorMessages[missingInteraction.id] = errorMessage;
264+
}
265+
} else {
266+
validity[missingInteraction.id] = result.type === 'ok';
267+
currentState = result.state;
268+
}
269+
242270
interactionCall.update({
243271
cacheHit: false,
244272
outputState: stackTrace.saveState ? currentState : undefined,
245273
executionTime: singleInteractionBenchmark.elapsed(true) as number,
246274
valid: validity[missingInteraction.id],
247-
errorMessage: errorMessage,
275+
errorMessage,
248276
gasUsed: result.gasUsed
249277
});
250278

251-
if (result.type === 'exception' && ignoreExceptions !== true) {
252-
throw new Error(`Exception while processing ${JSON.stringify(interaction)}:\n${result.errorMessage}`);
253-
}
254-
255-
validity[missingInteraction.id] = result.type === 'ok';
256-
currentState = result.state;
257-
258279
const toCache = new EvalStateResult(currentState, validity, errorMessages);
259280
if (canBeCached(missingInteraction)) {
260281
lastConfirmedTxState = {

0 commit comments

Comments
 (0)