From 940087e017ed1ac3945bd24fe505d44c93ed2e4a Mon Sep 17 00:00:00 2001 From: Anastasia Rodionova Date: Sun, 20 Apr 2025 21:12:39 +0200 Subject: [PATCH] Add options parameter to the transaction interpreter --- .changeset/many-houses-walk.md | 5 +++++ .../src/EvalInterpreter.ts | 22 +++++++++++++++---- .../src/QuickjsInterpreter.ts | 19 ++++++++++++---- .../src/interpreter.ts | 3 +++ 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 .changeset/many-houses-walk.md diff --git a/.changeset/many-houses-walk.md b/.changeset/many-houses-walk.md new file mode 100644 index 00000000..6f6b043f --- /dev/null +++ b/.changeset/many-houses-walk.md @@ -0,0 +1,5 @@ +--- +'@3loop/transaction-interpreter': patch +--- + +Add options parameter to the transaction interpreter diff --git a/packages/transaction-interpreter/src/EvalInterpreter.ts b/packages/transaction-interpreter/src/EvalInterpreter.ts index 15012659..e19687a4 100644 --- a/packages/transaction-interpreter/src/EvalInterpreter.ts +++ b/packages/transaction-interpreter/src/EvalInterpreter.ts @@ -23,14 +23,28 @@ const make = Effect.succeed({ id: `${decodedTx.chainID}:${decodedTx.toAddress}`, } }, - interpretTx: (decodedTx: DecodedTransaction, interpreter: Interpreter) => + interpretTx: ( + decodedTx: DecodedTransaction, + interpreter: Interpreter, + options?: { + interpretAsUserAddress?: string + }, + ) => Effect.sync(() => { // TODO: add ability to surpress warning on acknowledge Effect.logWarning('Using eval in production can result in security vulnerabilities. Use at your own risk.') - const input = stringify(decodedTx) - const code = interpreter.schema - const result = localEval(code, input) + let input + if (options?.interpretAsUserAddress) { + input = stringify({ + ...decodedTx, + fromAddress: options.interpretAsUserAddress, + }) + } else { + input = stringify(decodedTx) + } + + const result = localEval(interpreter.schema, input) return result }).pipe(Effect.withSpan('TransactionInterpreter.interpretTx')), }) diff --git a/packages/transaction-interpreter/src/QuickjsInterpreter.ts b/packages/transaction-interpreter/src/QuickjsInterpreter.ts index 07767988..4882efd3 100644 --- a/packages/transaction-interpreter/src/QuickjsInterpreter.ts +++ b/packages/transaction-interpreter/src/QuickjsInterpreter.ts @@ -22,11 +22,22 @@ const make = Effect.gen(function* () { id: `${decodedTx.chainID}:${decodedTx.toAddress}`, } }, - interpretTx: (decodedTx: DecodedTransaction, interpreter: Interpreter) => + interpretTx: ( + decodedTx: DecodedTransaction, + interpreter: Interpreter, + options?: { interpretAsUserAddress?: string }, + ) => Effect.gen(function* () { - const input = stringify(decodedTx) - const code = interpreter.schema - const result = yield* vm.eval(code + '\n' + 'transformEvent(' + input + ')') + let input + if (options?.interpretAsUserAddress) { + input = stringify({ + ...decodedTx, + fromAddress: options.interpretAsUserAddress, + }) + } else { + input = stringify(decodedTx) + } + const result = yield* vm.eval(interpreter.schema + '\n' + 'transformEvent(' + input + ')') return result }).pipe(Effect.withSpan('TransactionInterpreter.interpretTx')), } diff --git a/packages/transaction-interpreter/src/interpreter.ts b/packages/transaction-interpreter/src/interpreter.ts index 9a3dd0c6..d04c6d6e 100644 --- a/packages/transaction-interpreter/src/interpreter.ts +++ b/packages/transaction-interpreter/src/interpreter.ts @@ -8,6 +8,9 @@ export interface TransactionInterpreter { readonly interpretTx: ( decodedTx: DecodedTransaction, interpreter: Interpreter, + options?: { + interpretAsUserAddress?: string + }, ) => Effect.Effect }