|
16 | 16 | ) |
17 | 17 | from execution_testing.forks.helpers import Fork |
18 | 18 |
|
19 | | -from .helpers import build_calldata, generous_gas |
| 19 | +from .helpers import ( |
| 20 | + CORRECT_SEL_ARGS_OFFSET, |
| 21 | + build_calldata, |
| 22 | + calldata_mem_end, |
| 23 | + generous_gas, |
| 24 | +) |
20 | 25 | from .spec import ( |
21 | 26 | GETTER_FUNCTIONS, |
22 | 27 | STAKING_PRECOMPILE, |
@@ -60,28 +65,23 @@ def test_getter_return_data( |
60 | 65 | word of the return data. |
61 | 66 | """ |
62 | 67 | num_words = func.return_size // 32 |
| 68 | + rdc_offset = calldata_mem_end(func.calldata_size) |
63 | 69 |
|
64 | | - # Build contract: call getter, store RETURNDATASIZE, then |
65 | | - # copy return data and store each word |
66 | | - ret_offset = 256 |
67 | 70 | contract = ( |
68 | 71 | build_calldata(func.selector, func.calldata_size) |
69 | 72 | + Op.SSTORE( |
70 | 73 | slot_call_success, |
71 | 74 | Op.CALL( |
72 | 75 | gas=func.gas_cost + 10000, |
73 | 76 | address=STAKING_PRECOMPILE, |
74 | | - args_offset=60, |
| 77 | + args_offset=CORRECT_SEL_ARGS_OFFSET, |
75 | 78 | args_size=func.calldata_size, |
76 | | - ret_offset=ret_offset, |
77 | | - ret_size=func.return_size, |
78 | 79 | ), |
79 | 80 | ) |
80 | 81 | + Op.SSTORE(slot_return_size, Op.RETURNDATASIZE) |
81 | 82 | ) |
82 | 83 |
|
83 | 84 | if num_words > 0: |
84 | | - rdc_offset = ret_offset + func.return_size + 32 |
85 | 85 | contract += Op.RETURNDATACOPY(rdc_offset, 0, Op.RETURNDATASIZE) |
86 | 86 | contract += Op.SSTORE(slot_return_word_base, Op.MLOAD(rdc_offset)) |
87 | 87 |
|
@@ -132,41 +132,36 @@ def test_getter_idempotent( |
132 | 132 | slot_success_1 = 0x24 |
133 | 133 | slot_success_2 = 0x25 |
134 | 134 |
|
135 | | - ret_offset_1 = 256 |
136 | | - ret_offset_2 = ret_offset_1 + func.return_size + 64 |
137 | | - |
138 | | - calldata_setup = build_calldata(func.selector, func.calldata_size) |
| 135 | + rdc_offset = calldata_mem_end(func.calldata_size) |
139 | 136 |
|
140 | 137 | contract = ( |
141 | | - calldata_setup |
| 138 | + build_calldata(func.selector, func.calldata_size) |
142 | 139 | # First call |
143 | 140 | + Op.SSTORE( |
144 | 141 | slot_success_1, |
145 | 142 | Op.CALL( |
146 | 143 | gas=func.gas_cost + 10000, |
147 | 144 | address=STAKING_PRECOMPILE, |
148 | | - args_offset=60, |
| 145 | + args_offset=CORRECT_SEL_ARGS_OFFSET, |
149 | 146 | args_size=func.calldata_size, |
150 | | - ret_offset=ret_offset_1, |
151 | | - ret_size=func.return_size, |
152 | 147 | ), |
153 | 148 | ) |
154 | 149 | + Op.SSTORE(slot_size_1, Op.RETURNDATASIZE) |
155 | | - + Op.SSTORE(slot_word_1, Op.MLOAD(ret_offset_1)) |
| 150 | + + Op.RETURNDATACOPY(rdc_offset, 0, Op.RETURNDATASIZE) |
| 151 | + + Op.SSTORE(slot_word_1, Op.MLOAD(rdc_offset)) |
156 | 152 | # Second call (same calldata still in memory) |
157 | 153 | + Op.SSTORE( |
158 | 154 | slot_success_2, |
159 | 155 | Op.CALL( |
160 | 156 | gas=func.gas_cost + 10000, |
161 | 157 | address=STAKING_PRECOMPILE, |
162 | | - args_offset=60, |
| 158 | + args_offset=CORRECT_SEL_ARGS_OFFSET, |
163 | 159 | args_size=func.calldata_size, |
164 | | - ret_offset=ret_offset_2, |
165 | | - ret_size=func.return_size, |
166 | 160 | ), |
167 | 161 | ) |
168 | 162 | + Op.SSTORE(slot_size_2, Op.RETURNDATASIZE) |
169 | | - + Op.SSTORE(slot_word_2, Op.MLOAD(ret_offset_2)) |
| 163 | + + Op.RETURNDATACOPY(rdc_offset, 0, Op.RETURNDATASIZE) |
| 164 | + + Op.SSTORE(slot_word_2, Op.MLOAD(rdc_offset)) |
170 | 165 | + Op.SSTORE(slot_code_worked, value_code_worked) |
171 | 166 | ) |
172 | 167 | contract_address = pre.deploy_contract(contract) |
|
0 commit comments