ethereum-execution 2.18.0rc6.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (816) hide show
  1. ethereum/__init__.py +30 -0
  2. ethereum/assets/blocks/block_1.json +22 -0
  3. ethereum/assets/blocks/block_1234567.json +22 -0
  4. ethereum/assets/blocks/block_12964999.json +2720 -0
  5. ethereum/assets/cache_sizes_2048_epochs.json +329 -0
  6. ethereum/assets/dataset_sizes_2048_epochs.json +412 -0
  7. ethereum/assets/mainnet.json +26711 -0
  8. ethereum/crypto/__init__.py +3 -0
  9. ethereum/crypto/blake2.py +265 -0
  10. ethereum/crypto/elliptic_curve.py +170 -0
  11. ethereum/crypto/hash.py +56 -0
  12. ethereum/crypto/kzg.py +176 -0
  13. ethereum/ethash.py +426 -0
  14. ethereum/exceptions.py +75 -0
  15. ethereum/fork_criteria.py +205 -0
  16. ethereum/forks/arrow_glacier/__init__.py +33 -0
  17. ethereum/forks/arrow_glacier/blocks.py +326 -0
  18. ethereum/forks/arrow_glacier/bloom.py +87 -0
  19. ethereum/forks/arrow_glacier/exceptions.py +58 -0
  20. ethereum/forks/arrow_glacier/fork.py +954 -0
  21. ethereum/forks/arrow_glacier/fork_types.py +62 -0
  22. ethereum/forks/arrow_glacier/state.py +644 -0
  23. ethereum/forks/arrow_glacier/transactions.py +573 -0
  24. ethereum/forks/arrow_glacier/trie.py +498 -0
  25. ethereum/forks/arrow_glacier/utils/__init__.py +3 -0
  26. ethereum/forks/arrow_glacier/utils/address.py +94 -0
  27. ethereum/forks/arrow_glacier/utils/hexadecimal.py +55 -0
  28. ethereum/forks/arrow_glacier/utils/message.py +90 -0
  29. ethereum/forks/arrow_glacier/vm/__init__.py +195 -0
  30. ethereum/forks/arrow_glacier/vm/exceptions.py +131 -0
  31. ethereum/forks/arrow_glacier/vm/gas.py +245 -0
  32. ethereum/forks/arrow_glacier/vm/instructions/__init__.py +353 -0
  33. ethereum/forks/arrow_glacier/vm/instructions/arithmetic.py +373 -0
  34. ethereum/forks/arrow_glacier/vm/instructions/bitwise.py +245 -0
  35. ethereum/forks/arrow_glacier/vm/instructions/block.py +212 -0
  36. ethereum/forks/arrow_glacier/vm/instructions/comparison.py +177 -0
  37. ethereum/forks/arrow_glacier/vm/instructions/control_flow.py +171 -0
  38. ethereum/forks/arrow_glacier/vm/instructions/environment.py +544 -0
  39. ethereum/forks/arrow_glacier/vm/instructions/keccak.py +63 -0
  40. ethereum/forks/arrow_glacier/vm/instructions/log.py +88 -0
  41. ethereum/forks/arrow_glacier/vm/instructions/memory.py +141 -0
  42. ethereum/forks/arrow_glacier/vm/instructions/stack.py +204 -0
  43. ethereum/forks/arrow_glacier/vm/instructions/storage.py +126 -0
  44. ethereum/forks/arrow_glacier/vm/instructions/system.py +694 -0
  45. ethereum/forks/arrow_glacier/vm/interpreter.py +312 -0
  46. ethereum/forks/arrow_glacier/vm/memory.py +84 -0
  47. ethereum/forks/arrow_glacier/vm/precompiled_contracts/__init__.py +37 -0
  48. ethereum/forks/arrow_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
  49. ethereum/forks/arrow_glacier/vm/precompiled_contracts/blake2f.py +42 -0
  50. ethereum/forks/arrow_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
  51. ethereum/forks/arrow_glacier/vm/precompiled_contracts/identity.py +39 -0
  52. ethereum/forks/arrow_glacier/vm/precompiled_contracts/mapping.py +46 -0
  53. ethereum/forks/arrow_glacier/vm/precompiled_contracts/modexp.py +166 -0
  54. ethereum/forks/arrow_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
  55. ethereum/forks/arrow_glacier/vm/precompiled_contracts/sha256.py +41 -0
  56. ethereum/forks/arrow_glacier/vm/runtime.py +69 -0
  57. ethereum/forks/arrow_glacier/vm/stack.py +58 -0
  58. ethereum/forks/berlin/__init__.py +43 -0
  59. ethereum/forks/berlin/blocks.py +297 -0
  60. ethereum/forks/berlin/bloom.py +87 -0
  61. ethereum/forks/berlin/exceptions.py +24 -0
  62. ethereum/forks/berlin/fork.py +839 -0
  63. ethereum/forks/berlin/fork_types.py +62 -0
  64. ethereum/forks/berlin/state.py +644 -0
  65. ethereum/forks/berlin/transactions.py +456 -0
  66. ethereum/forks/berlin/trie.py +498 -0
  67. ethereum/forks/berlin/utils/__init__.py +3 -0
  68. ethereum/forks/berlin/utils/address.py +94 -0
  69. ethereum/forks/berlin/utils/hexadecimal.py +55 -0
  70. ethereum/forks/berlin/utils/message.py +90 -0
  71. ethereum/forks/berlin/vm/__init__.py +194 -0
  72. ethereum/forks/berlin/vm/exceptions.py +123 -0
  73. ethereum/forks/berlin/vm/gas.py +246 -0
  74. ethereum/forks/berlin/vm/instructions/__init__.py +351 -0
  75. ethereum/forks/berlin/vm/instructions/arithmetic.py +373 -0
  76. ethereum/forks/berlin/vm/instructions/bitwise.py +245 -0
  77. ethereum/forks/berlin/vm/instructions/block.py +212 -0
  78. ethereum/forks/berlin/vm/instructions/comparison.py +177 -0
  79. ethereum/forks/berlin/vm/instructions/control_flow.py +171 -0
  80. ethereum/forks/berlin/vm/instructions/environment.py +521 -0
  81. ethereum/forks/berlin/vm/instructions/keccak.py +63 -0
  82. ethereum/forks/berlin/vm/instructions/log.py +88 -0
  83. ethereum/forks/berlin/vm/instructions/memory.py +141 -0
  84. ethereum/forks/berlin/vm/instructions/stack.py +204 -0
  85. ethereum/forks/berlin/vm/instructions/storage.py +126 -0
  86. ethereum/forks/berlin/vm/instructions/system.py +706 -0
  87. ethereum/forks/berlin/vm/interpreter.py +308 -0
  88. ethereum/forks/berlin/vm/memory.py +84 -0
  89. ethereum/forks/berlin/vm/precompiled_contracts/__init__.py +37 -0
  90. ethereum/forks/berlin/vm/precompiled_contracts/alt_bn128.py +230 -0
  91. ethereum/forks/berlin/vm/precompiled_contracts/blake2f.py +42 -0
  92. ethereum/forks/berlin/vm/precompiled_contracts/ecrecover.py +64 -0
  93. ethereum/forks/berlin/vm/precompiled_contracts/identity.py +39 -0
  94. ethereum/forks/berlin/vm/precompiled_contracts/mapping.py +46 -0
  95. ethereum/forks/berlin/vm/precompiled_contracts/modexp.py +166 -0
  96. ethereum/forks/berlin/vm/precompiled_contracts/ripemd160.py +44 -0
  97. ethereum/forks/berlin/vm/precompiled_contracts/sha256.py +41 -0
  98. ethereum/forks/berlin/vm/runtime.py +69 -0
  99. ethereum/forks/berlin/vm/stack.py +58 -0
  100. ethereum/forks/byzantium/__init__.py +50 -0
  101. ethereum/forks/byzantium/blocks.py +265 -0
  102. ethereum/forks/byzantium/bloom.py +87 -0
  103. ethereum/forks/byzantium/fork.py +816 -0
  104. ethereum/forks/byzantium/fork_types.py +61 -0
  105. ethereum/forks/byzantium/state.py +583 -0
  106. ethereum/forks/byzantium/transactions.py +261 -0
  107. ethereum/forks/byzantium/trie.py +498 -0
  108. ethereum/forks/byzantium/utils/__init__.py +3 -0
  109. ethereum/forks/byzantium/utils/address.py +63 -0
  110. ethereum/forks/byzantium/utils/hexadecimal.py +55 -0
  111. ethereum/forks/byzantium/utils/message.py +80 -0
  112. ethereum/forks/byzantium/vm/__init__.py +186 -0
  113. ethereum/forks/byzantium/vm/exceptions.py +123 -0
  114. ethereum/forks/byzantium/vm/gas.py +245 -0
  115. ethereum/forks/byzantium/vm/instructions/__init__.py +337 -0
  116. ethereum/forks/byzantium/vm/instructions/arithmetic.py +373 -0
  117. ethereum/forks/byzantium/vm/instructions/bitwise.py +153 -0
  118. ethereum/forks/byzantium/vm/instructions/block.py +189 -0
  119. ethereum/forks/byzantium/vm/instructions/comparison.py +177 -0
  120. ethereum/forks/byzantium/vm/instructions/control_flow.py +171 -0
  121. ethereum/forks/byzantium/vm/instructions/environment.py +436 -0
  122. ethereum/forks/byzantium/vm/instructions/keccak.py +63 -0
  123. ethereum/forks/byzantium/vm/instructions/log.py +88 -0
  124. ethereum/forks/byzantium/vm/instructions/memory.py +141 -0
  125. ethereum/forks/byzantium/vm/instructions/stack.py +204 -0
  126. ethereum/forks/byzantium/vm/instructions/storage.py +88 -0
  127. ethereum/forks/byzantium/vm/instructions/system.py +601 -0
  128. ethereum/forks/byzantium/vm/interpreter.py +299 -0
  129. ethereum/forks/byzantium/vm/memory.py +84 -0
  130. ethereum/forks/byzantium/vm/precompiled_contracts/__init__.py +36 -0
  131. ethereum/forks/byzantium/vm/precompiled_contracts/alt_bn128.py +230 -0
  132. ethereum/forks/byzantium/vm/precompiled_contracts/ecrecover.py +64 -0
  133. ethereum/forks/byzantium/vm/precompiled_contracts/identity.py +39 -0
  134. ethereum/forks/byzantium/vm/precompiled_contracts/mapping.py +43 -0
  135. ethereum/forks/byzantium/vm/precompiled_contracts/modexp.py +168 -0
  136. ethereum/forks/byzantium/vm/precompiled_contracts/ripemd160.py +44 -0
  137. ethereum/forks/byzantium/vm/precompiled_contracts/sha256.py +41 -0
  138. ethereum/forks/byzantium/vm/runtime.py +69 -0
  139. ethereum/forks/byzantium/vm/stack.py +58 -0
  140. ethereum/forks/cancun/__init__.py +49 -0
  141. ethereum/forks/cancun/blocks.py +389 -0
  142. ethereum/forks/cancun/bloom.py +87 -0
  143. ethereum/forks/cancun/exceptions.py +109 -0
  144. ethereum/forks/cancun/fork.py +881 -0
  145. ethereum/forks/cancun/fork_types.py +63 -0
  146. ethereum/forks/cancun/state.py +667 -0
  147. ethereum/forks/cancun/transactions.py +721 -0
  148. ethereum/forks/cancun/trie.py +508 -0
  149. ethereum/forks/cancun/utils/__init__.py +3 -0
  150. ethereum/forks/cancun/utils/address.py +94 -0
  151. ethereum/forks/cancun/utils/hexadecimal.py +55 -0
  152. ethereum/forks/cancun/utils/message.py +90 -0
  153. ethereum/forks/cancun/vm/__init__.py +186 -0
  154. ethereum/forks/cancun/vm/exceptions.py +139 -0
  155. ethereum/forks/cancun/vm/gas.py +372 -0
  156. ethereum/forks/cancun/vm/instructions/__init__.py +365 -0
  157. ethereum/forks/cancun/vm/instructions/arithmetic.py +373 -0
  158. ethereum/forks/cancun/vm/instructions/bitwise.py +245 -0
  159. ethereum/forks/cancun/vm/instructions/block.py +261 -0
  160. ethereum/forks/cancun/vm/instructions/comparison.py +177 -0
  161. ethereum/forks/cancun/vm/instructions/control_flow.py +171 -0
  162. ethereum/forks/cancun/vm/instructions/environment.py +600 -0
  163. ethereum/forks/cancun/vm/instructions/keccak.py +63 -0
  164. ethereum/forks/cancun/vm/instructions/log.py +88 -0
  165. ethereum/forks/cancun/vm/instructions/memory.py +177 -0
  166. ethereum/forks/cancun/vm/instructions/stack.py +208 -0
  167. ethereum/forks/cancun/vm/instructions/storage.py +188 -0
  168. ethereum/forks/cancun/vm/instructions/system.py +708 -0
  169. ethereum/forks/cancun/vm/interpreter.py +302 -0
  170. ethereum/forks/cancun/vm/memory.py +84 -0
  171. ethereum/forks/cancun/vm/precompiled_contracts/__init__.py +39 -0
  172. ethereum/forks/cancun/vm/precompiled_contracts/alt_bn128.py +230 -0
  173. ethereum/forks/cancun/vm/precompiled_contracts/blake2f.py +42 -0
  174. ethereum/forks/cancun/vm/precompiled_contracts/ecrecover.py +64 -0
  175. ethereum/forks/cancun/vm/precompiled_contracts/identity.py +39 -0
  176. ethereum/forks/cancun/vm/precompiled_contracts/mapping.py +49 -0
  177. ethereum/forks/cancun/vm/precompiled_contracts/modexp.py +166 -0
  178. ethereum/forks/cancun/vm/precompiled_contracts/point_evaluation.py +72 -0
  179. ethereum/forks/cancun/vm/precompiled_contracts/ripemd160.py +44 -0
  180. ethereum/forks/cancun/vm/precompiled_contracts/sha256.py +41 -0
  181. ethereum/forks/cancun/vm/runtime.py +69 -0
  182. ethereum/forks/cancun/vm/stack.py +58 -0
  183. ethereum/forks/constantinople/__init__.py +51 -0
  184. ethereum/forks/constantinople/blocks.py +265 -0
  185. ethereum/forks/constantinople/bloom.py +87 -0
  186. ethereum/forks/constantinople/fork.py +816 -0
  187. ethereum/forks/constantinople/fork_types.py +62 -0
  188. ethereum/forks/constantinople/state.py +583 -0
  189. ethereum/forks/constantinople/transactions.py +261 -0
  190. ethereum/forks/constantinople/trie.py +498 -0
  191. ethereum/forks/constantinople/utils/__init__.py +3 -0
  192. ethereum/forks/constantinople/utils/address.py +93 -0
  193. ethereum/forks/constantinople/utils/hexadecimal.py +55 -0
  194. ethereum/forks/constantinople/utils/message.py +80 -0
  195. ethereum/forks/constantinople/vm/__init__.py +186 -0
  196. ethereum/forks/constantinople/vm/exceptions.py +123 -0
  197. ethereum/forks/constantinople/vm/gas.py +246 -0
  198. ethereum/forks/constantinople/vm/instructions/__init__.py +347 -0
  199. ethereum/forks/constantinople/vm/instructions/arithmetic.py +373 -0
  200. ethereum/forks/constantinople/vm/instructions/bitwise.py +245 -0
  201. ethereum/forks/constantinople/vm/instructions/block.py +189 -0
  202. ethereum/forks/constantinople/vm/instructions/comparison.py +177 -0
  203. ethereum/forks/constantinople/vm/instructions/control_flow.py +171 -0
  204. ethereum/forks/constantinople/vm/instructions/environment.py +470 -0
  205. ethereum/forks/constantinople/vm/instructions/keccak.py +63 -0
  206. ethereum/forks/constantinople/vm/instructions/log.py +88 -0
  207. ethereum/forks/constantinople/vm/instructions/memory.py +141 -0
  208. ethereum/forks/constantinople/vm/instructions/stack.py +204 -0
  209. ethereum/forks/constantinople/vm/instructions/storage.py +88 -0
  210. ethereum/forks/constantinople/vm/instructions/system.py +673 -0
  211. ethereum/forks/constantinople/vm/interpreter.py +300 -0
  212. ethereum/forks/constantinople/vm/memory.py +84 -0
  213. ethereum/forks/constantinople/vm/precompiled_contracts/__init__.py +36 -0
  214. ethereum/forks/constantinople/vm/precompiled_contracts/alt_bn128.py +230 -0
  215. ethereum/forks/constantinople/vm/precompiled_contracts/ecrecover.py +64 -0
  216. ethereum/forks/constantinople/vm/precompiled_contracts/identity.py +39 -0
  217. ethereum/forks/constantinople/vm/precompiled_contracts/mapping.py +43 -0
  218. ethereum/forks/constantinople/vm/precompiled_contracts/modexp.py +168 -0
  219. ethereum/forks/constantinople/vm/precompiled_contracts/ripemd160.py +44 -0
  220. ethereum/forks/constantinople/vm/precompiled_contracts/sha256.py +41 -0
  221. ethereum/forks/constantinople/vm/runtime.py +69 -0
  222. ethereum/forks/constantinople/vm/stack.py +58 -0
  223. ethereum/forks/dao_fork/__init__.py +29 -0
  224. ethereum/forks/dao_fork/blocks.py +265 -0
  225. ethereum/forks/dao_fork/bloom.py +87 -0
  226. ethereum/forks/dao_fork/dao.py +357 -0
  227. ethereum/forks/dao_fork/fork.py +816 -0
  228. ethereum/forks/dao_fork/fork_types.py +62 -0
  229. ethereum/forks/dao_fork/state.py +515 -0
  230. ethereum/forks/dao_fork/transactions.py +227 -0
  231. ethereum/forks/dao_fork/trie.py +498 -0
  232. ethereum/forks/dao_fork/utils/__init__.py +3 -0
  233. ethereum/forks/dao_fork/utils/address.py +62 -0
  234. ethereum/forks/dao_fork/utils/hexadecimal.py +55 -0
  235. ethereum/forks/dao_fork/utils/message.py +78 -0
  236. ethereum/forks/dao_fork/vm/__init__.py +163 -0
  237. ethereum/forks/dao_fork/vm/exceptions.py +86 -0
  238. ethereum/forks/dao_fork/vm/gas.py +212 -0
  239. ethereum/forks/dao_fork/vm/instructions/__init__.py +329 -0
  240. ethereum/forks/dao_fork/vm/instructions/arithmetic.py +373 -0
  241. ethereum/forks/dao_fork/vm/instructions/bitwise.py +153 -0
  242. ethereum/forks/dao_fork/vm/instructions/block.py +189 -0
  243. ethereum/forks/dao_fork/vm/instructions/comparison.py +177 -0
  244. ethereum/forks/dao_fork/vm/instructions/control_flow.py +171 -0
  245. ethereum/forks/dao_fork/vm/instructions/environment.py +376 -0
  246. ethereum/forks/dao_fork/vm/instructions/keccak.py +63 -0
  247. ethereum/forks/dao_fork/vm/instructions/log.py +85 -0
  248. ethereum/forks/dao_fork/vm/instructions/memory.py +141 -0
  249. ethereum/forks/dao_fork/vm/instructions/stack.py +204 -0
  250. ethereum/forks/dao_fork/vm/instructions/storage.py +87 -0
  251. ethereum/forks/dao_fork/vm/instructions/system.py +457 -0
  252. ethereum/forks/dao_fork/vm/interpreter.py +274 -0
  253. ethereum/forks/dao_fork/vm/memory.py +84 -0
  254. ethereum/forks/dao_fork/vm/precompiled_contracts/__init__.py +27 -0
  255. ethereum/forks/dao_fork/vm/precompiled_contracts/ecrecover.py +64 -0
  256. ethereum/forks/dao_fork/vm/precompiled_contracts/identity.py +39 -0
  257. ethereum/forks/dao_fork/vm/precompiled_contracts/mapping.py +33 -0
  258. ethereum/forks/dao_fork/vm/precompiled_contracts/ripemd160.py +44 -0
  259. ethereum/forks/dao_fork/vm/precompiled_contracts/sha256.py +41 -0
  260. ethereum/forks/dao_fork/vm/runtime.py +69 -0
  261. ethereum/forks/dao_fork/vm/stack.py +58 -0
  262. ethereum/forks/frontier/__init__.py +7 -0
  263. ethereum/forks/frontier/blocks.py +265 -0
  264. ethereum/forks/frontier/bloom.py +87 -0
  265. ethereum/forks/frontier/fork.py +789 -0
  266. ethereum/forks/frontier/fork_types.py +62 -0
  267. ethereum/forks/frontier/state.py +515 -0
  268. ethereum/forks/frontier/transactions.py +216 -0
  269. ethereum/forks/frontier/trie.py +499 -0
  270. ethereum/forks/frontier/utils/__init__.py +3 -0
  271. ethereum/forks/frontier/utils/address.py +62 -0
  272. ethereum/forks/frontier/utils/hexadecimal.py +55 -0
  273. ethereum/forks/frontier/utils/message.py +77 -0
  274. ethereum/forks/frontier/vm/__init__.py +162 -0
  275. ethereum/forks/frontier/vm/exceptions.py +86 -0
  276. ethereum/forks/frontier/vm/gas.py +212 -0
  277. ethereum/forks/frontier/vm/instructions/__init__.py +327 -0
  278. ethereum/forks/frontier/vm/instructions/arithmetic.py +373 -0
  279. ethereum/forks/frontier/vm/instructions/bitwise.py +153 -0
  280. ethereum/forks/frontier/vm/instructions/block.py +189 -0
  281. ethereum/forks/frontier/vm/instructions/comparison.py +177 -0
  282. ethereum/forks/frontier/vm/instructions/control_flow.py +171 -0
  283. ethereum/forks/frontier/vm/instructions/environment.py +376 -0
  284. ethereum/forks/frontier/vm/instructions/keccak.py +63 -0
  285. ethereum/forks/frontier/vm/instructions/log.py +85 -0
  286. ethereum/forks/frontier/vm/instructions/memory.py +141 -0
  287. ethereum/forks/frontier/vm/instructions/stack.py +204 -0
  288. ethereum/forks/frontier/vm/instructions/storage.py +87 -0
  289. ethereum/forks/frontier/vm/instructions/system.py +403 -0
  290. ethereum/forks/frontier/vm/interpreter.py +272 -0
  291. ethereum/forks/frontier/vm/memory.py +84 -0
  292. ethereum/forks/frontier/vm/precompiled_contracts/__init__.py +27 -0
  293. ethereum/forks/frontier/vm/precompiled_contracts/ecrecover.py +64 -0
  294. ethereum/forks/frontier/vm/precompiled_contracts/identity.py +39 -0
  295. ethereum/forks/frontier/vm/precompiled_contracts/mapping.py +33 -0
  296. ethereum/forks/frontier/vm/precompiled_contracts/ripemd160.py +44 -0
  297. ethereum/forks/frontier/vm/precompiled_contracts/sha256.py +41 -0
  298. ethereum/forks/frontier/vm/runtime.py +69 -0
  299. ethereum/forks/frontier/vm/stack.py +58 -0
  300. ethereum/forks/gray_glacier/__init__.py +34 -0
  301. ethereum/forks/gray_glacier/blocks.py +326 -0
  302. ethereum/forks/gray_glacier/bloom.py +87 -0
  303. ethereum/forks/gray_glacier/exceptions.py +58 -0
  304. ethereum/forks/gray_glacier/fork.py +954 -0
  305. ethereum/forks/gray_glacier/fork_types.py +62 -0
  306. ethereum/forks/gray_glacier/state.py +644 -0
  307. ethereum/forks/gray_glacier/transactions.py +573 -0
  308. ethereum/forks/gray_glacier/trie.py +498 -0
  309. ethereum/forks/gray_glacier/utils/__init__.py +3 -0
  310. ethereum/forks/gray_glacier/utils/address.py +94 -0
  311. ethereum/forks/gray_glacier/utils/hexadecimal.py +55 -0
  312. ethereum/forks/gray_glacier/utils/message.py +90 -0
  313. ethereum/forks/gray_glacier/vm/__init__.py +195 -0
  314. ethereum/forks/gray_glacier/vm/exceptions.py +131 -0
  315. ethereum/forks/gray_glacier/vm/gas.py +245 -0
  316. ethereum/forks/gray_glacier/vm/instructions/__init__.py +353 -0
  317. ethereum/forks/gray_glacier/vm/instructions/arithmetic.py +373 -0
  318. ethereum/forks/gray_glacier/vm/instructions/bitwise.py +245 -0
  319. ethereum/forks/gray_glacier/vm/instructions/block.py +212 -0
  320. ethereum/forks/gray_glacier/vm/instructions/comparison.py +177 -0
  321. ethereum/forks/gray_glacier/vm/instructions/control_flow.py +171 -0
  322. ethereum/forks/gray_glacier/vm/instructions/environment.py +544 -0
  323. ethereum/forks/gray_glacier/vm/instructions/keccak.py +63 -0
  324. ethereum/forks/gray_glacier/vm/instructions/log.py +88 -0
  325. ethereum/forks/gray_glacier/vm/instructions/memory.py +141 -0
  326. ethereum/forks/gray_glacier/vm/instructions/stack.py +204 -0
  327. ethereum/forks/gray_glacier/vm/instructions/storage.py +126 -0
  328. ethereum/forks/gray_glacier/vm/instructions/system.py +694 -0
  329. ethereum/forks/gray_glacier/vm/interpreter.py +312 -0
  330. ethereum/forks/gray_glacier/vm/memory.py +84 -0
  331. ethereum/forks/gray_glacier/vm/precompiled_contracts/__init__.py +37 -0
  332. ethereum/forks/gray_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
  333. ethereum/forks/gray_glacier/vm/precompiled_contracts/blake2f.py +42 -0
  334. ethereum/forks/gray_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
  335. ethereum/forks/gray_glacier/vm/precompiled_contracts/identity.py +39 -0
  336. ethereum/forks/gray_glacier/vm/precompiled_contracts/mapping.py +46 -0
  337. ethereum/forks/gray_glacier/vm/precompiled_contracts/modexp.py +166 -0
  338. ethereum/forks/gray_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
  339. ethereum/forks/gray_glacier/vm/precompiled_contracts/sha256.py +41 -0
  340. ethereum/forks/gray_glacier/vm/runtime.py +69 -0
  341. ethereum/forks/gray_glacier/vm/stack.py +58 -0
  342. ethereum/forks/homestead/__init__.py +34 -0
  343. ethereum/forks/homestead/blocks.py +265 -0
  344. ethereum/forks/homestead/bloom.py +87 -0
  345. ethereum/forks/homestead/fork.py +798 -0
  346. ethereum/forks/homestead/fork_types.py +62 -0
  347. ethereum/forks/homestead/state.py +515 -0
  348. ethereum/forks/homestead/transactions.py +227 -0
  349. ethereum/forks/homestead/trie.py +498 -0
  350. ethereum/forks/homestead/utils/__init__.py +3 -0
  351. ethereum/forks/homestead/utils/address.py +62 -0
  352. ethereum/forks/homestead/utils/hexadecimal.py +55 -0
  353. ethereum/forks/homestead/utils/message.py +78 -0
  354. ethereum/forks/homestead/vm/__init__.py +163 -0
  355. ethereum/forks/homestead/vm/exceptions.py +86 -0
  356. ethereum/forks/homestead/vm/gas.py +212 -0
  357. ethereum/forks/homestead/vm/instructions/__init__.py +329 -0
  358. ethereum/forks/homestead/vm/instructions/arithmetic.py +373 -0
  359. ethereum/forks/homestead/vm/instructions/bitwise.py +153 -0
  360. ethereum/forks/homestead/vm/instructions/block.py +189 -0
  361. ethereum/forks/homestead/vm/instructions/comparison.py +177 -0
  362. ethereum/forks/homestead/vm/instructions/control_flow.py +171 -0
  363. ethereum/forks/homestead/vm/instructions/environment.py +376 -0
  364. ethereum/forks/homestead/vm/instructions/keccak.py +63 -0
  365. ethereum/forks/homestead/vm/instructions/log.py +85 -0
  366. ethereum/forks/homestead/vm/instructions/memory.py +141 -0
  367. ethereum/forks/homestead/vm/instructions/stack.py +204 -0
  368. ethereum/forks/homestead/vm/instructions/storage.py +87 -0
  369. ethereum/forks/homestead/vm/instructions/system.py +457 -0
  370. ethereum/forks/homestead/vm/interpreter.py +274 -0
  371. ethereum/forks/homestead/vm/memory.py +84 -0
  372. ethereum/forks/homestead/vm/precompiled_contracts/__init__.py +27 -0
  373. ethereum/forks/homestead/vm/precompiled_contracts/ecrecover.py +64 -0
  374. ethereum/forks/homestead/vm/precompiled_contracts/identity.py +39 -0
  375. ethereum/forks/homestead/vm/precompiled_contracts/mapping.py +33 -0
  376. ethereum/forks/homestead/vm/precompiled_contracts/ripemd160.py +44 -0
  377. ethereum/forks/homestead/vm/precompiled_contracts/sha256.py +41 -0
  378. ethereum/forks/homestead/vm/runtime.py +69 -0
  379. ethereum/forks/homestead/vm/stack.py +58 -0
  380. ethereum/forks/istanbul/__init__.py +53 -0
  381. ethereum/forks/istanbul/blocks.py +265 -0
  382. ethereum/forks/istanbul/bloom.py +87 -0
  383. ethereum/forks/istanbul/fork.py +816 -0
  384. ethereum/forks/istanbul/fork_types.py +62 -0
  385. ethereum/forks/istanbul/state.py +644 -0
  386. ethereum/forks/istanbul/transactions.py +261 -0
  387. ethereum/forks/istanbul/trie.py +498 -0
  388. ethereum/forks/istanbul/utils/__init__.py +3 -0
  389. ethereum/forks/istanbul/utils/address.py +94 -0
  390. ethereum/forks/istanbul/utils/hexadecimal.py +55 -0
  391. ethereum/forks/istanbul/utils/message.py +80 -0
  392. ethereum/forks/istanbul/vm/__init__.py +186 -0
  393. ethereum/forks/istanbul/vm/exceptions.py +123 -0
  394. ethereum/forks/istanbul/vm/gas.py +248 -0
  395. ethereum/forks/istanbul/vm/instructions/__init__.py +351 -0
  396. ethereum/forks/istanbul/vm/instructions/arithmetic.py +373 -0
  397. ethereum/forks/istanbul/vm/instructions/bitwise.py +245 -0
  398. ethereum/forks/istanbul/vm/instructions/block.py +212 -0
  399. ethereum/forks/istanbul/vm/instructions/comparison.py +177 -0
  400. ethereum/forks/istanbul/vm/instructions/control_flow.py +171 -0
  401. ethereum/forks/istanbul/vm/instructions/environment.py +499 -0
  402. ethereum/forks/istanbul/vm/instructions/keccak.py +63 -0
  403. ethereum/forks/istanbul/vm/instructions/log.py +88 -0
  404. ethereum/forks/istanbul/vm/instructions/memory.py +141 -0
  405. ethereum/forks/istanbul/vm/instructions/stack.py +204 -0
  406. ethereum/forks/istanbul/vm/instructions/storage.py +113 -0
  407. ethereum/forks/istanbul/vm/instructions/system.py +673 -0
  408. ethereum/forks/istanbul/vm/interpreter.py +306 -0
  409. ethereum/forks/istanbul/vm/memory.py +84 -0
  410. ethereum/forks/istanbul/vm/precompiled_contracts/__init__.py +37 -0
  411. ethereum/forks/istanbul/vm/precompiled_contracts/alt_bn128.py +230 -0
  412. ethereum/forks/istanbul/vm/precompiled_contracts/blake2f.py +42 -0
  413. ethereum/forks/istanbul/vm/precompiled_contracts/ecrecover.py +64 -0
  414. ethereum/forks/istanbul/vm/precompiled_contracts/identity.py +39 -0
  415. ethereum/forks/istanbul/vm/precompiled_contracts/mapping.py +46 -0
  416. ethereum/forks/istanbul/vm/precompiled_contracts/modexp.py +168 -0
  417. ethereum/forks/istanbul/vm/precompiled_contracts/ripemd160.py +44 -0
  418. ethereum/forks/istanbul/vm/precompiled_contracts/sha256.py +41 -0
  419. ethereum/forks/istanbul/vm/runtime.py +69 -0
  420. ethereum/forks/istanbul/vm/stack.py +58 -0
  421. ethereum/forks/london/__init__.py +48 -0
  422. ethereum/forks/london/blocks.py +326 -0
  423. ethereum/forks/london/bloom.py +87 -0
  424. ethereum/forks/london/exceptions.py +58 -0
  425. ethereum/forks/london/fork.py +960 -0
  426. ethereum/forks/london/fork_types.py +62 -0
  427. ethereum/forks/london/state.py +644 -0
  428. ethereum/forks/london/transactions.py +573 -0
  429. ethereum/forks/london/trie.py +498 -0
  430. ethereum/forks/london/utils/__init__.py +3 -0
  431. ethereum/forks/london/utils/address.py +94 -0
  432. ethereum/forks/london/utils/hexadecimal.py +55 -0
  433. ethereum/forks/london/utils/message.py +90 -0
  434. ethereum/forks/london/vm/__init__.py +195 -0
  435. ethereum/forks/london/vm/exceptions.py +131 -0
  436. ethereum/forks/london/vm/gas.py +245 -0
  437. ethereum/forks/london/vm/instructions/__init__.py +353 -0
  438. ethereum/forks/london/vm/instructions/arithmetic.py +373 -0
  439. ethereum/forks/london/vm/instructions/bitwise.py +245 -0
  440. ethereum/forks/london/vm/instructions/block.py +212 -0
  441. ethereum/forks/london/vm/instructions/comparison.py +177 -0
  442. ethereum/forks/london/vm/instructions/control_flow.py +171 -0
  443. ethereum/forks/london/vm/instructions/environment.py +544 -0
  444. ethereum/forks/london/vm/instructions/keccak.py +63 -0
  445. ethereum/forks/london/vm/instructions/log.py +88 -0
  446. ethereum/forks/london/vm/instructions/memory.py +141 -0
  447. ethereum/forks/london/vm/instructions/stack.py +204 -0
  448. ethereum/forks/london/vm/instructions/storage.py +126 -0
  449. ethereum/forks/london/vm/instructions/system.py +694 -0
  450. ethereum/forks/london/vm/interpreter.py +312 -0
  451. ethereum/forks/london/vm/memory.py +84 -0
  452. ethereum/forks/london/vm/precompiled_contracts/__init__.py +37 -0
  453. ethereum/forks/london/vm/precompiled_contracts/alt_bn128.py +230 -0
  454. ethereum/forks/london/vm/precompiled_contracts/blake2f.py +42 -0
  455. ethereum/forks/london/vm/precompiled_contracts/ecrecover.py +64 -0
  456. ethereum/forks/london/vm/precompiled_contracts/identity.py +39 -0
  457. ethereum/forks/london/vm/precompiled_contracts/mapping.py +46 -0
  458. ethereum/forks/london/vm/precompiled_contracts/modexp.py +166 -0
  459. ethereum/forks/london/vm/precompiled_contracts/ripemd160.py +44 -0
  460. ethereum/forks/london/vm/precompiled_contracts/sha256.py +41 -0
  461. ethereum/forks/london/vm/runtime.py +69 -0
  462. ethereum/forks/london/vm/stack.py +58 -0
  463. ethereum/forks/muir_glacier/__init__.py +38 -0
  464. ethereum/forks/muir_glacier/blocks.py +265 -0
  465. ethereum/forks/muir_glacier/bloom.py +87 -0
  466. ethereum/forks/muir_glacier/fork.py +818 -0
  467. ethereum/forks/muir_glacier/fork_types.py +62 -0
  468. ethereum/forks/muir_glacier/state.py +644 -0
  469. ethereum/forks/muir_glacier/transactions.py +261 -0
  470. ethereum/forks/muir_glacier/trie.py +498 -0
  471. ethereum/forks/muir_glacier/utils/__init__.py +3 -0
  472. ethereum/forks/muir_glacier/utils/address.py +94 -0
  473. ethereum/forks/muir_glacier/utils/hexadecimal.py +55 -0
  474. ethereum/forks/muir_glacier/utils/message.py +80 -0
  475. ethereum/forks/muir_glacier/vm/__init__.py +186 -0
  476. ethereum/forks/muir_glacier/vm/exceptions.py +123 -0
  477. ethereum/forks/muir_glacier/vm/gas.py +248 -0
  478. ethereum/forks/muir_glacier/vm/instructions/__init__.py +351 -0
  479. ethereum/forks/muir_glacier/vm/instructions/arithmetic.py +373 -0
  480. ethereum/forks/muir_glacier/vm/instructions/bitwise.py +245 -0
  481. ethereum/forks/muir_glacier/vm/instructions/block.py +212 -0
  482. ethereum/forks/muir_glacier/vm/instructions/comparison.py +177 -0
  483. ethereum/forks/muir_glacier/vm/instructions/control_flow.py +171 -0
  484. ethereum/forks/muir_glacier/vm/instructions/environment.py +499 -0
  485. ethereum/forks/muir_glacier/vm/instructions/keccak.py +63 -0
  486. ethereum/forks/muir_glacier/vm/instructions/log.py +88 -0
  487. ethereum/forks/muir_glacier/vm/instructions/memory.py +141 -0
  488. ethereum/forks/muir_glacier/vm/instructions/stack.py +204 -0
  489. ethereum/forks/muir_glacier/vm/instructions/storage.py +113 -0
  490. ethereum/forks/muir_glacier/vm/instructions/system.py +673 -0
  491. ethereum/forks/muir_glacier/vm/interpreter.py +306 -0
  492. ethereum/forks/muir_glacier/vm/memory.py +84 -0
  493. ethereum/forks/muir_glacier/vm/precompiled_contracts/__init__.py +37 -0
  494. ethereum/forks/muir_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
  495. ethereum/forks/muir_glacier/vm/precompiled_contracts/blake2f.py +42 -0
  496. ethereum/forks/muir_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
  497. ethereum/forks/muir_glacier/vm/precompiled_contracts/identity.py +39 -0
  498. ethereum/forks/muir_glacier/vm/precompiled_contracts/mapping.py +46 -0
  499. ethereum/forks/muir_glacier/vm/precompiled_contracts/modexp.py +168 -0
  500. ethereum/forks/muir_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
  501. ethereum/forks/muir_glacier/vm/precompiled_contracts/sha256.py +41 -0
  502. ethereum/forks/muir_glacier/vm/runtime.py +69 -0
  503. ethereum/forks/muir_glacier/vm/stack.py +58 -0
  504. ethereum/forks/osaka/__init__.py +55 -0
  505. ethereum/forks/osaka/blocks.py +405 -0
  506. ethereum/forks/osaka/bloom.py +87 -0
  507. ethereum/forks/osaka/exceptions.py +131 -0
  508. ethereum/forks/osaka/fork.py +1059 -0
  509. ethereum/forks/osaka/fork_types.py +78 -0
  510. ethereum/forks/osaka/requests.py +191 -0
  511. ethereum/forks/osaka/state.py +667 -0
  512. ethereum/forks/osaka/transactions.py +887 -0
  513. ethereum/forks/osaka/trie.py +508 -0
  514. ethereum/forks/osaka/utils/__init__.py +3 -0
  515. ethereum/forks/osaka/utils/address.py +94 -0
  516. ethereum/forks/osaka/utils/hexadecimal.py +55 -0
  517. ethereum/forks/osaka/utils/message.py +90 -0
  518. ethereum/forks/osaka/vm/__init__.py +191 -0
  519. ethereum/forks/osaka/vm/eoa_delegation.py +211 -0
  520. ethereum/forks/osaka/vm/exceptions.py +139 -0
  521. ethereum/forks/osaka/vm/gas.py +396 -0
  522. ethereum/forks/osaka/vm/instructions/__init__.py +367 -0
  523. ethereum/forks/osaka/vm/instructions/arithmetic.py +373 -0
  524. ethereum/forks/osaka/vm/instructions/bitwise.py +274 -0
  525. ethereum/forks/osaka/vm/instructions/block.py +261 -0
  526. ethereum/forks/osaka/vm/instructions/comparison.py +177 -0
  527. ethereum/forks/osaka/vm/instructions/control_flow.py +171 -0
  528. ethereum/forks/osaka/vm/instructions/environment.py +600 -0
  529. ethereum/forks/osaka/vm/instructions/keccak.py +63 -0
  530. ethereum/forks/osaka/vm/instructions/log.py +88 -0
  531. ethereum/forks/osaka/vm/instructions/memory.py +177 -0
  532. ethereum/forks/osaka/vm/instructions/stack.py +208 -0
  533. ethereum/forks/osaka/vm/instructions/storage.py +188 -0
  534. ethereum/forks/osaka/vm/instructions/system.py +751 -0
  535. ethereum/forks/osaka/vm/interpreter.py +324 -0
  536. ethereum/forks/osaka/vm/memory.py +83 -0
  537. ethereum/forks/osaka/vm/precompiled_contracts/__init__.py +55 -0
  538. ethereum/forks/osaka/vm/precompiled_contracts/alt_bn128.py +230 -0
  539. ethereum/forks/osaka/vm/precompiled_contracts/blake2f.py +42 -0
  540. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/__init__.py +622 -0
  541. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +151 -0
  542. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +153 -0
  543. ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_pairing.py +69 -0
  544. ethereum/forks/osaka/vm/precompiled_contracts/ecrecover.py +64 -0
  545. ethereum/forks/osaka/vm/precompiled_contracts/identity.py +39 -0
  546. ethereum/forks/osaka/vm/precompiled_contracts/mapping.py +77 -0
  547. ethereum/forks/osaka/vm/precompiled_contracts/modexp.py +175 -0
  548. ethereum/forks/osaka/vm/precompiled_contracts/p256verify.py +89 -0
  549. ethereum/forks/osaka/vm/precompiled_contracts/point_evaluation.py +72 -0
  550. ethereum/forks/osaka/vm/precompiled_contracts/ripemd160.py +44 -0
  551. ethereum/forks/osaka/vm/precompiled_contracts/sha256.py +41 -0
  552. ethereum/forks/osaka/vm/runtime.py +69 -0
  553. ethereum/forks/osaka/vm/stack.py +58 -0
  554. ethereum/forks/paris/__init__.py +43 -0
  555. ethereum/forks/paris/blocks.py +312 -0
  556. ethereum/forks/paris/bloom.py +87 -0
  557. ethereum/forks/paris/exceptions.py +58 -0
  558. ethereum/forks/paris/fork.py +651 -0
  559. ethereum/forks/paris/fork_types.py +62 -0
  560. ethereum/forks/paris/state.py +571 -0
  561. ethereum/forks/paris/transactions.py +573 -0
  562. ethereum/forks/paris/trie.py +498 -0
  563. ethereum/forks/paris/utils/__init__.py +3 -0
  564. ethereum/forks/paris/utils/address.py +94 -0
  565. ethereum/forks/paris/utils/hexadecimal.py +55 -0
  566. ethereum/forks/paris/utils/message.py +90 -0
  567. ethereum/forks/paris/vm/__init__.py +174 -0
  568. ethereum/forks/paris/vm/exceptions.py +131 -0
  569. ethereum/forks/paris/vm/gas.py +245 -0
  570. ethereum/forks/paris/vm/instructions/__init__.py +353 -0
  571. ethereum/forks/paris/vm/instructions/arithmetic.py +373 -0
  572. ethereum/forks/paris/vm/instructions/bitwise.py +245 -0
  573. ethereum/forks/paris/vm/instructions/block.py +261 -0
  574. ethereum/forks/paris/vm/instructions/comparison.py +177 -0
  575. ethereum/forks/paris/vm/instructions/control_flow.py +171 -0
  576. ethereum/forks/paris/vm/instructions/environment.py +544 -0
  577. ethereum/forks/paris/vm/instructions/keccak.py +63 -0
  578. ethereum/forks/paris/vm/instructions/log.py +88 -0
  579. ethereum/forks/paris/vm/instructions/memory.py +141 -0
  580. ethereum/forks/paris/vm/instructions/stack.py +204 -0
  581. ethereum/forks/paris/vm/instructions/storage.py +126 -0
  582. ethereum/forks/paris/vm/instructions/system.py +689 -0
  583. ethereum/forks/paris/vm/interpreter.py +298 -0
  584. ethereum/forks/paris/vm/memory.py +84 -0
  585. ethereum/forks/paris/vm/precompiled_contracts/__init__.py +37 -0
  586. ethereum/forks/paris/vm/precompiled_contracts/alt_bn128.py +230 -0
  587. ethereum/forks/paris/vm/precompiled_contracts/blake2f.py +42 -0
  588. ethereum/forks/paris/vm/precompiled_contracts/ecrecover.py +64 -0
  589. ethereum/forks/paris/vm/precompiled_contracts/identity.py +39 -0
  590. ethereum/forks/paris/vm/precompiled_contracts/mapping.py +46 -0
  591. ethereum/forks/paris/vm/precompiled_contracts/modexp.py +166 -0
  592. ethereum/forks/paris/vm/precompiled_contracts/ripemd160.py +44 -0
  593. ethereum/forks/paris/vm/precompiled_contracts/sha256.py +41 -0
  594. ethereum/forks/paris/vm/runtime.py +69 -0
  595. ethereum/forks/paris/vm/stack.py +58 -0
  596. ethereum/forks/prague/__init__.py +54 -0
  597. ethereum/forks/prague/blocks.py +405 -0
  598. ethereum/forks/prague/bloom.py +87 -0
  599. ethereum/forks/prague/exceptions.py +115 -0
  600. ethereum/forks/prague/fork.py +1044 -0
  601. ethereum/forks/prague/fork_types.py +78 -0
  602. ethereum/forks/prague/requests.py +191 -0
  603. ethereum/forks/prague/state.py +667 -0
  604. ethereum/forks/prague/transactions.py +879 -0
  605. ethereum/forks/prague/trie.py +508 -0
  606. ethereum/forks/prague/utils/__init__.py +3 -0
  607. ethereum/forks/prague/utils/address.py +94 -0
  608. ethereum/forks/prague/utils/hexadecimal.py +55 -0
  609. ethereum/forks/prague/utils/message.py +90 -0
  610. ethereum/forks/prague/vm/__init__.py +191 -0
  611. ethereum/forks/prague/vm/eoa_delegation.py +211 -0
  612. ethereum/forks/prague/vm/exceptions.py +139 -0
  613. ethereum/forks/prague/vm/gas.py +379 -0
  614. ethereum/forks/prague/vm/instructions/__init__.py +365 -0
  615. ethereum/forks/prague/vm/instructions/arithmetic.py +373 -0
  616. ethereum/forks/prague/vm/instructions/bitwise.py +245 -0
  617. ethereum/forks/prague/vm/instructions/block.py +261 -0
  618. ethereum/forks/prague/vm/instructions/comparison.py +177 -0
  619. ethereum/forks/prague/vm/instructions/control_flow.py +171 -0
  620. ethereum/forks/prague/vm/instructions/environment.py +600 -0
  621. ethereum/forks/prague/vm/instructions/keccak.py +63 -0
  622. ethereum/forks/prague/vm/instructions/log.py +88 -0
  623. ethereum/forks/prague/vm/instructions/memory.py +177 -0
  624. ethereum/forks/prague/vm/instructions/stack.py +208 -0
  625. ethereum/forks/prague/vm/instructions/storage.py +188 -0
  626. ethereum/forks/prague/vm/instructions/system.py +751 -0
  627. ethereum/forks/prague/vm/interpreter.py +324 -0
  628. ethereum/forks/prague/vm/memory.py +83 -0
  629. ethereum/forks/prague/vm/precompiled_contracts/__init__.py +53 -0
  630. ethereum/forks/prague/vm/precompiled_contracts/alt_bn128.py +230 -0
  631. ethereum/forks/prague/vm/precompiled_contracts/blake2f.py +42 -0
  632. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/__init__.py +622 -0
  633. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +151 -0
  634. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +153 -0
  635. ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_pairing.py +69 -0
  636. ethereum/forks/prague/vm/precompiled_contracts/ecrecover.py +64 -0
  637. ethereum/forks/prague/vm/precompiled_contracts/identity.py +39 -0
  638. ethereum/forks/prague/vm/precompiled_contracts/mapping.py +74 -0
  639. ethereum/forks/prague/vm/precompiled_contracts/modexp.py +166 -0
  640. ethereum/forks/prague/vm/precompiled_contracts/point_evaluation.py +72 -0
  641. ethereum/forks/prague/vm/precompiled_contracts/ripemd160.py +44 -0
  642. ethereum/forks/prague/vm/precompiled_contracts/sha256.py +41 -0
  643. ethereum/forks/prague/vm/runtime.py +69 -0
  644. ethereum/forks/prague/vm/stack.py +58 -0
  645. ethereum/forks/shanghai/__init__.py +47 -0
  646. ethereum/forks/shanghai/blocks.py +360 -0
  647. ethereum/forks/shanghai/bloom.py +87 -0
  648. ethereum/forks/shanghai/exceptions.py +64 -0
  649. ethereum/forks/shanghai/fork.py +686 -0
  650. ethereum/forks/shanghai/fork_types.py +62 -0
  651. ethereum/forks/shanghai/state.py +571 -0
  652. ethereum/forks/shanghai/transactions.py +585 -0
  653. ethereum/forks/shanghai/trie.py +508 -0
  654. ethereum/forks/shanghai/utils/__init__.py +3 -0
  655. ethereum/forks/shanghai/utils/address.py +94 -0
  656. ethereum/forks/shanghai/utils/hexadecimal.py +55 -0
  657. ethereum/forks/shanghai/utils/message.py +90 -0
  658. ethereum/forks/shanghai/vm/__init__.py +179 -0
  659. ethereum/forks/shanghai/vm/exceptions.py +131 -0
  660. ethereum/forks/shanghai/vm/gas.py +266 -0
  661. ethereum/forks/shanghai/vm/instructions/__init__.py +355 -0
  662. ethereum/forks/shanghai/vm/instructions/arithmetic.py +373 -0
  663. ethereum/forks/shanghai/vm/instructions/bitwise.py +245 -0
  664. ethereum/forks/shanghai/vm/instructions/block.py +261 -0
  665. ethereum/forks/shanghai/vm/instructions/comparison.py +177 -0
  666. ethereum/forks/shanghai/vm/instructions/control_flow.py +171 -0
  667. ethereum/forks/shanghai/vm/instructions/environment.py +544 -0
  668. ethereum/forks/shanghai/vm/instructions/keccak.py +63 -0
  669. ethereum/forks/shanghai/vm/instructions/log.py +88 -0
  670. ethereum/forks/shanghai/vm/instructions/memory.py +141 -0
  671. ethereum/forks/shanghai/vm/instructions/stack.py +208 -0
  672. ethereum/forks/shanghai/vm/instructions/storage.py +126 -0
  673. ethereum/forks/shanghai/vm/instructions/system.py +709 -0
  674. ethereum/forks/shanghai/vm/interpreter.py +299 -0
  675. ethereum/forks/shanghai/vm/memory.py +84 -0
  676. ethereum/forks/shanghai/vm/precompiled_contracts/__init__.py +37 -0
  677. ethereum/forks/shanghai/vm/precompiled_contracts/alt_bn128.py +230 -0
  678. ethereum/forks/shanghai/vm/precompiled_contracts/blake2f.py +42 -0
  679. ethereum/forks/shanghai/vm/precompiled_contracts/ecrecover.py +64 -0
  680. ethereum/forks/shanghai/vm/precompiled_contracts/identity.py +39 -0
  681. ethereum/forks/shanghai/vm/precompiled_contracts/mapping.py +46 -0
  682. ethereum/forks/shanghai/vm/precompiled_contracts/modexp.py +166 -0
  683. ethereum/forks/shanghai/vm/precompiled_contracts/ripemd160.py +44 -0
  684. ethereum/forks/shanghai/vm/precompiled_contracts/sha256.py +41 -0
  685. ethereum/forks/shanghai/vm/runtime.py +69 -0
  686. ethereum/forks/shanghai/vm/stack.py +58 -0
  687. ethereum/forks/spurious_dragon/__init__.py +38 -0
  688. ethereum/forks/spurious_dragon/blocks.py +265 -0
  689. ethereum/forks/spurious_dragon/bloom.py +87 -0
  690. ethereum/forks/spurious_dragon/fork.py +807 -0
  691. ethereum/forks/spurious_dragon/fork_types.py +62 -0
  692. ethereum/forks/spurious_dragon/state.py +583 -0
  693. ethereum/forks/spurious_dragon/transactions.py +261 -0
  694. ethereum/forks/spurious_dragon/trie.py +498 -0
  695. ethereum/forks/spurious_dragon/utils/__init__.py +3 -0
  696. ethereum/forks/spurious_dragon/utils/address.py +63 -0
  697. ethereum/forks/spurious_dragon/utils/hexadecimal.py +55 -0
  698. ethereum/forks/spurious_dragon/utils/message.py +79 -0
  699. ethereum/forks/spurious_dragon/vm/__init__.py +184 -0
  700. ethereum/forks/spurious_dragon/vm/exceptions.py +86 -0
  701. ethereum/forks/spurious_dragon/vm/gas.py +244 -0
  702. ethereum/forks/spurious_dragon/vm/instructions/__init__.py +329 -0
  703. ethereum/forks/spurious_dragon/vm/instructions/arithmetic.py +373 -0
  704. ethereum/forks/spurious_dragon/vm/instructions/bitwise.py +153 -0
  705. ethereum/forks/spurious_dragon/vm/instructions/block.py +189 -0
  706. ethereum/forks/spurious_dragon/vm/instructions/comparison.py +177 -0
  707. ethereum/forks/spurious_dragon/vm/instructions/control_flow.py +171 -0
  708. ethereum/forks/spurious_dragon/vm/instructions/environment.py +376 -0
  709. ethereum/forks/spurious_dragon/vm/instructions/keccak.py +63 -0
  710. ethereum/forks/spurious_dragon/vm/instructions/log.py +85 -0
  711. ethereum/forks/spurious_dragon/vm/instructions/memory.py +141 -0
  712. ethereum/forks/spurious_dragon/vm/instructions/stack.py +204 -0
  713. ethereum/forks/spurious_dragon/vm/instructions/storage.py +87 -0
  714. ethereum/forks/spurious_dragon/vm/instructions/system.py +491 -0
  715. ethereum/forks/spurious_dragon/vm/interpreter.py +292 -0
  716. ethereum/forks/spurious_dragon/vm/memory.py +84 -0
  717. ethereum/forks/spurious_dragon/vm/precompiled_contracts/__init__.py +27 -0
  718. ethereum/forks/spurious_dragon/vm/precompiled_contracts/ecrecover.py +64 -0
  719. ethereum/forks/spurious_dragon/vm/precompiled_contracts/identity.py +39 -0
  720. ethereum/forks/spurious_dragon/vm/precompiled_contracts/mapping.py +33 -0
  721. ethereum/forks/spurious_dragon/vm/precompiled_contracts/ripemd160.py +44 -0
  722. ethereum/forks/spurious_dragon/vm/precompiled_contracts/sha256.py +41 -0
  723. ethereum/forks/spurious_dragon/vm/runtime.py +69 -0
  724. ethereum/forks/spurious_dragon/vm/stack.py +58 -0
  725. ethereum/forks/tangerine_whistle/__init__.py +32 -0
  726. ethereum/forks/tangerine_whistle/blocks.py +265 -0
  727. ethereum/forks/tangerine_whistle/bloom.py +87 -0
  728. ethereum/forks/tangerine_whistle/fork.py +798 -0
  729. ethereum/forks/tangerine_whistle/fork_types.py +62 -0
  730. ethereum/forks/tangerine_whistle/state.py +515 -0
  731. ethereum/forks/tangerine_whistle/transactions.py +227 -0
  732. ethereum/forks/tangerine_whistle/trie.py +498 -0
  733. ethereum/forks/tangerine_whistle/utils/__init__.py +3 -0
  734. ethereum/forks/tangerine_whistle/utils/address.py +63 -0
  735. ethereum/forks/tangerine_whistle/utils/hexadecimal.py +55 -0
  736. ethereum/forks/tangerine_whistle/utils/message.py +79 -0
  737. ethereum/forks/tangerine_whistle/vm/__init__.py +163 -0
  738. ethereum/forks/tangerine_whistle/vm/exceptions.py +86 -0
  739. ethereum/forks/tangerine_whistle/vm/gas.py +244 -0
  740. ethereum/forks/tangerine_whistle/vm/instructions/__init__.py +329 -0
  741. ethereum/forks/tangerine_whistle/vm/instructions/arithmetic.py +373 -0
  742. ethereum/forks/tangerine_whistle/vm/instructions/bitwise.py +153 -0
  743. ethereum/forks/tangerine_whistle/vm/instructions/block.py +189 -0
  744. ethereum/forks/tangerine_whistle/vm/instructions/comparison.py +177 -0
  745. ethereum/forks/tangerine_whistle/vm/instructions/control_flow.py +171 -0
  746. ethereum/forks/tangerine_whistle/vm/instructions/environment.py +376 -0
  747. ethereum/forks/tangerine_whistle/vm/instructions/keccak.py +63 -0
  748. ethereum/forks/tangerine_whistle/vm/instructions/log.py +85 -0
  749. ethereum/forks/tangerine_whistle/vm/instructions/memory.py +141 -0
  750. ethereum/forks/tangerine_whistle/vm/instructions/stack.py +204 -0
  751. ethereum/forks/tangerine_whistle/vm/instructions/storage.py +87 -0
  752. ethereum/forks/tangerine_whistle/vm/instructions/system.py +480 -0
  753. ethereum/forks/tangerine_whistle/vm/interpreter.py +274 -0
  754. ethereum/forks/tangerine_whistle/vm/memory.py +84 -0
  755. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/__init__.py +27 -0
  756. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/ecrecover.py +64 -0
  757. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/identity.py +39 -0
  758. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/mapping.py +33 -0
  759. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/ripemd160.py +44 -0
  760. ethereum/forks/tangerine_whistle/vm/precompiled_contracts/sha256.py +41 -0
  761. ethereum/forks/tangerine_whistle/vm/runtime.py +69 -0
  762. ethereum/forks/tangerine_whistle/vm/stack.py +58 -0
  763. ethereum/genesis.py +279 -0
  764. ethereum/py.typed +0 -0
  765. ethereum/trace.py +252 -0
  766. ethereum/utils/__init__.py +18 -0
  767. ethereum/utils/byte.py +59 -0
  768. ethereum/utils/hexadecimal.py +221 -0
  769. ethereum/utils/numeric.py +208 -0
  770. ethereum_execution-2.18.0rc6.dev2.dist-info/METADATA +113 -0
  771. ethereum_execution-2.18.0rc6.dev2.dist-info/RECORD +816 -0
  772. ethereum_execution-2.18.0rc6.dev2.dist-info/WHEEL +5 -0
  773. ethereum_execution-2.18.0rc6.dev2.dist-info/entry_points.txt +17 -0
  774. ethereum_execution-2.18.0rc6.dev2.dist-info/licenses/LICENSE.md +35 -0
  775. ethereum_execution-2.18.0rc6.dev2.dist-info/top_level.txt +3 -0
  776. ethereum_optimized/__init__.py +78 -0
  777. ethereum_optimized/fork.py +72 -0
  778. ethereum_optimized/state_db.py +444 -0
  779. ethereum_optimized/utils.py +26 -0
  780. ethereum_spec_tools/__init__.py +6 -0
  781. ethereum_spec_tools/docc.py +1135 -0
  782. ethereum_spec_tools/evm_tools/__init__.py +119 -0
  783. ethereum_spec_tools/evm_tools/__main__.py +7 -0
  784. ethereum_spec_tools/evm_tools/b11r/__init__.py +143 -0
  785. ethereum_spec_tools/evm_tools/b11r/b11r_types.py +173 -0
  786. ethereum_spec_tools/evm_tools/daemon.py +202 -0
  787. ethereum_spec_tools/evm_tools/loaders/__init__.py +3 -0
  788. ethereum_spec_tools/evm_tools/loaders/fixture_loader.py +190 -0
  789. ethereum_spec_tools/evm_tools/loaders/fork_loader.py +320 -0
  790. ethereum_spec_tools/evm_tools/loaders/transaction_loader.py +208 -0
  791. ethereum_spec_tools/evm_tools/statetest/__init__.py +291 -0
  792. ethereum_spec_tools/evm_tools/t8n/__init__.py +402 -0
  793. ethereum_spec_tools/evm_tools/t8n/env.py +320 -0
  794. ethereum_spec_tools/evm_tools/t8n/evm_trace/__init__.py +5 -0
  795. ethereum_spec_tools/evm_tools/t8n/evm_trace/count.py +47 -0
  796. ethereum_spec_tools/evm_tools/t8n/evm_trace/eip3155.py +333 -0
  797. ethereum_spec_tools/evm_tools/t8n/evm_trace/group.py +39 -0
  798. ethereum_spec_tools/evm_tools/t8n/evm_trace/protocols.py +54 -0
  799. ethereum_spec_tools/evm_tools/t8n/t8n_types.py +393 -0
  800. ethereum_spec_tools/evm_tools/utils.py +187 -0
  801. ethereum_spec_tools/forks.py +302 -0
  802. ethereum_spec_tools/lint/__init__.py +195 -0
  803. ethereum_spec_tools/lint/__main__.py +11 -0
  804. ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py +273 -0
  805. ethereum_spec_tools/lint/lints/import_hygiene.py +145 -0
  806. ethereum_spec_tools/lint/lints/patch_hygiene.py +161 -0
  807. ethereum_spec_tools/new_fork/__init__.py +4 -0
  808. ethereum_spec_tools/new_fork/builder.py +430 -0
  809. ethereum_spec_tools/new_fork/cli.py +216 -0
  810. ethereum_spec_tools/new_fork/codemod/__init__.py +3 -0
  811. ethereum_spec_tools/new_fork/codemod/comment.py +79 -0
  812. ethereum_spec_tools/new_fork/codemod/constant.py +141 -0
  813. ethereum_spec_tools/new_fork/codemod/string.py +79 -0
  814. ethereum_spec_tools/patch_tool.py +78 -0
  815. ethereum_spec_tools/py.typed +0 -0
  816. ethereum_spec_tools/sync.py +1016 -0
