diff --git a/src/trace/traceAnalyser.js b/src/trace/traceAnalyser.js index 8acf27a17f..2e119253c2 100644 --- a/src/trace/traceAnalyser.js +++ b/src/trace/traceAnalyser.js @@ -90,6 +90,7 @@ TraceAnalyser.prototype.buildStorage = function (index, step, context) { } TraceAnalyser.prototype.buildDepth = function (index, step, tx, callStack, context) { + var outOfGas = runOutOfGas(step) if (traceHelper.isCallInstruction(step) && !traceHelper.isCallToPrecompiledContract(index, this.trace)) { var newAddress if (traceHelper.isCreateInstruction(step)) { @@ -110,10 +111,10 @@ TraceAnalyser.prototype.buildDepth = function (index, step, tx, callStack, conte this.traceCache.pushSteps(index, context.currentCallIndex) context.lastCallIndex = context.currentCallIndex context.currentCallIndex = 0 - } else if (traceHelper.isReturnInstruction(step) || traceHelper.isStopInstruction(step)) { + } else if (traceHelper.isReturnInstruction(step) || traceHelper.isStopInstruction(step) || outOfGas) { if (index + 1 < this.trace.length) { callStack.pop() - this.traceCache.pushCall(step, index + 1, null, callStack.slice(0)) + this.traceCache.pushCall(step, index + 1, null, callStack.slice(0), outOfGas) this.buildCalldata(index, step, tx, false) this.traceCache.pushSteps(index, context.currentCallIndex) context.currentCallIndex = context.lastCallIndex + 1 @@ -125,4 +126,8 @@ TraceAnalyser.prototype.buildDepth = function (index, step, tx, callStack, conte return context } +function runOutOfGas (step) { + return parseInt(step.gas) - parseInt(step.gasCost) < 0 +} + module.exports = TraceAnalyser diff --git a/src/trace/traceCache.js b/src/trace/traceCache.js index e6f7459c09..9480c6f600 100644 --- a/src/trace/traceCache.js +++ b/src/trace/traceCache.js @@ -34,14 +34,15 @@ TraceCache.prototype.pushMemoryChanges = function (value) { this.memoryChanges.push(value) } -TraceCache.prototype.pushCall = function (step, index, address, callStack) { +TraceCache.prototype.pushCall = function (step, index, address, callStack, outofGas) { this.callChanges.push(index) this.calls[index] = { op: step.op, address: address, - callStack: callStack + callStack: callStack, + outofGas: outofGas } - if (step.op === 'RETURN' || step.op === 'STOP') { + if (step.op === 'RETURN' || step.op === 'STOP' || outofGas) { var call = this.callsRef.pop() this.calls[index].call = call this.calls[call].return = index