aboutsummaryrefslogtreecommitdiffstats
path: root/GasMeter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'GasMeter.cpp')
-rw-r--r--GasMeter.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/GasMeter.cpp b/GasMeter.cpp
index b792f04d..93583169 100644
--- a/GasMeter.cpp
+++ b/GasMeter.cpp
@@ -126,18 +126,22 @@ GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
}
case Instruction::CALL:
case Instruction::CALLCODE:
+ case Instruction::DELEGATECALL:
+ {
gas = m_schedule.callGas;
if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(0)))
gas += (*value);
else
gas = GasConsumption::infinite();
- if (_item.instruction() != Instruction::CALLCODE)
+ if (_item.instruction() == Instruction::CALL)
gas += m_schedule.callNewAccountGas; // We very rarely know whether the address exists.
- if (!classes.knownZero(m_state->relativeStackElement(-2)))
+ int valueSize = _item.instruction() == Instruction::DELEGATECALL ? 0 : 1;
+ if (!classes.knownZero(m_state->relativeStackElement(-1 - valueSize)))
gas += m_schedule.callValueTransferGas;
- gas += memoryGas(-3, -4);
- gas += memoryGas(-5, -6);
+ gas += memoryGas(-2 - valueSize, -3 - valueSize);
+ gas += memoryGas(-4 - valueSize, -5 - valueSize);
break;
+ }
case Instruction::CREATE:
gas = m_schedule.createGas;
gas += memoryGas(-1, -2);