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