deth
Version:
Ethereum node focused on Developer Experience
41 lines (40 loc) • 1.66 kB
JavaScript
;
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);
}