UNPKG

deth

Version:

Ethereum node focused on Developer Experience

41 lines (40 loc) 1.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ethereumjs_util_1 = require("ethereumjs-util"); const primitives_1 = require("../primitives"); exports.eventLogger = (logger) => (runState) => { const opcodeName = runState.opcode.name; if (!opcodeName.startsWith('LOG')) { return; } // is there a better way to get topic count? const topicsCount = parseInt(opcodeName.substr(3)); const [memOffset, memLength, ...topicsRaw] = getLastN(runState.stack, 2 + topicsCount); const topics = topicsRaw .map(function (a) { return a.toArrayLike(Buffer, 'be', 32); }) .map(ethereumjs_util_1.bufferToHex); const data = ethereumjs_util_1.bufferToHex(memLength.isZero() ? Buffer.alloc(32) : getMemoryAsBuffer(runState.memory, memOffset.toNumber(), memLength.toNumber())); logger.logEvent(data, topics); }; exports.revertLogger = (logger) => (runState) => { const opcodeName = runState.opcode.name; if (opcodeName !== 'REVERT') { return; } const [offset, length] = getLastN(runState.stack, 2); const rawDataBuffer = getMemoryAsBuffer(runState.memory, offset.toNumber(), length.toNumber()); // dunno why there is a garbage printed out apart from revert string const reason = rawDataBuffer.toString('utf8') || '(unknown)'; logger.logRevert(reason, primitives_1.bufferToAddress(runState.address)); }; function getLastN(arr, n) { return arr.slice(-n).reverse(); } function getMemoryAsBuffer(memory, offset, length) { const rawData = memory.slice(offset, offset + length); return Buffer.from(rawData); }