@@ -0,0 +1,1059 @@
1
+ """
2
+ Ethereum Specification.
3
+
4
+ .. contents:: Table of Contents
5
+ :backlinks: none
6
+ :local:
7
+
8
+ Introduction
9
+ ------------
10
+
11
+ Entry point for the Ethereum specification.
12
+ """
13
+
14
+ from dataclasses import dataclass
15
+ from typing import List, Optional, Tuple
16
+
17
+ from ethereum_rlp import rlp
18
+ from ethereum_types.bytes import Bytes
19
+ from ethereum_types.numeric import U64, U256, Uint
20
+
21
+ from ethereum.crypto.hash import Hash32, keccak256
22
+ from ethereum.exceptions import (
23
+ EthereumException,
24
+ GasUsedExceedsLimitError,
25
+ InsufficientBalanceError,
26
+ InvalidBlock,
27
+ InvalidSenderError,
28
+ NonceMismatchError,
29
+ )
30
+
31
+ from . import vm
32
+ from .blocks import Block, Header, Log, Receipt, Withdrawal, encode_receipt
33
+ from .bloom import logs_bloom
34
+ from .exceptions import (
35
+ BlobCountExceededError,
36
+ BlobGasLimitExceededError,
37
+ EmptyAuthorizationListError,
38
+ InsufficientMaxFeePerBlobGasError,
39
+ InsufficientMaxFeePerGasError,
40
+ InvalidBlobVersionedHashError,
41
+ NoBlobDataError,
42
+ PriorityFeeGreaterThanMaxFeeError,
43
+ TransactionTypeContractCreationError,
44
+ )
45
+ from .fork_types import Account, Address, Authorization, VersionedHash
46
+ from .requests import (
47
+ CONSOLIDATION_REQUEST_TYPE,
48
+ DEPOSIT_REQUEST_TYPE,
49
+ WITHDRAWAL_REQUEST_TYPE,
50
+ compute_requests_hash,
51
+ parse_deposit_requests,
52
+ )
53
+ from .state import (
54
+ State,
55
+ TransientStorage,
56
+ destroy_account,
57
+ get_account,
58
+ increment_nonce,
59
+ modify_state,
60
+ set_account_balance,
61
+ state_root,
62
+ )
63
+ from .transactions import (
64
+ AccessListTransaction,
65
+ BlobTransaction,
66
+ FeeMarketTransaction,
67
+ LegacyTransaction,
68
+ SetCodeTransaction,
69
+ Transaction,
70
+ decode_transaction,
71
+ encode_transaction,
72
+ get_transaction_hash,
73
+ recover_sender,
74
+ validate_transaction,
75
+ )
76
+ from .trie import root, trie_set
77
+ from .utils.hexadecimal import hex_to_address
78
+ from .utils.message import prepare_message
79
+ from .vm import Message
80
+ from .vm.eoa_delegation import is_valid_delegation
81
+ from .vm.gas import (
82
+ calculate_blob_gas_price,
83
+ calculate_data_fee,
84
+ calculate_excess_blob_gas,
85
+ calculate_total_blob_gas,
86
+ )
87
+ from .vm.interpreter import MessageCallOutput, process_message_call
88
+
89
+ BASE_FEE_MAX_CHANGE_DENOMINATOR = Uint(8)
90
+ ELASTICITY_MULTIPLIER = Uint(2)
91
+ GAS_LIMIT_ADJUSTMENT_FACTOR = Uint(1024)
92
+ GAS_LIMIT_MINIMUM = Uint(5000)
93
+ EMPTY_OMMER_HASH = keccak256(rlp.encode([]))
94
+ SYSTEM_ADDRESS = hex_to_address("0xfffffffffffffffffffffffffffffffffffffffe")
95
+ BEACON_ROOTS_ADDRESS = hex_to_address(
96
+ "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02"
97
+ )
98
+ SYSTEM_TRANSACTION_GAS = Uint(30000000)
99
+ MAX_BLOB_GAS_PER_BLOCK = U64(1179648)
100
+ VERSIONED_HASH_VERSION_KZG = b"\x01"
101
+
102
+ WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS = hex_to_address(
103
+ "0x00000961Ef480Eb55e80D19ad83579A64c007002"
104
+ )
105
+ CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS = hex_to_address(
106
+ "0x0000BBdDc7CE488642fb579F8B00f3a590007251"
107
+ )
108
+ HISTORY_STORAGE_ADDRESS = hex_to_address(
109
+ "0x0000F90827F1C53a10cb7A02335B175320002935"
110
+ )
111
+ MAX_BLOCK_SIZE = 10_485_760
112
+ SAFETY_MARGIN = 2_097_152
113
+ MAX_RLP_BLOCK_SIZE = MAX_BLOCK_SIZE - SAFETY_MARGIN
114
+ BLOB_COUNT_LIMIT = 6
115
+
116
+
117
+ @dataclass
118
+ class BlockChain:
119
+ """
120
+ History and current state of the block chain.
121
+ """
122
+
123
+ blocks: List[Block]
124
+ state: State
125
+ chain_id: U64
126
+
127
+
128
+ def apply_fork(old: BlockChain) -> BlockChain:
129
+ """
130
+ Transforms the state from the previous hard fork (`old`) into the block
131
+ chain object for this hard fork and returns it.
132
+
133
+ When forks need to implement an irregular state transition, this function
134
+ is used to handle the irregularity. See the :ref:`DAO Fork <dao-fork>` for
135
+ an example.
136
+
137
+ Parameters
138
+ ----------
139
+ old :
140
+ Previous block chain object.
141
+
142
+ Returns
143
+ -------
144
+ new : `BlockChain`
145
+ Upgraded block chain object for this hard fork.
146
+
147
+ """
148
+ return old
149
+
150
+
151
+ def get_last_256_block_hashes(chain: BlockChain) -> List[Hash32]:
152
+ """
153
+ Obtain the list of hashes of the previous 256 blocks in order of
154
+ increasing block number.
155
+
156
+ This function will return less hashes for the first 256 blocks.
157
+
158
+ The ``BLOCKHASH`` opcode needs to access the latest hashes on the chain,
159
+ therefore this function retrieves them.
160
+
161
+ Parameters
162
+ ----------
163
+ chain :
164
+ History and current state.
165
+
166
+ Returns
167
+ -------
168
+ recent_block_hashes : `List[Hash32]`
169
+ Hashes of the recent 256 blocks in order of increasing block number.
170
+
171
+ """
172
+ recent_blocks = chain.blocks[-255:]
173
+ # TODO: This function has not been tested rigorously
174
+ if len(recent_blocks) == 0:
175
+ return []
176
+
177
+ recent_block_hashes = []
178
+
179
+ for block in recent_blocks:
180
+ prev_block_hash = block.header.parent_hash
181
+ recent_block_hashes.append(prev_block_hash)
182
+
183
+ # We are computing the hash only for the most recent block and not for
184
+ # the rest of the blocks as they have successors which have the hash of
185
+ # the current block as parent hash.
186
+ most_recent_block_hash = keccak256(rlp.encode(recent_blocks[-1].header))
187
+ recent_block_hashes.append(most_recent_block_hash)
188
+
189
+ return recent_block_hashes
190
+
191
+
192
+ def state_transition(chain: BlockChain, block: Block) -> None:
193
+ """
194
+ Attempts to apply a block to an existing block chain.
195
+
196
+ All parts of the block's contents need to be verified before being added
197
+ to the chain. Blocks are verified by ensuring that the contents of the
198
+ block make logical sense with the contents of the parent block. The
199
+ information in the block's header must also match the corresponding
200
+ information in the block.
201
+
202
+ To implement Ethereum, in theory clients are only required to store the
203
+ most recent 255 blocks of the chain since as far as execution is
204
+ concerned, only those blocks are accessed. Practically, however, clients
205
+ should store more blocks to handle reorgs.
206
+
207
+ Parameters
208
+ ----------
209
+ chain :
210
+ History and current state.
211
+ block :
212
+ Block to apply to `chain`.
213
+
214
+ """
215
+ if len(rlp.encode(block)) > MAX_RLP_BLOCK_SIZE:
216
+ raise InvalidBlock("Block rlp size exceeds MAX_RLP_BLOCK_SIZE")
217
+
218
+ validate_header(chain, block.header)
219
+ if block.ommers != ():
220
+ raise InvalidBlock
221
+
222
+ block_env = vm.BlockEnvironment(
223
+ chain_id=chain.chain_id,
224
+ state=chain.state,
225
+ block_gas_limit=block.header.gas_limit,
226
+ block_hashes=get_last_256_block_hashes(chain),
227
+ coinbase=block.header.coinbase,
228
+ number=block.header.number,
229
+ base_fee_per_gas=block.header.base_fee_per_gas,
230
+ time=block.header.timestamp,
231
+ prev_randao=block.header.prev_randao,
232
+ excess_blob_gas=block.header.excess_blob_gas,
233
+ parent_beacon_block_root=block.header.parent_beacon_block_root,
234
+ )
235
+
236
+ block_output = apply_body(
237
+ block_env=block_env,
238
+ transactions=block.transactions,
239
+ withdrawals=block.withdrawals,
240
+ )
241
+ block_state_root = state_root(block_env.state)
242
+ transactions_root = root(block_output.transactions_trie)
243
+ receipt_root = root(block_output.receipts_trie)
244
+ block_logs_bloom = logs_bloom(block_output.block_logs)
245
+ withdrawals_root = root(block_output.withdrawals_trie)
246
+ requests_hash = compute_requests_hash(block_output.requests)
247
+
248
+ if block_output.block_gas_used != block.header.gas_used:
249
+ raise InvalidBlock(
250
+ f"{block_output.block_gas_used} != {block.header.gas_used}"
251
+ )
252
+ if transactions_root != block.header.transactions_root:
253
+ raise InvalidBlock
254
+ if block_state_root != block.header.state_root:
255
+ raise InvalidBlock
256
+ if receipt_root != block.header.receipt_root:
257
+ raise InvalidBlock
258
+ if block_logs_bloom != block.header.bloom:
259
+ raise InvalidBlock
260
+ if withdrawals_root != block.header.withdrawals_root:
261
+ raise InvalidBlock
262
+ if block_output.blob_gas_used != block.header.blob_gas_used:
263
+ raise InvalidBlock
264
+ if requests_hash != block.header.requests_hash:
265
+ raise InvalidBlock
266
+
267
+ chain.blocks.append(block)
268
+ if len(chain.blocks) > 255:
269
+ # Real clients have to store more blocks to deal with reorgs, but the
270
+ # protocol only requires the last 255
271
+ chain.blocks = chain.blocks[-255:]
272
+
273
+
274
+ def calculate_base_fee_per_gas(
275
+ block_gas_limit: Uint,
276
+ parent_gas_limit: Uint,
277
+ parent_gas_used: Uint,
278
+ parent_base_fee_per_gas: Uint,
279
+ ) -> Uint:
280
+ """
281
+ Calculates the base fee per gas for the block.
282
+
283
+ Parameters
284
+ ----------
285
+ block_gas_limit :
286
+ Gas limit of the block for which the base fee is being calculated.
287
+ parent_gas_limit :
288
+ Gas limit of the parent block.
289
+ parent_gas_used :
290
+ Gas used in the parent block.
291
+ parent_base_fee_per_gas :
292
+ Base fee per gas of the parent block.
293
+
294
+ Returns
295
+ -------
296
+ base_fee_per_gas : `Uint`
297
+ Base fee per gas for the block.
298
+
299
+ """
300
+ parent_gas_target = parent_gas_limit // ELASTICITY_MULTIPLIER
301
+ if not check_gas_limit(block_gas_limit, parent_gas_limit):
302
+ raise InvalidBlock
303
+
304
+ if parent_gas_used == parent_gas_target:
305
+ expected_base_fee_per_gas = parent_base_fee_per_gas
306
+ elif parent_gas_used > parent_gas_target:
307
+ gas_used_delta = parent_gas_used - parent_gas_target
308
+
309
+ parent_fee_gas_delta = parent_base_fee_per_gas * gas_used_delta
310
+ target_fee_gas_delta = parent_fee_gas_delta // parent_gas_target
311
+
312
+ base_fee_per_gas_delta = max(
313
+ target_fee_gas_delta // BASE_FEE_MAX_CHANGE_DENOMINATOR,
314
+ Uint(1),
315
+ )
316
+
317
+ expected_base_fee_per_gas = (
318
+ parent_base_fee_per_gas + base_fee_per_gas_delta
319
+ )
320
+ else:
321
+ gas_used_delta = parent_gas_target - parent_gas_used
322
+
323
+ parent_fee_gas_delta = parent_base_fee_per_gas * gas_used_delta
324
+ target_fee_gas_delta = parent_fee_gas_delta // parent_gas_target
325
+
326
+ base_fee_per_gas_delta = (
327
+ target_fee_gas_delta // BASE_FEE_MAX_CHANGE_DENOMINATOR
328
+ )
329
+
330
+ expected_base_fee_per_gas = (
331
+ parent_base_fee_per_gas - base_fee_per_gas_delta
332
+ )
333
+
334
+ return Uint(expected_base_fee_per_gas)
335
+
336
+
337
+ def validate_header(chain: BlockChain, header: Header) -> None:
338
+ """
339
+ Verifies a block header.
340
+
341
+ In order to consider a block's header valid, the logic for the
342
+ quantities in the header should match the logic for the block itself.
343
+ For example the header timestamp should be greater than the block's parent
344
+ timestamp because the block was created *after* the parent block.
345
+ Additionally, the block's number should be directly following the parent
346
+ block's number since it is the next block in the sequence.
347
+
348
+ Parameters
349
+ ----------
350
+ chain :
351
+ History and current state.
352
+ header :
353
+ Header to check for correctness.
354
+
355
+ """
356
+ if header.number < Uint(1):
357
+ raise InvalidBlock
358
+
359
+ parent_header = chain.blocks[-1].header
360
+
361
+ excess_blob_gas = calculate_excess_blob_gas(parent_header)
362
+ if header.excess_blob_gas != excess_blob_gas:
363
+ raise InvalidBlock
364
+
365
+ if header.gas_used > header.gas_limit:
366
+ raise InvalidBlock
367
+
368
+ expected_base_fee_per_gas = calculate_base_fee_per_gas(
369
+ header.gas_limit,
370
+ parent_header.gas_limit,
371
+ parent_header.gas_used,
372
+ parent_header.base_fee_per_gas,
373
+ )
374
+ if expected_base_fee_per_gas != header.base_fee_per_gas:
375
+ raise InvalidBlock
376
+ if header.timestamp <= parent_header.timestamp:
377
+ raise InvalidBlock
378
+ if header.number != parent_header.number + Uint(1):
379
+ raise InvalidBlock
380
+ if len(header.extra_data) > 32:
381
+ raise InvalidBlock
382
+ if header.difficulty != 0:
383
+ raise InvalidBlock
384
+ if header.nonce != b"\x00\x00\x00\x00\x00\x00\x00\x00":
385
+ raise InvalidBlock
386
+ if header.ommers_hash != EMPTY_OMMER_HASH:
387
+ raise InvalidBlock
388
+
389
+ block_parent_hash = keccak256(rlp.encode(parent_header))
390
+ if header.parent_hash != block_parent_hash:
391
+ raise InvalidBlock
392
+
393
+
394
+ def check_transaction(
395
+ block_env: vm.BlockEnvironment,
396
+ block_output: vm.BlockOutput,
397
+ tx: Transaction,
398
+ ) -> Tuple[Address, Uint, Tuple[VersionedHash, ...], U64]:
399
+ """
400
+ Check if the transaction is includable in the block.
401
+
402
+ Parameters
403
+ ----------
404
+ block_env :
405
+ The block scoped environment.
406
+ block_output :
407
+ The block output for the current block.
408
+ tx :
409
+ The transaction.
410
+
411
+ Returns
412
+ -------
413
+ sender_address :
414
+ The sender of the transaction.
415
+ effective_gas_price :
416
+ The price to charge for gas when the transaction is executed.
417
+ blob_versioned_hashes :
418
+ The blob versioned hashes of the transaction.
419
+ tx_blob_gas_used:
420
+ The blob gas used by the transaction.
421
+
422
+ Raises
423
+ ------
424
+ InvalidBlock :
425
+ If the transaction is not includable.
426
+ GasUsedExceedsLimitError :
427
+ If the gas used by the transaction exceeds the block's gas limit.
428
+ NonceMismatchError :
429
+ If the nonce of the transaction is not equal to the sender's nonce.
430
+ InsufficientBalanceError :
431
+ If the sender's balance is not enough to pay for the transaction.
432
+ InvalidSenderError :
433
+ If the transaction is from an address that does not exist anymore.
434
+ PriorityFeeGreaterThanMaxFeeError :
435
+ If the priority fee is greater than the maximum fee per gas.
436
+ InsufficientMaxFeePerGasError :
437
+ If the maximum fee per gas is insufficient for the transaction.
438
+ InsufficientMaxFeePerBlobGasError :
439
+ If the maximum fee per blob gas is insufficient for the transaction.
440
+ BlobGasLimitExceededError :
441
+ If the blob gas used by the transaction exceeds the block's blob gas
442
+ limit.
443
+ InvalidBlobVersionedHashError :
444
+ If the transaction contains a blob versioned hash with an invalid
445
+ version.
446
+ NoBlobDataError :
447
+ If the transaction is a type 3 but has no blobs.
448
+ BlobCountExceededError :
449
+ If the transaction is a type 3 and has more blobs than the limit.
450
+ TransactionTypeContractCreationError:
451
+ If the transaction type is not allowed to create contracts.
452
+ EmptyAuthorizationListError :
453
+ If the transaction is a SetCodeTransaction and the authorization list
454
+ is empty.
455
+
456
+ """
457
+ gas_available = block_env.block_gas_limit - block_output.block_gas_used
458
+ blob_gas_available = MAX_BLOB_GAS_PER_BLOCK - block_output.blob_gas_used
459
+
460
+ if tx.gas > gas_available:
461
+ raise GasUsedExceedsLimitError("gas used exceeds limit")
462
+
463
+ tx_blob_gas_used = calculate_total_blob_gas(tx)
464
+ if tx_blob_gas_used > blob_gas_available:
465
+ raise BlobGasLimitExceededError("blob gas limit exceeded")
466
+
467
+ sender_address = recover_sender(block_env.chain_id, tx)
468
+ sender_account = get_account(block_env.state, sender_address)
469
+
470
+ if isinstance(
471
+ tx, (FeeMarketTransaction, BlobTransaction, SetCodeTransaction)
472
+ ):
473
+ if tx.max_fee_per_gas < tx.max_priority_fee_per_gas:
474
+ raise PriorityFeeGreaterThanMaxFeeError(
475
+ "priority fee greater than max fee"
476
+ )
477
+ if tx.max_fee_per_gas < block_env.base_fee_per_gas:
478
+ raise InsufficientMaxFeePerGasError(
479
+ tx.max_fee_per_gas, block_env.base_fee_per_gas
480
+ )
481
+
482
+ priority_fee_per_gas = min(
483
+ tx.max_priority_fee_per_gas,
484
+ tx.max_fee_per_gas - block_env.base_fee_per_gas,
485
+ )
486
+ effective_gas_price = priority_fee_per_gas + block_env.base_fee_per_gas
487
+ max_gas_fee = tx.gas * tx.max_fee_per_gas
488
+ else:
489
+ if tx.gas_price < block_env.base_fee_per_gas:
490
+ raise InvalidBlock
491
+ effective_gas_price = tx.gas_price
492
+ max_gas_fee = tx.gas * tx.gas_price
493
+
494
+ if isinstance(tx, BlobTransaction):
495
+ blob_count = len(tx.blob_versioned_hashes)
496
+ if blob_count == 0:
497
+ raise NoBlobDataError("no blob data in transaction")
498
+ if blob_count > BLOB_COUNT_LIMIT:
499
+ raise BlobCountExceededError(
500
+ f"Tx has {blob_count} blobs. Max allowed: {BLOB_COUNT_LIMIT}"
501
+ )
502
+ for blob_versioned_hash in tx.blob_versioned_hashes:
503
+ if blob_versioned_hash[0:1] != VERSIONED_HASH_VERSION_KZG:
504
+ raise InvalidBlobVersionedHashError(
505
+ "invalid blob versioned hash"
506
+ )
507
+
508
+ blob_gas_price = calculate_blob_gas_price(block_env.excess_blob_gas)
509
+ if Uint(tx.max_fee_per_blob_gas) < blob_gas_price:
510
+ raise InsufficientMaxFeePerBlobGasError(
511
+ "insufficient max fee per blob gas"
512
+ )
513
+
514
+ max_gas_fee += Uint(calculate_total_blob_gas(tx)) * Uint(
515
+ tx.max_fee_per_blob_gas
516
+ )
517
+ blob_versioned_hashes = tx.blob_versioned_hashes
518
+ else:
519
+ blob_versioned_hashes = ()
520
+
521
+ if isinstance(tx, (BlobTransaction, SetCodeTransaction)):
522
+ if not isinstance(tx.to, Address):
523
+ raise TransactionTypeContractCreationError(tx)
524
+
525
+ if isinstance(tx, SetCodeTransaction):
526
+ if not any(tx.authorizations):
527
+ raise EmptyAuthorizationListError("empty authorization list")
528
+
529
+ if sender_account.nonce > Uint(tx.nonce):
530
+ raise NonceMismatchError("nonce too low")
531
+ elif sender_account.nonce < Uint(tx.nonce):
532
+ raise NonceMismatchError("nonce too high")
533
+
534
+ if Uint(sender_account.balance) < max_gas_fee + Uint(tx.value):
535
+ raise InsufficientBalanceError("insufficient sender balance")
536
+ if sender_account.code and not is_valid_delegation(sender_account.code):
537
+ raise InvalidSenderError("not EOA")
538
+
539
+ return (
540
+ sender_address,
541
+ effective_gas_price,
542
+ blob_versioned_hashes,
543
+ tx_blob_gas_used,
544
+ )
545
+
546
+
547
+ def make_receipt(
548
+ tx: Transaction,
549
+ error: Optional[EthereumException],
550
+ cumulative_gas_used: Uint,
551
+ logs: Tuple[Log, ...],
552
+ ) -> Bytes | Receipt:
553
+ """
554
+ Make the receipt for a transaction that was executed.
555
+
556
+ Parameters
557
+ ----------
558
+ tx :
559
+ The executed transaction.
560
+ error :
561
+ Error in the top level frame of the transaction, if any.
562
+ cumulative_gas_used :
563
+ The total gas used so far in the block after the transaction was
564
+ executed.
565
+ logs :
566
+ The logs produced by the transaction.
567
+
568
+ Returns
569
+ -------
570
+ receipt :
571
+ The receipt for the transaction.
572
+
573
+ """
574
+ receipt = Receipt(
575
+ succeeded=error is None,
576
+ cumulative_gas_used=cumulative_gas_used,
577
+ bloom=logs_bloom(logs),
578
+ logs=logs,
579
+ )
580
+
581
+ return encode_receipt(tx, receipt)
582
+
583
+
584
+ def process_system_transaction(
585
+ block_env: vm.BlockEnvironment,
586
+ target_address: Address,
587
+ system_contract_code: Bytes,
588
+ data: Bytes,
589
+ ) -> MessageCallOutput:
590
+ """
591
+ Process a system transaction with the given code.
592
+
593
+ Prefer calling `process_checked_system_transaction` or
594
+ `process_unchecked_system_transaction` depending on whether missing code or
595
+ an execution error should cause the block to be rejected.
596
+
597
+ Parameters
598
+ ----------
599
+ block_env :
600
+ The block scoped environment.
601
+ target_address :
602
+ Address of the contract to call.
603
+ system_contract_code :
604
+ Code of the contract to call.
605
+ data :
606
+ Data to pass to the contract.
607
+
608
+ Returns
609
+ -------
610
+ system_tx_output : `MessageCallOutput`
611
+ Output of processing the system transaction.
612
+
613
+ """
614
+ tx_env = vm.TransactionEnvironment(
615
+ origin=SYSTEM_ADDRESS,
616
+ gas_price=block_env.base_fee_per_gas,
617
+ gas=SYSTEM_TRANSACTION_GAS,
618
+ access_list_addresses=set(),
619
+ access_list_storage_keys=set(),
620
+ transient_storage=TransientStorage(),
621
+ blob_versioned_hashes=(),
622
+ authorizations=(),
623
+ index_in_block=None,
624
+ tx_hash=None,
625
+ )
626
+
627
+ system_tx_message = Message(
628
+ block_env=block_env,
629
+ tx_env=tx_env,
630
+ caller=SYSTEM_ADDRESS,
631
+ target=target_address,
632
+ gas=SYSTEM_TRANSACTION_GAS,
633
+ value=U256(0),
634
+ data=data,
635
+ code=system_contract_code,
636
+ depth=Uint(0),
637
+ current_target=target_address,
638
+ code_address=target_address,
639
+ should_transfer_value=False,
640
+ is_static=False,
641
+ accessed_addresses=set(),
642
+ accessed_storage_keys=set(),
643
+ disable_precompiles=False,
644
+ parent_evm=None,
645
+ )
646
+
647
+ system_tx_output = process_message_call(system_tx_message)
648
+
649
+ return system_tx_output
650
+
651
+
652
+ def process_checked_system_transaction(
653
+ block_env: vm.BlockEnvironment,
654
+ target_address: Address,
655
+ data: Bytes,
656
+ ) -> MessageCallOutput:
657
+ """
658
+ Process a system transaction and raise an error if the contract does not
659
+ contain code or if the transaction fails.
660
+
661
+ Parameters
662
+ ----------
663
+ block_env :
664
+ The block scoped environment.
665
+ target_address :
666
+ Address of the contract to call.
667
+ data :
668
+ Data to pass to the contract.
669
+
670
+ Returns
671
+ -------
672
+ system_tx_output : `MessageCallOutput`
673
+ Output of processing the system transaction.
674
+
675
+ """
676
+ system_contract_code = get_account(block_env.state, target_address).code
677
+
678
+ if len(system_contract_code) == 0:
679
+ raise InvalidBlock(
680
+ f"System contract address {target_address.hex()} does not "
681
+ "contain code"
682
+ )
683
+
684
+ system_tx_output = process_system_transaction(
685
+ block_env,
686
+ target_address,
687
+ system_contract_code,
688
+ data,
689
+ )
690
+
691
+ if system_tx_output.error:
692
+ raise InvalidBlock(
693
+ f"System contract ({target_address.hex()}) call failed: "
694
+ f"{system_tx_output.error}"
695
+ )
696
+
697
+ return system_tx_output
698
+
699
+
700
+ def process_unchecked_system_transaction(
701
+ block_env: vm.BlockEnvironment,
702
+ target_address: Address,
703
+ data: Bytes,
704
+ ) -> MessageCallOutput:
705
+ """
706
+ Process a system transaction without checking if the contract contains code
707
+ or if the transaction fails.
708
+
709
+ Parameters
710
+ ----------
711
+ block_env :
712
+ The block scoped environment.
713
+ target_address :
714
+ Address of the contract to call.
715
+ data :
716
+ Data to pass to the contract.
717
+
718
+ Returns
719
+ -------
720
+ system_tx_output : `MessageCallOutput`
721
+ Output of processing the system transaction.
722
+
723
+ """
724
+ system_contract_code = get_account(block_env.state, target_address).code
725
+ return process_system_transaction(
726
+ block_env,
727
+ target_address,
728
+ system_contract_code,
729
+ data,
730
+ )
731
+
732
+
733
+ def apply_body(
734
+ block_env: vm.BlockEnvironment,
735
+ transactions: Tuple[LegacyTransaction | Bytes, ...],
736
+ withdrawals: Tuple[Withdrawal, ...],
737
+ ) -> vm.BlockOutput:
738
+ """
739
+ Executes a block.
740
+
741
+ Many of the contents of a block are stored in data structures called
742
+ tries. There is a transactions trie which is similar to a ledger of the
743
+ transactions stored in the current block. There is also a receipts trie
744
+ which stores the results of executing a transaction, like the post state
745
+ and gas used. This function creates and executes the block that is to be
746
+ added to the chain.
747
+
748
+ Parameters
749
+ ----------
750
+ block_env :
751
+ The block scoped environment.
752
+ transactions :
753
+ Transactions included in the block.
754
+ withdrawals :
755
+ Withdrawals to be processed in the current block.
756
+
757
+ Returns
758
+ -------
759
+ block_output :
760
+ The block output for the current block.
761
+
762
+ """
763
+ block_output = vm.BlockOutput()
764
+
765
+ process_unchecked_system_transaction(
766
+ block_env=block_env,
767
+ target_address=BEACON_ROOTS_ADDRESS,
768
+ data=block_env.parent_beacon_block_root,
769
+ )
770
+
771
+ process_unchecked_system_transaction(
772
+ block_env=block_env,
773
+ target_address=HISTORY_STORAGE_ADDRESS,
774
+ data=block_env.block_hashes[-1], # The parent hash
775
+ )
776
+
777
+ for i, tx in enumerate(map(decode_transaction, transactions)):
778
+ process_transaction(block_env, block_output, tx, Uint(i))
779
+
780
+ process_withdrawals(block_env, block_output, withdrawals)
781
+
782
+ process_general_purpose_requests(
783
+ block_env=block_env,
784
+ block_output=block_output,
785
+ )
786
+
787
+ return block_output
788
+
789
+
790
+ def process_general_purpose_requests(
791
+ block_env: vm.BlockEnvironment,
792
+ block_output: vm.BlockOutput,
793
+ ) -> None:
794
+ """
795
+ Process all the requests in the block.
796
+
797
+ Parameters
798
+ ----------
799
+ block_env :
800
+ The execution environment for the Block.
801
+ block_output :
802
+ The block output for the current block.
803
+
804
+ """
805
+ # Requests are to be in ascending order of request type
806
+ deposit_requests = parse_deposit_requests(block_output)
807
+ requests_from_execution = block_output.requests
808
+ if len(deposit_requests) > 0:
809
+ requests_from_execution.append(DEPOSIT_REQUEST_TYPE + deposit_requests)
810
+
811
+ system_withdrawal_tx_output = process_checked_system_transaction(
812
+ block_env=block_env,
813
+ target_address=WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS,
814
+ data=b"",
815
+ )
816
+
817
+ if len(system_withdrawal_tx_output.return_data) > 0:
818
+ requests_from_execution.append(
819
+ WITHDRAWAL_REQUEST_TYPE + system_withdrawal_tx_output.return_data
820
+ )
821
+
822
+ system_consolidation_tx_output = process_checked_system_transaction(
823
+ block_env=block_env,
824
+ target_address=CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS,
825
+ data=b"",
826
+ )
827
+
828
+ if len(system_consolidation_tx_output.return_data) > 0:
829
+ requests_from_execution.append(
830
+ CONSOLIDATION_REQUEST_TYPE
831
+ + system_consolidation_tx_output.return_data
832
+ )
833
+
834
+
835
+ def process_transaction(
836
+ block_env: vm.BlockEnvironment,
837
+ block_output: vm.BlockOutput,
838
+ tx: Transaction,
839
+ index: Uint,
840
+ ) -> None:
841
+ """
842
+ Execute a transaction against the provided environment.
843
+
844
+ This function processes the actions needed to execute a transaction.
845
+ It decrements the sender's account balance after calculating the gas fee
846
+ and refunds them the proper amount after execution. Calling contracts,
847
+ deploying code, and incrementing nonces are all examples of actions that
848
+ happen within this function or from a call made within this function.
849
+
850
+ Accounts that are marked for deletion are processed and destroyed after
851
+ execution.
852
+
853
+ Parameters
854
+ ----------
855
+ block_env :
856
+ Environment for the Ethereum Virtual Machine.
857
+ block_output :
858
+ The block output for the current block.
859
+ tx :
860
+ Transaction to execute.
861
+ index:
862
+ Index of the transaction in the block.
863
+
864
+ """
865
+ trie_set(
866
+ block_output.transactions_trie,
867
+ rlp.encode(index),
868
+ encode_transaction(tx),
869
+ )
870
+
871
+ intrinsic_gas, calldata_floor_gas_cost = validate_transaction(tx)
872
+
873
+ (
874
+ sender,
875
+ effective_gas_price,
876
+ blob_versioned_hashes,
877
+ tx_blob_gas_used,
878
+ ) = check_transaction(
879
+ block_env=block_env,
880
+ block_output=block_output,
881
+ tx=tx,
882
+ )
883
+
884
+ sender_account = get_account(block_env.state, sender)
885
+
886
+ if isinstance(tx, BlobTransaction):
887
+ blob_gas_fee = calculate_data_fee(block_env.excess_blob_gas, tx)
888
+ else:
889
+ blob_gas_fee = Uint(0)
890
+
891
+ effective_gas_fee = tx.gas * effective_gas_price
892
+
893
+ gas = tx.gas - intrinsic_gas
894
+ increment_nonce(block_env.state, sender)
895
+
896
+ sender_balance_after_gas_fee = (
897
+ Uint(sender_account.balance) - effective_gas_fee - blob_gas_fee
898
+ )
899
+ set_account_balance(
900
+ block_env.state, sender, U256(sender_balance_after_gas_fee)
901
+ )
902
+
903
+ access_list_addresses = set()
904
+ access_list_storage_keys = set()
905
+ access_list_addresses.add(block_env.coinbase)
906
+ if isinstance(
907
+ tx,
908
+ (
909
+ AccessListTransaction,
910
+ FeeMarketTransaction,
911
+ BlobTransaction,
912
+ SetCodeTransaction,
913
+ ),
914
+ ):
915
+ for access in tx.access_list:
916
+ access_list_addresses.add(access.account)
917
+ for slot in access.slots:
918
+ access_list_storage_keys.add((access.account, slot))
919
+
920
+ authorizations: Tuple[Authorization, ...] = ()
921
+ if isinstance(tx, SetCodeTransaction):
922
+ authorizations = tx.authorizations
923
+
924
+ tx_env = vm.TransactionEnvironment(
925
+ origin=sender,
926
+ gas_price=effective_gas_price,
927
+ gas=gas,
928
+ access_list_addresses=access_list_addresses,
929
+ access_list_storage_keys=access_list_storage_keys,
930
+ transient_storage=TransientStorage(),
931
+ blob_versioned_hashes=blob_versioned_hashes,
932
+ authorizations=authorizations,
933
+ index_in_block=index,
934
+ tx_hash=get_transaction_hash(encode_transaction(tx)),
935
+ )
936
+
937
+ message = prepare_message(block_env, tx_env, tx)
938
+
939
+ tx_output = process_message_call(message)
940
+
941
+ # For EIP-7623 we first calculate the execution_gas_used, which includes
942
+ # the execution gas refund.
943
+ tx_gas_used_before_refund = tx.gas - tx_output.gas_left
944
+ tx_gas_refund = min(
945
+ tx_gas_used_before_refund // Uint(5), Uint(tx_output.refund_counter)
946
+ )
947
+ tx_gas_used_after_refund = tx_gas_used_before_refund - tx_gas_refund
948
+
949
+ # Transactions with less execution_gas_used than the floor pay at the
950
+ # floor cost.
951
+ tx_gas_used_after_refund = max(
952
+ tx_gas_used_after_refund, calldata_floor_gas_cost
953
+ )
954
+
955
+ tx_gas_left = tx.gas - tx_gas_used_after_refund
956
+ gas_refund_amount = tx_gas_left * effective_gas_price
957
+
958
+ # For non-1559 transactions effective_gas_price == tx.gas_price
959
+ priority_fee_per_gas = effective_gas_price - block_env.base_fee_per_gas
960
+ transaction_fee = tx_gas_used_after_refund * priority_fee_per_gas
961
+
962
+ # refund gas
963
+ sender_balance_after_refund = get_account(
964
+ block_env.state, sender
965
+ ).balance + U256(gas_refund_amount)
966
+ set_account_balance(block_env.state, sender, sender_balance_after_refund)
967
+
968
+ # transfer miner fees
969
+ coinbase_balance_after_mining_fee = get_account(
970
+ block_env.state, block_env.coinbase
971
+ ).balance + U256(transaction_fee)
972
+ set_account_balance(
973
+ block_env.state,
974
+ block_env.coinbase,
975
+ coinbase_balance_after_mining_fee,
976
+ )
977
+
978
+ for address in tx_output.accounts_to_delete:
979
+ destroy_account(block_env.state, address)
980
+
981
+ block_output.block_gas_used += tx_gas_used_after_refund
982
+ block_output.blob_gas_used += tx_blob_gas_used
983
+
984
+ receipt = make_receipt(
985
+ tx, tx_output.error, block_output.block_gas_used, tx_output.logs
986
+ )
987
+
988
+ receipt_key = rlp.encode(Uint(index))
989
+ block_output.receipt_keys += (receipt_key,)
990
+
991
+ trie_set(
992
+ block_output.receipts_trie,
993
+ receipt_key,
994
+ receipt,
995
+ )
996
+
997
+ block_output.block_logs += tx_output.logs
998
+
999
+
1000
+ def process_withdrawals(
1001
+ block_env: vm.BlockEnvironment,
1002
+ block_output: vm.BlockOutput,
1003
+ withdrawals: Tuple[Withdrawal, ...],
1004
+ ) -> None:
1005
+ """
1006
+ Increase the balance of the withdrawing account.
1007
+ """
1008
+
1009
+ def increase_recipient_balance(recipient: Account) -> None:
1010
+ recipient.balance += wd.amount * U256(10**9)
1011
+
1012
+ for i, wd in enumerate(withdrawals):
1013
+ trie_set(
1014
+ block_output.withdrawals_trie,
1015
+ rlp.encode(Uint(i)),
1016
+ rlp.encode(wd),
1017
+ )
1018
+
1019
+ modify_state(block_env.state, wd.address, increase_recipient_balance)
1020
+
1021
+
1022
+ def check_gas_limit(gas_limit: Uint, parent_gas_limit: Uint) -> bool:
1023
+ """
1024
+ Validates the gas limit for a block.
1025
+
1026
+ The bounds of the gas limit, ``max_adjustment_delta``, is set as the
1027
+ quotient of the parent block's gas limit and the
1028
+ ``GAS_LIMIT_ADJUSTMENT_FACTOR``. Therefore, if the gas limit that is
1029
+ passed through as a parameter is greater than or equal to the *sum* of
1030
+ the parent's gas and the adjustment delta then the limit for gas is too
1031
+ high and fails this function's check. Similarly, if the limit is less
1032
+ than or equal to the *difference* of the parent's gas and the adjustment
1033
+ delta *or* the predefined ``GAS_LIMIT_MINIMUM`` then this function's
1034
+ check fails because the gas limit doesn't allow for a sufficient or
1035
+ reasonable amount of gas to be used on a block.
1036
+
1037
+ Parameters
1038
+ ----------
1039
+ gas_limit :
1040
+ Gas limit to validate.
1041
+
1042
+ parent_gas_limit :
1043
+ Gas limit of the parent block.
1044
+
1045
+ Returns
1046
+ -------
1047
+ check : `bool`
1048
+ True if gas limit constraints are satisfied, False otherwise.
1049
+
1050
+ """
1051
+ max_adjustment_delta = parent_gas_limit // GAS_LIMIT_ADJUSTMENT_FACTOR
1052
+ if gas_limit >= parent_gas_limit + max_adjustment_delta:
1053
+ return False
1054
+ if gas_limit <= parent_gas_limit - max_adjustment_delta:
1055
+ return False
1056
+ if gas_limit < GAS_LIMIT_MINIMUM:
1057
+ return False
1058
+
1059
+ return True