Skip to content

Commit

Permalink
feat: iw validation
Browse files Browse the repository at this point in the history
  • Loading branch information
ppedziwiatr committed Jun 18, 2023
1 parent 977ab7a commit 2790e1c
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/contract/InnerWritesEvaluator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export class InnerWritesEvaluator {
return result;
}

private evalForeignCalls(rootContractTxId: string, interaction: InteractionCall, result: Array<string>) {
evalForeignCalls(rootContractTxId: string, interaction: InteractionCall, result: Array<string>) {
Object.keys(interaction.interactionInput.foreignContractCalls).forEach((foreignContractCallKey) => {
const foreignContractCall = interaction.interactionInput.foreignContractCalls[foreignContractCallKey];
if (foreignContractCall.innerCallType == 'write') {
Expand Down
24 changes: 22 additions & 2 deletions src/core/modules/impl/DefaultStateEvaluator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { ContractInteraction, HandlerApi, InteractionResult } from './HandlerExe
import { TagsParser } from './TagsParser';
import { VrfPluginFunctions } from '../../WarpPlugin';
import { BasicSortKeyCache } from '../../../cache/BasicSortKeyCache';
import { InnerWritesEvaluator } from '../../../contract/InnerWritesEvaluator';

type EvaluationProgressInput = {
contractTxId: string;
Expand Down Expand Up @@ -252,8 +253,27 @@ export abstract class DefaultStateEvaluator implements StateEvaluator {
throw new Error(`Exception while processing ${JSON.stringify(interaction)}:\n${result.errorMessage}`);
}

validity[missingInteraction.id] = result.type === 'ok';
currentState = result.state;
if (internalWrites && contract.isRoot()) {
const innerWritesEvaluator = new InnerWritesEvaluator();
const iwEvaluatorResult = [];
innerWritesEvaluator.evalForeignCalls(contract.txId(), interactionCall, iwEvaluatorResult);
const tagsInnerWrites = this.tagsParser.getInteractWritesContracts(missingInteraction);
if (
iwEvaluatorResult.length == tagsInnerWrites.length &&
tagsInnerWrites.every((elem) => iwEvaluatorResult.includes(elem))
) {
validity[missingInteraction.id] = result.type === 'ok';
currentState = result.state;
} else {
validity[missingInteraction.id] = false;
errorMessage[
missingInteraction.id
] = `[SDK] Inner writes do not match - tags:${tagsInnerWrites}, evaluated: ${iwEvaluatorResult}`;
}
} else {
validity[missingInteraction.id] = result.type === 'ok';
currentState = result.state;
}

const toCache = new EvalStateResult(currentState, validity, errorMessages);
if (canBeCached(missingInteraction)) {
Expand Down

0 comments on commit 2790e1c

Please sign in to comment.