@@ -94,7 +94,7 @@ TEST_F(evm_state, sstore_cost)
94
94
auto v1 = evmc::bytes32{};
95
95
v1.bytes [31 ] = 1 ;
96
96
97
- auto revs = {EVMC_BYZANTIUM, EVMC_CONSTANTINOPLE, EVMC_PETERSBURG};
97
+ auto revs = {EVMC_BYZANTIUM, EVMC_CONSTANTINOPLE, EVMC_PETERSBURG, EVMC_ISTANBUL };
98
98
for (auto r : revs)
99
99
{
100
100
rev = r;
@@ -130,45 +130,95 @@ TEST_F(evm_state, sstore_cost)
130
130
storage[v1] = v1;
131
131
execute (sstore (1 , push (1 )));
132
132
EXPECT_EQ (result.status_code , EVMC_SUCCESS);
133
- EXPECT_EQ (gas_used, rev == EVMC_CONSTANTINOPLE ? 206 : 5006 );
133
+ if (rev >= EVMC_ISTANBUL)
134
+ EXPECT_EQ (gas_used, 806 );
135
+ else if (rev == EVMC_CONSTANTINOPLE)
136
+ EXPECT_EQ (gas_used, 206 );
137
+ else
138
+ EXPECT_EQ (gas_used, 5006 );
134
139
execute (205 , sstore (1 , push (1 )));
135
140
EXPECT_EQ (result.status_code , EVMC_OUT_OF_GAS);
136
141
137
142
// Added & unchanged:
138
143
storage.clear ();
139
144
execute (sstore (1 , push (1 )) + sstore (1 , push (1 )));
140
145
EXPECT_EQ (result.status_code , EVMC_SUCCESS);
141
- EXPECT_EQ (gas_used, rev == EVMC_CONSTANTINOPLE ? 20212 : 25012 );
146
+ if (rev >= EVMC_ISTANBUL)
147
+ EXPECT_EQ (gas_used, 20812 );
148
+ else if (rev == EVMC_CONSTANTINOPLE)
149
+ EXPECT_EQ (gas_used, 20212 );
150
+ else
151
+ EXPECT_EQ (gas_used, 25012 );
142
152
143
153
// Modified again:
144
154
storage.clear ();
145
155
storage[v1] = {v1, true };
146
156
execute (sstore (1 , push (2 )));
147
157
EXPECT_EQ (result.status_code , EVMC_SUCCESS);
148
- EXPECT_EQ (gas_used, rev == EVMC_CONSTANTINOPLE ? 206 : 5006 );
158
+ if (rev >= EVMC_ISTANBUL)
159
+ EXPECT_EQ (gas_used, 806 );
160
+ else if (rev == EVMC_CONSTANTINOPLE)
161
+ EXPECT_EQ (gas_used, 206 );
162
+ else
163
+ EXPECT_EQ (gas_used, 5006 );
149
164
150
165
// Added & modified again:
151
166
storage.clear ();
152
167
execute (sstore (1 , push (1 )) + sstore (1 , push (2 )));
153
168
EXPECT_EQ (result.status_code , EVMC_SUCCESS);
154
- EXPECT_EQ (gas_used, rev == EVMC_CONSTANTINOPLE ? 20212 : 25012 );
169
+ if (rev >= EVMC_ISTANBUL)
170
+ EXPECT_EQ (gas_used, 20812 );
171
+ else if (rev == EVMC_CONSTANTINOPLE)
172
+ EXPECT_EQ (gas_used, 20212 );
173
+ else
174
+ EXPECT_EQ (gas_used, 25012 );
155
175
156
176
// Modified & modified again:
157
177
storage.clear ();
158
178
storage[v1] = v1;
159
179
execute (sstore (1 , push (2 )) + sstore (1 , push (3 )));
160
180
EXPECT_EQ (result.status_code , EVMC_SUCCESS);
161
- EXPECT_EQ (gas_used, rev == EVMC_CONSTANTINOPLE ? 5212 : 10012 );
181
+ if (rev >= EVMC_ISTANBUL)
182
+ EXPECT_EQ (gas_used, 5812 );
183
+ else if (rev == EVMC_CONSTANTINOPLE)
184
+ EXPECT_EQ (gas_used, 5212 );
185
+ else
186
+ EXPECT_EQ (gas_used, 10012 );
162
187
163
188
// Modified & modified again back to original:
164
189
storage.clear ();
165
190
storage[v1] = v1;
166
191
execute (sstore (1 , push (2 )) + sstore (1 , push (1 )));
167
192
EXPECT_EQ (result.status_code , EVMC_SUCCESS);
168
- EXPECT_EQ (gas_used, rev == EVMC_CONSTANTINOPLE ? 5212 : 10012 );
193
+ if (rev >= EVMC_ISTANBUL)
194
+ EXPECT_EQ (gas_used, 5812 );
195
+ else if (rev == EVMC_CONSTANTINOPLE)
196
+ EXPECT_EQ (gas_used, 5212 );
197
+ else
198
+ EXPECT_EQ (gas_used, 10012 );
169
199
}
170
200
}
171
201
202
+ TEST_F (evm_state, sstore_below_stipend)
203
+ {
204
+ const auto code = sstore (0 , 0 );
205
+
206
+ rev = EVMC_HOMESTEAD;
207
+ execute (2306 , code);
208
+ EXPECT_EQ (result.status_code , EVMC_OUT_OF_GAS);
209
+
210
+ rev = EVMC_CONSTANTINOPLE;
211
+ execute (2306 , code);
212
+ EXPECT_EQ (result.status_code , EVMC_SUCCESS);
213
+
214
+ rev = EVMC_ISTANBUL;
215
+ execute (2306 , code);
216
+ EXPECT_EQ (result.status_code , EVMC_OUT_OF_GAS);
217
+
218
+ execute (2307 , code);
219
+ EXPECT_EQ (result.status_code , EVMC_SUCCESS);
220
+ }
221
+
172
222
TEST_F (evm_state, tx_context)
173
223
{
174
224
rev = EVMC_ISTANBUL;
0 commit comments