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