3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
15using ::testing::Return;
20class GasTrackerTest :
public ::testing::Test {
25 ON_CALL(context, get_gas_used()).WillByDefault(Return(Gas{ 0, 0 }));
26 ON_CALL(context, get_gas_limit()).WillByDefault(Return(Gas{ 1000, 500 }));
36TEST_F(GasTrackerTest, BaseGasConsumption)
43 EXPECT_CALL(
context, get_gas_used);
44 EXPECT_CALL(
context, get_gas_limit);
45 EXPECT_CALL(
context, set_gas_used(Gas{ l2_gas_used, 0 }));
47 EXPECT_CALL(range_check, assert_range(1000 - l2_gas_used, 64));
48 EXPECT_CALL(range_check, assert_range(500, 64));
50 tracker.consume_gas();
55 .dynamic_gas_factor = Gas{ 0, 0 },
56 .limit_used_l2_comparison_witness = 1000 - l2_gas_used,
57 .limit_used_da_comparison_witness = 500,
63TEST_F(GasTrackerTest, AddressingGasConsumption)
72 EXPECT_CALL(context, get_gas_used);
73 EXPECT_CALL(context, get_gas_limit);
74 EXPECT_CALL(context, set_gas_used(Gas{ l2_gas_used, 0 }));
76 EXPECT_CALL(range_check, assert_range(1000 - l2_gas_used, 64));
77 EXPECT_CALL(range_check, assert_range(500, 64));
79 tracker.consume_gas();
84 .dynamic_gas_factor = Gas{ 0, 0 },
85 .limit_used_l2_comparison_witness = 1000 - l2_gas_used,
86 .limit_used_da_comparison_witness = 500,
92TEST_F(GasTrackerTest, OutOfGasBase)
98 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ 999, 450 }));
99 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ 1000, 500 }));
103 EXPECT_CALL(range_check, assert_range((999 + opcode_l2_gas) - 1000 - 1, 64));
104 EXPECT_CALL(range_check, assert_range(500 - 450, 64));
111 .dynamic_gas_factor = Gas{ 0, 0 },
112 .limit_used_l2_comparison_witness = (999 + opcode_l2_gas) - 1000 - 1,
113 .limit_used_da_comparison_witness = 500 - 450,
119TEST_F(GasTrackerTest, DynamicGasConsumption)
124 EXPECT_CALL(context, get_gas_used);
125 EXPECT_CALL(context, get_gas_limit);
128 EXPECT_CALL(context, set_gas_used(Gas{ l2_base_gas + l2_dyn_computation, 0 }));
130 EXPECT_CALL(range_check, assert_range(1000 - (l2_base_gas + l2_dyn_computation), 64));
131 EXPECT_CALL(range_check, assert_range(500, 64));
133 tracker.consume_gas(Gas{ 10, 0 });
138 .dynamic_gas_factor = Gas{ 10, 0 },
139 .limit_used_l2_comparison_witness = 1000 - (l2_base_gas + l2_dyn_computation),
140 .limit_used_da_comparison_witness = 500,
146TEST_F(GasTrackerTest, OutOfGasDynamicPhase)
151 uint32_t l2_gas_limit = 1000;
153 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ l2_gas_used_start, 0 }));
154 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ l2_gas_limit, 500 }));
158 EXPECT_CALL(range_check,
159 assert_range((l2_base_gas + l2_dyn_computation + l2_gas_used_start) - l2_gas_limit - 1, 64));
160 EXPECT_CALL(range_check, assert_range(500, 64));
168 .dynamic_gas_factor = Gas{ 100, 0 },
169 .limit_used_l2_comparison_witness =
170 (l2_base_gas + l2_dyn_computation + l2_gas_used_start) - l2_gas_limit - 1,
171 .limit_used_da_comparison_witness = 500,
177TEST_F(GasTrackerTest, OutOfGasBothPhases)
185 uint32_t l2_gas_limit = 1000;
186 uint32_t l2_gas_used_start = l2_gas_limit - 1;
187 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ l2_gas_used_start, 0 }));
188 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ l2_gas_limit, 500 }));
192 EXPECT_CALL(range_check,
193 assert_range((l2_base_gas + l2_dyn_computation + l2_gas_used_start) - l2_gas_limit - 1, 64));
194 EXPECT_CALL(range_check, assert_range(500, 64));
202 .dynamic_gas_factor = Gas{ 100, 0 },
203 .limit_used_l2_comparison_witness =
204 (l2_base_gas + l2_dyn_computation + l2_gas_used_start) - l2_gas_limit - 1,
205 .limit_used_da_comparison_witness = 500,
211TEST_F(GasTrackerTest, OutOfGasBasePhaseWithOverflow)
215 constexpr uint32_t uint32_max = std::numeric_limits<uint32_t>::max();
216 constexpr uint32_t gas_limit = uint32_max;
217 constexpr uint32_t prev_gas_used = uint32_max;
221 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ prev_gas_used, 0 }));
222 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ gas_limit, gas_limit }));
225 EXPECT_CALL(range_check, assert_range(prev_gas_used + l2_opcode_gas - gas_limit - 1, 64));
226 EXPECT_CALL(range_check, assert_range(gas_limit, 64));
233 .dynamic_gas_factor = Gas{ 0, 0 },
234 .limit_used_l2_comparison_witness = prev_gas_used + l2_opcode_gas - gas_limit - 1,
235 .limit_used_da_comparison_witness = gas_limit,
241TEST_F(GasTrackerTest, OutOfGasDynamicPhaseWithOverflow)
245 constexpr uint32_t uint32_max = std::numeric_limits<uint32_t>::max();
246 uint32_t gas_limit = uint32_max;
248 uint32_t gas_factor = uint32_max;
252 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ prev_gas_used, 0 }));
253 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ gas_limit, gas_limit }));
257 EXPECT_CALL(range_check,
258 assert_range(prev_gas_used + l2_base_opcode_gas + l2_dyn_computation - gas_limit - 1, 64));
259 EXPECT_CALL(range_check, assert_range(gas_limit, 64));
267 .dynamic_gas_factor = Gas{ gas_factor, 0 },
268 .limit_used_l2_comparison_witness = prev_gas_used + l2_base_opcode_gas + l2_dyn_computation - gas_limit - 1,
269 .limit_used_da_comparison_witness = gas_limit,
275TEST_F(GasTrackerTest, GasLimitForCall)
279 Gas gas_left = Gas{ 500, 200 };
280 Gas allocated_gas = Gas{ 100, 150 };
282 EXPECT_CALL(context, gas_left()).WillOnce(Return(gas_left));
284 EXPECT_CALL(range_check, assert_range(gas_left.l2Gas - allocated_gas.l2Gas - 1, 32));
285 EXPECT_CALL(range_check, assert_range(gas_left.daGas - allocated_gas.daGas - 1, 32));
286 EXPECT_EQ(tracker.compute_gas_limit_for_call(allocated_gas), allocated_gas);
289TEST_F(GasTrackerTest, GasLimitForCallClamping)
293 Gas gas_left = Gas{ 500, 200 };
294 Gas allocated_gas = Gas{ 1000, 100 };
295 Gas clamped_gas = Gas{ 500, 100 };
297 EXPECT_CALL(context, gas_left()).WillOnce(Return(gas_left));
299 EXPECT_CALL(range_check, assert_range(allocated_gas.l2Gas - gas_left.l2Gas, 32));
300 EXPECT_CALL(range_check, assert_range(gas_left.daGas - allocated_gas.daGas - 1, 32));
301 EXPECT_EQ(tracker.compute_gas_limit_for_call(allocated_gas), clamped_gas);
#define AVM_CALLDATACOPY_DYN_L2_GAS
#define AVM_SET_BASE_L2_GAS
#define AVM_CALLDATACOPY_BASE_L2_GAS
StrictMock< MockContext > context
InstructionInfoDB instruction_info_db
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
uint32_t compute_addressing_gas(uint16_t indirect_flag)
TEST_F(IPATest, ChallengesAreZero)
Instruction
Enumeration of VM instructions that can be executed.