From 9e24326b1132df29a6cec23411f3c82cd96f370e Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:02:45 +0200 Subject: [PATCH 01/19] connect to web3 provider and fetch block metadata at startup --- poetry.lock | 1593 ++++++++++++++++++++++++++++++++++++++- pyproject.toml | 5 +- src/kontrol/cli.py | 12 + src/kontrol/foundry.py | 15 +- src/kontrol/options.py | 4 + src/kontrol/prove.py | 29 + src/kontrol/web3_rpc.py | 48 ++ 7 files changed, 1688 insertions(+), 18 deletions(-) create mode 100644 src/kontrol/web3_rpc.py diff --git a/poetry.lock b/poetry.lock index 0db784367..89d914b7a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,156 @@ # This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +[[package]] +name = "aiohappyeyeballs" +version = "2.4.4" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, +] + +[[package]] +name = "aiohttp" +version = "3.11.11" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.2" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, + {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.11\"" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + [[package]] name = "attrs" version = "25.1.0" @@ -36,6 +187,153 @@ files = [ pyflakes = ">=3.0.0" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +[[package]] +name = "bitarray" +version = "3.0.0" +description = "efficient arrays of booleans -- C extension" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ddbf71a97ad1d6252e6e93d2d703b624d0a5b77c153b12f9ea87d83e1250e0c"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0e7f24a0b01e6e6a0191c50b06ca8edfdec1988d9d2b264d669d2487f4f4680"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150b7b29c36d9f1a24779aea723fdfc73d1c1c161dc0ea14990da27d4e947092"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8330912be6cb8e2fbfe8eb69f82dee139d605730cadf8d50882103af9ac83bb4"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e56ba8be5f17dee0ffa6d6ce85251e062ded2faa3cbd2558659c671e6c3bf96d"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd94b4803811c738e504a4b499fb2f848b2f7412d71e6b517508217c1d7929d"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0255bd05ec7165e512c115423a5255a3f301417973d20a80fc5bfc3f3640bcb"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe606e728842389943a939258809dc5db2de831b1d2e0118515059e87f7bbc1a"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e89ea59a3ed86a6eb150d016ed28b1bedf892802d0ed32b5659d3199440f3ced"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cf0cc2e91dd38122dec2e6541efa99aafb0a62e118179218181eff720b4b8153"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2d9fe3ee51afeb909b68f97e14c6539ace3f4faa99b21012e610bbe7315c388d"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:37be5482b9df3105bad00fdf7dc65244e449b130867c3879c9db1db7d72e508b"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0027b8f3bb2bba914c79115e96a59b9924aafa1a578223a7c4f0a7242d349842"}, + {file = "bitarray-3.0.0-cp310-cp310-win32.whl", hash = "sha256:628f93e9c2c23930bd1cfe21c634d6c84ec30f45f23e69aefe1fcd262186d7bb"}, + {file = "bitarray-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b655c3110e315219e266b2732609fddb0857bc69593de29f3c2ba74b7d3f51a"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:44c3e78b60070389b824d5a654afa1c893df723153c81904088d4922c3cfb6ac"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:545d36332de81e4742a845a80df89530ff193213a50b4cbef937ed5a44c0e5e5"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9eb510cde3fa78c2e302bece510bf5ed494ec40e6b082dec753d6e22d5d1b1"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e3727ab63dfb6bde00b281934e2212bb7529ea3006c0031a556a84d2268bea5"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2055206ed653bee0b56628f6a4d248d53e5660228d355bbec0014bdfa27050ae"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:147542299f458bdb177f798726e5f7d39ab8491de4182c3c6d9885ed275a3c2b"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f761184b93092077c7f6b7dad7bd4e671c1620404a76620da7872ceb576a94"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e008b7b4ce6c7f7a54b250c45c28d4243cc2a3bbfd5298fa7dac92afda229842"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfea514e665af278b2e1d4deb542de1cd4f77413bee83dd15ae16175976ea8d5"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:66d6134b7bb737b88f1d16478ad0927c571387f6054f4afa5557825a4c1b78e2"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3cd565253889940b4ec4768d24f101d9fe111cad4606fdb203ea16f9797cf9ed"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4800c91a14656789d2e67d9513359e23e8a534c8ee1482bb9b517a4cfc845200"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c2945e0390d1329c585c584c6b6d78be017d9c6a1288f9c92006fe907f69cc28"}, + {file = "bitarray-3.0.0-cp311-cp311-win32.whl", hash = "sha256:c23286abba0cb509733c6ce8f4013cd951672c332b2e184dbefbd7331cd234c8"}, + {file = "bitarray-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca79f02a98cbda1472449d440592a2fe2ad96fe55515a0447fa8864a38017cf8"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:184972c96e1c7e691be60c3792ca1a51dd22b7f25d96ebea502fe3c9b554f25d"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:787db8da5e9e29be712f7a6bce153c7bc8697ccc2c38633e347bb9c82475d5c9"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2da91ab3633c66999c2a352f0ca9ae064f553e5fc0eca231d28e7e305b83e942"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7edb83089acbf2c86c8002b96599071931dc4ea5e1513e08306f6f7df879a48b"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996d1b83eb904589f40974538223eaed1ab0f62be8a5105c280b9bd849e685c4"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4817d73d995bd2b977d9cde6050be8d407791cf1f84c8047fa0bea88c1b815bc"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d47bc4ff9b0e1624d613563c6fa7b80aebe7863c56c3df5ab238bb7134e8755"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aca0a9cd376beaccd9f504961de83e776dd209c2de5a4c78dc87a78edf61839b"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:572a61fba7e3a710a8324771322fba8488d134034d349dcd036a7aef74723a80"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a817ad70c1aff217530576b4f037dd9b539eb2926603354fcac605d824082ad1"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2ac67b658fa5426503e9581a3fb44a26a3b346c1abd17105735f07db572195b3"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:12f19ede03e685c5c588ab5ed63167999295ffab5e1126c5fe97d12c0718c18f"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcef31b062f756ba7eebcd7890c5d5de84b9d64ee877325257bcc9782288564a"}, + {file = "bitarray-3.0.0-cp312-cp312-win32.whl", hash = "sha256:656db7bdf1d81ec3b57b3cad7ec7276765964bcfd0eb81c5d1331f385298169c"}, + {file = "bitarray-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f785af6b7cb07a9b1e5db0dea9ef9e3e8bb3d74874a0a61303eab9c16acc1999"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7cb885c043000924554fe2124d13084c8fdae03aec52c4086915cd4cb87fe8be"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7814c9924a0b30ecd401f02f082d8697fc5a5be3f8d407efa6e34531ff3c306a"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcf524a087b143ba736aebbb054bb399d49e77cf7c04ed24c728e411adc82bfa"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1d5abf1d6d910599ac16afdd9a0ed3e24f3b46af57f3070cf2792f236f36e0b"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9929051feeaf8d948cc0b1c9ce57748079a941a1a15c89f6014edf18adaade84"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96cf0898f8060b2d3ae491762ae871b071212ded97ff9e1e3a5229e9fefe544c"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab37da66a8736ad5a75a58034180e92c41e864da0152b84e71fcc253a2f69cd4"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeb79e476d19b91fd6a3439853e4e5ba1b3b475920fa40d62bde719c8af786f"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f75fc0198c955d840b836059bd43e0993edbf119923029ca60c4fc017cefa54a"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f12cc7c7638074918cdcc7491aff897df921b092ffd877227892d2686e98f876"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dbe1084935b942fab206e609fa1ed3f46ad1f2612fb4833e177e9b2a5e006c96"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac06dd72ee1e1b6e312504d06f75220b5894af1fb58f0c20643698f5122aea76"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00f9a88c56e373009ac3c73c55205cfbd9683fbd247e2f9a64bae3da78795252"}, + {file = "bitarray-3.0.0-cp313-cp313-win32.whl", hash = "sha256:9c6e52005e91803eb4e08c0a08a481fb55ddce97f926bae1f6fa61b3396b5b61"}, + {file = "bitarray-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:cb98d5b6eac4b2cf2a5a69f60a9c499844b8bea207059e9fc45c752436e6bb49"}, + {file = "bitarray-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eb27c01b747649afd7e1c342961680893df6d8d81f832a6f04d8c8e03a8a54cc"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4683bff52f5a0fd523fb5d3138161ef87611e63968e1fcb6cf4b0c6a86970fe0"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb7302dbcfcb676f0b66f15891f091d0233c4fc23e1d4b9dc9b9e958156e347f"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:153d7c416a70951dcfa73487af05d2f49c632e95602f1620cd9a651fa2033695"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251cd5bd47f542893b2b61860eded54f34920ea47fd5bff038d85e7a2f7ae99b"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fa4b4d9fa90124b33b251ef74e44e737021f253dc7a9174e1b39f097451f7ca"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:18abdce7ab5d2104437c39670821cba0b32fdb9b2da9e6d17a4ff295362bd9dc"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:2855cc01ee370f7e6e3ec97eebe44b1453c83fb35080313145e2c8c3c5243afb"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:0cecaf2981c9cd2054547f651537b4f4939f9fe225d3fc2b77324b597c124e40"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:22b00f65193fafb13aa644e16012c8b49e7d5cbb6bb72825105ff89aadaa01e3"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:20f30373f0af9cb583e4122348cefde93c82865dbcbccc4997108b3d575ece84"}, + {file = "bitarray-3.0.0-cp36-cp36m-win32.whl", hash = "sha256:aef404d5400d95c6ec86664df9924bde667c8865f8e33c9b7bd79823d53b3e5d"}, + {file = "bitarray-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ec5b0f2d13da53e0975ac15ecbe8badb463bdb0bebaa09457f4df3320421915c"}, + {file = "bitarray-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:041c889e69c847b8a96346650e50f728b747ae176889199c49a3f31ae1de0e23"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc83ea003dd75e9ade3291ef0585577dd5524aec0c8c99305c0aaa2a7570d6db"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c33129b49196aa7965ac0f16fcde7b6ad8614b606caf01669a0277cef1afe1d"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ef5c787c8263c082a73219a69eb60a500e157a4ac69d1b8515ad836b0e71fb4"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e15c94d79810c5ab90ddf4d943f71f14332890417be896ca253f21fa3d78d2b1"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd021ada988e73d649289cee00428b75564c46d55fbdcb0e3402e504b0ae5ea"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7f1c24be7519f16a47b7e2ad1a1ef73023d34d8cbe1a3a59b185fc14baabb132"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:000df24c183011b5d27c23d79970f49b6762e5bb5aacd25da9c3e9695c693222"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:42bf1b222c698b467097f58b9f59dc850dfa694dde4e08237407a6a103757aa3"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:648e7ce794928e8d11343b5da8ecc5b910af75a82ea1a4264d5d0a55c3785faa"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f536fc4d1a683025f9caef0bebeafd60384054579ffe0825bb9bd8c59f8c55b8"}, + {file = "bitarray-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:a754c1464e7b946b1cac7300c582c6fba7d66e535cd1dab76d998ad285ac5a37"}, + {file = "bitarray-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e91d46d12781a14ccb8b284566b14933de4e3b29f8bc5e1c17de7a2001ad3b5b"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:904c1d5e3bd24f0c0d37a582d2461312033c91436a6a4f3bdeeceb4bea4a899d"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47ccf9887bd595d4a0536f2310f0dcf89e17ab83b8befa7dc8727b8017120fda"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71ad0139c95c9acf4fb62e203b428f9906157b15eecf3f30dc10b55919225896"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e002ac1073ac70e323a7a4bfa9ab95e7e1a85c79160799e265563f342b1557"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acc07211a59e2f245e9a06f28fa374d094fb0e71cf5366eef52abbb826ddc81e"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98a4070ddafabddaee70b2aa7cc6286cf73c37984169ab03af1782da2351059a"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7d09ef06ba57bea646144c29764bf6b870fb3c5558ca098191e07b6a1d40bf7"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce249ed981f428a8b61538ca82d3875847733d579dd40084ab8246549160f8a4"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea40e98d751ed4b255db4a88fe8fb743374183f78470b9e9305aab186bf28ede"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:928b8b6dfcd015e1a81334cfdac02815da2a2407854492a80cf8a3a922b04052"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fbb645477595ce2a0fbb678d1cfd08d3b896e5d56196d40fb9e114eeab9382b3"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:dc1937a0ff2671797d35243db4b596329842480d125a65e9fe964bcffaf16dfc"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a4f49ac31734fe654a68e2515c0da7f5bbdf2d52755ba09a42ac406f1f08c9d0"}, + {file = "bitarray-3.0.0-cp38-cp38-win32.whl", hash = "sha256:6d2a2ce73f9897268f58857ad6893a1a6680c5a6b28f79d21c7d33285a5ae646"}, + {file = "bitarray-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b1047999f1797c3ea7b7c85261649249c243308dcf3632840d076d18fa72f142"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:39b38a3d45dac39d528c87b700b81dfd5e8dc8e9e1a102503336310ef837c3fd"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0e104f9399144fab6a892d379ba1bb4275e56272eb465059beef52a77b4e5ce6"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0879f839ec8f079fa60c3255966c2e1aa7196699a234d4e5b7898fbc321901b5"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9502c2230d59a4ace2fddfd770dad8e8b414cbd99517e7e56c55c20997c28b8d"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57d5ef854f8ec434f2ffd9ddcefc25a10848393fe2976e2be2c8c773cf5fef42"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3c36b2fcfebe15ad1c10a90c1d52a42bebe960adcbce340fef867203028fbe7"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66a33a537e781eac3a352397ce6b07eedf3a8380ef4a804f8844f3f45e335544"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa54c7e1da8cf4be0aab941ea284ec64033ede5d6de3fd47d75e77cafe986e9d"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a667ea05ba1ea81b722682276dbef1d36990f8908cf51e570099fd505a89f931"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d756bfeb62ca4fe65d2af7a39249d442c05070c047d03729ad6cd4c2e9b0f0bd"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c9e9fef0754867d88e948ce8351c9fd7e507d8514e0f242fd67c907b9cdf98b3"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:67a0b56dd02f2713f6f52cacb3f251afd67c94c5f0748026d307d87a81a8e15c"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d8c36ddc1923bcc4c11b9994c54eaae25034812a42400b7b8a86fe6d242166a2"}, + {file = "bitarray-3.0.0-cp39-cp39-win32.whl", hash = "sha256:1414a7102a3c4986f241480544f5c99f5d32258fb9b85c9c04e84e48c490ab35"}, + {file = "bitarray-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c9733d2ff9b7838ac04bf1048baea153174753e6a47312be14c83c6a395424b"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fef4e3b3f2084b4dae3e5316b44cda72587dcc81f68b4eb2dbda1b8d15261b61"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e9eee03f187cef1e54a4545124109ee0afc84398628b4b32ebb4852b4a66393"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb5702dd667f4bb10fed056ffdc4ddaae8193a52cd74cb2cdb54e71f4ef2dd1"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:666e44b0458bb2894b64264a29f2cc7b5b2cbcc4c5e9cedfe1fdbde37a8e329a"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c756a92cf1c1abf01e56a4cc40cb89f0ff9147f2a0be5b557ec436a23ff464d8"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e51e7f8289bf6bb631e1ef2a8f5e9ca287985ff518fe666abbdfdb6a848cb26"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fa5d8e4b28388b337face6ce4029be73585651a44866901513df44be9a491ab"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3963b80a68aedcd722a9978d261ae53cb9bb6a8129cc29790f0f10ce5aca287a"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b555006a7dea53f6bebc616a4d0249cecbf8f1fadf77860120a2e5dbdc2f167"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4ac2027ca650a7302864ed2528220d6cc6921501b383e9917afc7a2424a1e36d"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf90aba4cff9e72e24ecdefe33bad608f147a23fa5c97790a5bab0e72fe62b6d"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a199e6d7c3bad5ba9d0e4dc00dde70ee7d111c9dfc521247fa646ef59fa57e"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b6c7c4f4a7b80e86e24a76f4c6b9b67d03229ea16d7d403520616535c32196"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fc13da3518f14825b239374734fce93c1a9299ed7b558c3ec1d659ec7e4c70"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:369b6d457af94af901d632c7e625ca6caf0a7484110fc91c6290ce26bc4f1478"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ee040ad3b7dfa05e459713099f16373c1f2a6f68b43cb0575a66718e7a5daef4"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dad7ba2af80f9ec1dd988c3aca7992408ec0d0b4c215b65d353d95ab0070b10"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4839d3b64af51e4b8bb4a602563b98b9faeb34fd6c00ed23d7834e40a9d080fc"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f71f24b58e75a889b9915e3197865302467f13e7390efdea5b6afc7424b3a2ea"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bcf0150ae0bcc4aa97bdfcb231b37bad1a59083c1b5012643b266012bf420e68"}, + {file = "bitarray-3.0.0.tar.gz", hash = "sha256:a2083dc20f0d828a7cdf7a16b20dae56aab0f43dc4f347a3b3039f6577992b03"}, +] + [[package]] name = "black" version = "25.1.0" @@ -83,6 +381,224 @@ d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "certifi" +version = "2024.12.14" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "ckzg" +version = "2.0.1" +description = "Python bindings for C-KZG-4844" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "ckzg-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7f9ba6d215f8981c5545f952aac84875bd564a63da02fb22a3d1321662ecdc0"}, + {file = "ckzg-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8fdec3ff96399acba9baeef9e1b0b5258c08f73245780e6c69f7b73def5e8d0a"}, + {file = "ckzg-2.0.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1644369af9900a9f109d417d6760693edf134118f3100d0c68f56667de775b80"}, + {file = "ckzg-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0a2146f122d489ac7e67ae0c0743f8d0db1718e6aeed8f05717340594fe07dd"}, + {file = "ckzg-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:979841be50f2782b447762db38e9bc927ae251f6ca86c54a26561a52068ee779"}, + {file = "ckzg-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4516d86647ee4e8ea9470f4adf68fbebb6dc1bdedff7d9592c2504fe53145908"}, + {file = "ckzg-2.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:91866fc58a29b4829201efd9ffadfac3ffeca6359254a54a360ff6a189c34bf5"}, + {file = "ckzg-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed35508dac059b2c0a7994383bc7a92eaf35d0b9ce790016819e2619e0f4b8a9"}, + {file = "ckzg-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:449c4fe38017351eca362106420eeb2d28d50b7e54aa8668b3af29a8ab780132"}, + {file = "ckzg-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:260608a22e2f2cadcd31f4495832d45d6460438c38faba9761b92df885a99d88"}, + {file = "ckzg-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1015f99c50215098751b07d7e459ba9a2790d3692ca81552eed29996128e90d"}, + {file = "ckzg-2.0.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dd350d97554c161dc5b8c7b32c2dc8e659632c374f60e2669fb3c9b5b294827"}, + {file = "ckzg-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eec7724fa8dc4ae95757efe4a87e7b2d4b880cb348c72ce7355fc0c4f64bc298"}, + {file = "ckzg-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa0f4398fa67fb71f0a2b34a652cc89e6e0e6af1340b0dc771db1a5f3e089c"}, + {file = "ckzg-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f865a0297aabeeb638187a46f7df445763360417b9df4dea60560d512c2cda09"}, + {file = "ckzg-2.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b6ec738350771dbf5974fb70cc8bbb20a4df784af770f7e655922adc08a2171"}, + {file = "ckzg-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b4b669fc77edeb16adc182efc32b3737b36f741a2e33a170d40619e8b171a94"}, + {file = "ckzg-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:decb97f4a17c7338b2130dcc4b045df4cc0e7785ece872c764b554c7c73a99ff"}, + {file = "ckzg-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:285cf3121b8a8c5609c5b706314f68d2ba2784ab02c5bb7487c6ae1714ecb27f"}, + {file = "ckzg-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f927bc41c2551b0ef0056a649a7ebed29d9665680a10795f4cee5002c69ddb7"}, + {file = "ckzg-2.0.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd9fb690c88919f30c9f3ab7cc46a7ecd734d5ff4c9ccea383c119b9b7cc4da"}, + {file = "ckzg-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fabc3bd41b306d1c7025d561c3281a007c2aca8ceaf998582dc3894904d9c73e"}, + {file = "ckzg-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb50c53efdb9c34f762bd0c8006cf79bc92a9daf47aa6b541e496988484124f"}, + {file = "ckzg-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7960cc62f959403293fb53a3c2404778369ae7cefc6d7f202e5e00567cf98c4b"}, + {file = "ckzg-2.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d721bcd492294c70eca39da0b0a433c29b6a571dbac2f7084bab06334904af06"}, + {file = "ckzg-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dde2391d025b5033ef0eeacf62b11ecfe446aea25682b5f547a907766ad0a8cb"}, + {file = "ckzg-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fab8859d9420f6f7df4e094ee3639bc49d18c8dab0df81bee825e2363dd67a09"}, + {file = "ckzg-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9747d92883199d4f8f3a3d7018134745fddcf692dfe67115434e4b32609ea785"}, + {file = "ckzg-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2cf58fb9e165da97f0ffe9f4a6efb73992645fac8e0fa223a6cc7ec486a434a"}, + {file = "ckzg-2.0.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d25d006899d76bb8c9d3e8b27981dd6b66a78f9826e33c1bf981af6577a69a19"}, + {file = "ckzg-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04bf0b32f04f5ea5e4b8518e292d3321bc05596fde95f9c3b4f504e5e4bc780"}, + {file = "ckzg-2.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0cf3dccd72376bff10e1833641cc9d642f34f60ca63972626d9dfcfdc8e77f"}, + {file = "ckzg-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:770809c7e93087470cc524724419b0f85590edb033c7c73ba94aef70b36ca18b"}, + {file = "ckzg-2.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e31b59b8124148d5e21f7e41b35532d7af98260c44a77c3917958adece84296d"}, + {file = "ckzg-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:174f0c356df644d6e349ce03b7284d83dbec859e11ca5d1b1b3bace8b8fbc65d"}, + {file = "ckzg-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:30e375cd45142e56b5dbfdec05ce4deb2368d7f7dedfc7408ba37d5639af05ff"}, + {file = "ckzg-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:abdee71958b214730a8341b16bdd413d0fab1b1a2504fbdb7b0ef2aeee9f9d22"}, + {file = "ckzg-2.0.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b4442667058db791325fe231f22e4fc7aaa3495d535d75af5595bc5f4f86036"}, + {file = "ckzg-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c3c9aa9d4477ad52f3561b717e776c1a8a442d9d8b06600c7d8a2857d1ecf05"}, + {file = "ckzg-2.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68e0a9cde35f11e80b4e560d22990f2f29dd200a95d3141acde137cb6c883f9a"}, + {file = "ckzg-2.0.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:4508a089e53330866d3360000d76483400eeab5f8057b8e1f3e344ce2cc0097b"}, + {file = "ckzg-2.0.1-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:828cecee16ec576dcf4386beac4eedfd058fd32ee90827f2282e7156a53600be"}, + {file = "ckzg-2.0.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:bd437ec1dfb4f5609979328b5f465a74307f45d46d24234868c67d44da96903b"}, + {file = "ckzg-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:70406b10acf68469ac62110047044a6c1a998f5d5fcd6e27cb3ec2d5760d0490"}, + {file = "ckzg-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2f53fba88febac17e82a96eb83dc38ecf4b28abcdd15c0246534c358bd3b26c4"}, + {file = "ckzg-2.0.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be8e0d5015e7755af4ddaab9ae1a4084f72c84b2cbb53628f4366aeed46cc380"}, + {file = "ckzg-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:261414121091042d29f28fc319d7c9a7f950f91f8bf54c010b581ee6a0499473"}, + {file = "ckzg-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524e1e66edd2be2c38b660824aa7b5d4525b41b30ac029d80738a8eee491aeb5"}, + {file = "ckzg-2.0.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:4a12a1d8ef8f475d9f0af9a538e1674057e007806cb1204bb269ea00d9f8c1e5"}, + {file = "ckzg-2.0.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:4cc4bb5f62417a58065deeaf124e178cb1787ef3228e6032600d1e0a2775765b"}, + {file = "ckzg-2.0.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:e7b015f5615bcb82fa0d935481a209fc1dcd9308fb52fb1a7e5400108df67a94"}, + {file = "ckzg-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0518933ff3b9550f9dd60d833cdb74e8e97cc1cc58f0560b706916606dfd47d0"}, + {file = "ckzg-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ac0bca0795990076cde1930ecec307379b5303e34367c6e6e8a16bdba5a7ba5"}, + {file = "ckzg-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8086d23a41020ede312843bda7ea4ee0c9831265379027904106f99f2f8ed469"}, + {file = "ckzg-2.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31d1b141d41fa51aeac9440c936b812e885aef5719adfbd3a27550d8dc433997"}, + {file = "ckzg-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60a58e4d8cb91bad669ca111b7ccdd05c32de6787fdb571bb599625b043ad75b"}, + {file = "ckzg-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633e143385622d7a43fcb5c4f400ec5ec15df0b1c74ab7d6449a41a7abed24ad"}, + {file = "ckzg-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4876313614ea01f9a0039b5ca2c754340ba40aa8405f8756912d90ae55718011"}, + {file = "ckzg-2.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:19c86c8102200484074afac06b3946b457ba9915636de187f63854522be2e3bd"}, + {file = "ckzg-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:564abf27878f129781e1df4d33b1c4e264e5b25f89c1bdf95b7d6256e4bceb6c"}, + {file = "ckzg-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:bc2da29bb970d3f5de04fb60797dbb4490c010ffc683cbc6016349dd6fa60d14"}, + {file = "ckzg-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9c1869671140ae7e698520b678b594ebd26fb59ef476711403541597d7d32c01"}, + {file = "ckzg-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1dd2aec2c61e8cc2ec815900f6768c6fe74b8fd29810e79b57c4150c6db32fb6"}, + {file = "ckzg-2.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9632ef17285dbdd3fcd9780f599c266da736d9b2897decc4ea02ba8690bdf72"}, + {file = "ckzg-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5747d7926873e3af0f6af5fca666feb0097d06cab525950e2664a6fbcb90165d"}, + {file = "ckzg-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75484ffb78aaebaeb3a30f1194a9143b904312b0f365fc4101e58e1bf5f89f66"}, + {file = "ckzg-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b2f72bc861b8bee9bac3314c58586d1ab2d23530f932a8f0a8562c8a4a6a45f9"}, + {file = "ckzg-2.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6f85e5802fea5b77f52fc3a14c8dec18a3f2b7c7070c811a4608940834f563cc"}, + {file = "ckzg-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:583a0b6b531a16974676439b23e7defb3dfe9732f18d13d2316152019c538af1"}, + {file = "ckzg-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:fafb9ac36b3398f8091d40773d9a450e5f74883dad8ca4ee22d472e7a231ef4d"}, + {file = "ckzg-2.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a12e96f20dce35e5222f898a5c8355054ef7c5ee038eeb97dbb694640b57577b"}, + {file = "ckzg-2.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:4e0ebc55253addaa24dd2cd871bbe3b8f57855f32b5f74e70bf2cb76b6f7da54"}, + {file = "ckzg-2.0.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f917a7bf363a3735db30559e1ed63cf1ccf414234433ba687fa72c007abd756"}, + {file = "ckzg-2.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f08c984286853271d4adae219e9ba87275a15047dbaa262ab8dd6c01be97b0"}, + {file = "ckzg-2.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa1ea4888417e1f109fd5e57965788fb7f53b674329b937a65604a3c1ca1d03"}, + {file = "ckzg-2.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0b249914aeaf05cabc71c5c3797e3d6c126cb2c64192b7eb6755ef6aa5ab2f11"}, + {file = "ckzg-2.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a038e26baf650e1c733dcaa066ec948e75556b0c485e8c790c9a758875c71a93"}, + {file = "ckzg-2.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d6deb2c822122bdd32b555fa3b9216c86a355f24a2cc6a46b9b5743b412b60c"}, + {file = "ckzg-2.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f6f2fbceba9ece3fbc1d2613a246f4e6ec4d787f542859e70c358928c0e4a1"}, + {file = "ckzg-2.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ca40ef30129e2347bff3c95ad093403a0d5703476705ab92c92fbffe89bd5a"}, + {file = "ckzg-2.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:700b989c2f7089edc8fac6dfbd1b4677e85b966216ebedee8eb5e7894765c188"}, + {file = "ckzg-2.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f11933c007c3df02446a81957ac6e2488058b969e2eff5357c98ab569a0c7999"}, + {file = "ckzg-2.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3dbc9580eccecbd485f22e48f6044c48cbe6d838a7b7514cce179c085c65a960"}, + {file = "ckzg-2.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad6eb83f343fea6dd9a13fd1bce87b9cd26abeeb72f0674a62d26e40fe0b8aca"}, + {file = "ckzg-2.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:269f82b992facbd20461310cf5784551c77d11017b7d4b85d741d70359be6794"}, + {file = "ckzg-2.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:895d67cfd43130652e1ae39b90465b392d9a72c7c7e6f250eaf14689bfda6351"}, + {file = "ckzg-2.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:369cf1aeaf336c31f2050a7f54ae21cf46f4b2db23ebb013fff621144ab361bb"}, + {file = "ckzg-2.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:24fda2637598a467e7b11ff664805ee7fdf4f6c7b0c043d6d0a6ccb69b5681ee"}, + {file = "ckzg-2.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea27baabe5b22b92901c428768eacf93b992ac7681f93768ab24818ad26ccfed"}, + {file = "ckzg-2.0.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a33f71e382020f2bc4ead2bd6881a9bd3811d929f272da239ac01ad615a00802"}, + {file = "ckzg-2.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:926507c569727bb4c851a1eea702c5e902267de96e06ce2d685019f973f72968"}, + {file = "ckzg-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f5f29518b0a4555d8f2a28559209bd1d4080547aa629ff9ee51799346573b3f"}, + {file = "ckzg-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4595db84ce63c227e4448de0f7b39d3043e3477d78394ff651708c37fee6c486"}, + {file = "ckzg-2.0.1.tar.gz", hash = "sha256:62c5adc381637affa7e1df465c57750b356a761b8a3164c3106589b02532b9c9"}, +] + [[package]] name = "classify-imports" version = "4.2.0" @@ -370,6 +886,58 @@ files = [ graph = ["objgraph (>=1.7.2)"] profile = ["gprof2dot (>=2022.7.29)"] +[[package]] +name = "eth-abi" +version = "5.2.0" +description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, + {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, +] + +[package.dependencies] +eth-typing = ">=3.0.0" +eth-utils = ">=2.0.0" +parsimonious = ">=0.10.0,<0.11.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)"] +tools = ["hypothesis (>=6.22.0,<6.108.7)"] + +[[package]] +name = "eth-account" +version = "0.13.4" +description = "eth-account: Sign Ethereum transactions and messages with local private keys" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "eth_account-0.13.4-py3-none-any.whl", hash = "sha256:a4c109e9bad3a278243fcc028b755fb72b43e25b1e6256b3f309a44f5f7d87c3"}, + {file = "eth_account-0.13.4.tar.gz", hash = "sha256:2e1f2de240bef3d9f3d8013656135d2a79b6be6d4e7885bce9cace4334a4a376"}, +] + +[package.dependencies] +bitarray = ">=2.4.0" +ckzg = ">=2.0.0" +eth-abi = ">=4.0.0-b.2" +eth-keyfile = ">=0.7.0,<0.9.0" +eth-keys = ">=0.4.0" +eth-rlp = ">=2.1.0" +eth-utils = ">=2.0.0" +hexbytes = ">=1.2.0" +pydantic = ">=2.0.0" +rlp = ">=1.0.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "coverage", "hypothesis (>=4.18.0,<5)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + [[package]] name = "eth-hash" version = "0.7.1" @@ -382,6 +950,9 @@ files = [ {file = "eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5"}, ] +[package.dependencies] +pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} + [package.extras] dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] @@ -389,6 +960,73 @@ pycryptodome = ["pycryptodome (>=3.6.6,<4)"] pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +[[package]] +name = "eth-keyfile" +version = "0.8.1" +description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, + {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, +] + +[package.dependencies] +eth-keys = ">=0.4.0" +eth-utils = ">=2" +pycryptodome = ">=3.6.6,<4" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=21,<22)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-keys" +version = "0.6.1" +description = "eth-keys: Common API for Ethereum key operations" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "eth_keys-0.6.1-py3-none-any.whl", hash = "sha256:7deae4cd56e862e099ec58b78176232b931c4ea5ecded2f50c7b1ccbc10c24cf"}, + {file = "eth_keys-0.6.1.tar.gz", hash = "sha256:a43e263cbcabfd62fa769168efc6c27b1f5603040e4de22bb84d12567e4fd962"}, +] + +[package.dependencies] +eth-typing = ">=3" +eth-utils = ">=2" + +[package.extras] +coincurve = ["coincurve (>=12.0.0)"] +dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bump_my_version (>=0.19.0)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=24,<25)"] +test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] + +[[package]] +name = "eth-rlp" +version = "2.1.0" +description = "eth-rlp: RLP definitions for common Ethereum objects in Python" +optional = false +python-versions = ">=3.8, <4" +groups = ["main"] +files = [ + {file = "eth-rlp-2.1.0.tar.gz", hash = "sha256:d5b408a8cd20ed496e8e66d0559560d29bc21cee482f893936a1f05d0dddc4a0"}, + {file = "eth_rlp-2.1.0-py3-none-any.whl", hash = "sha256:6f476eb7e37d81feaba5d98aed887e467be92648778c44b19fe594aea209cde1"}, +] + +[package.dependencies] +eth-utils = ">=2.0.0" +hexbytes = ">=1.2.0" +rlp = ">=0.6.0" +typing-extensions = {version = ">=4.0.1", markers = "python_version <= \"3.10\""} + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + [[package]] name = "eth-typing" version = "5.1.0" @@ -411,26 +1049,26 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-utils" -version = "4.1.1" +version = "5.2.0" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" optional = false python-versions = "<4,>=3.8" groups = ["main"] files = [ - {file = "eth_utils-4.1.1-py3-none-any.whl", hash = "sha256:ccbbac68a6d65cb6e294c5bcb6c6a5cec79a241c56dc5d9c345ed788c30f8534"}, - {file = "eth_utils-4.1.1.tar.gz", hash = "sha256:71c8d10dec7494aeed20fa7a4d52ec2ce4a2e52fdce80aab4f5c3c19f3648b25"}, + {file = "eth_utils-5.2.0-py3-none-any.whl", hash = "sha256:4d43eeb6720e89a042ad5b28d4b2111630ae764f444b85cbafb708d7f076da10"}, + {file = "eth_utils-5.2.0.tar.gz", hash = "sha256:17e474eb654df6e18f20797b22c6caabb77415a996b3ba0f3cc8df3437463134"}, ] [package.dependencies] cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} eth-hash = ">=0.3.1" -eth-typing = ">=3.0.0" +eth-typing = ">=5.0.0" toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} [package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.5.1)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["hypothesis (>=4.43.0)", "mypy (==1.5.1)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] +dev = ["build (>=0.9.0)", "bump-my-version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["hypothesis (>=4.43.0)", "mypy (==1.10.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "exceptiongroup" @@ -562,6 +1200,108 @@ files = [ classify-imports = "*" flake8 = "*" +[[package]] +name = "frozenlist" +version = "1.5.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, +] + [[package]] name = "future" version = "1.0.0" @@ -632,6 +1372,23 @@ dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] docs = ["sphinx (>=5,<7)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] +[[package]] +name = "hexbytes" +version = "1.3.0" +description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c"}, + {file = "hexbytes-1.3.0.tar.gz", hash = "sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684"}, +] + +[package.extras] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth_utils (>=2.0.0)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["eth_utils (>=2.0.0)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + [[package]] name = "humanfriendly" version = "10.0" @@ -681,6 +1438,21 @@ pytz = ["pytz (>=2014.1)"] redis = ["redis (>=3.0.0)"] zoneinfo = ["tzdata (>=2024.2)"] +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" version = "8.6.1" @@ -735,13 +1507,13 @@ plugins = ["setuptools"] [[package]] name = "kevm-pyk" -version = "1.0.787" +version = "1.0.678" description = "" optional = false python-versions = "^3.10" groups = ["main"] files = [] -develop = false +develop = true [package.dependencies] kframework = "7.1.208" @@ -749,11 +1521,8 @@ pathos = "*" tomlkit = "^0.11.6" [package.source] -type = "git" -url = "https://github.com/runtimeverification/evm-semantics.git" -reference = "v1.0.787" -resolved_reference = "115d911fadb449289400b034b664e3dcc3e29b0d" -subdirectory = "kevm-pyk" +type = "directory" +url = "../../evm-semantics/fork-testing-experimental/kevm-pyk" [[package]] name = "kframework" @@ -872,6 +1641,111 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "multidict" +version = "6.1.0" +description = "multidict implementation" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "multiprocess" version = "0.70.17" @@ -985,6 +1859,21 @@ files = [ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] +[[package]] +name = "parsimonious" +version = "0.10.0" +description = "(Soon to be) the fastest pure-Python PEG parser I could muster" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, + {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, +] + +[package.dependencies] +regex = ">=2022.3.15" + [[package]] name = "pathos" version = "0.3.3" @@ -1090,6 +1979,98 @@ files = [ [package.extras] dill = ["dill (>=0.3.9)"] +[[package]] +name = "propcache" +version = "0.2.1" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +] + [[package]] name = "psutil" version = "5.9.8" @@ -1188,6 +2169,140 @@ files = [ {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"}, ] +[[package]] +name = "pydantic" +version = "2.10.6" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.27.2" +typing-extensions = ">=4.12.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + [[package]] name = "pyevmasm" version = "0.2.3" @@ -1357,6 +2472,18 @@ psutil = ["psutil (>=3.0)"] setproctitle = ["setproctitle"] testing = ["filelock"] +[[package]] +name = "pyunormalize" +version = "16.0.0" +description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent of the Python core Unicode database." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152"}, + {file = "pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7"}, +] + [[package]] name = "pyupgrade" version = "3.19.1" @@ -1372,6 +2499,161 @@ files = [ [package.dependencies] tokenize-rt = ">=6.1.0" +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Windows\"" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + [[package]] name = "rich" version = "13.9.4" @@ -1392,6 +2674,27 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.1 [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rlp" +version = "4.0.1" +description = "rlp: A package for Recursive Length Prefix encoding and decoding" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "rlp-4.0.1-py3-none-any.whl", hash = "sha256:ff6846c3c27b97ee0492373aa074a7c3046aadd973320f4fffa7ac45564b0258"}, + {file = "rlp-4.0.1.tar.gz", hash = "sha256:bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1"}, +] + +[package.dependencies] +eth-utils = ">=2" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "hypothesis (==5.19.0)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +rust-backend = ["rusty-rlp (>=0.2.1)"] +test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + [[package]] name = "setuptools" version = "75.8.0" @@ -1526,6 +2829,21 @@ files = [ {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] +[[package]] +name = "types-requests" +version = "2.32.0.20241016" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, + {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, +] + +[package.dependencies] +urllib3 = ">=2" + [[package]] name = "typing-extensions" version = "4.12.2" @@ -1553,6 +2871,24 @@ files = [ [package.extras] test = ["coverage", "pytest", "pytest-cov"] +[[package]] +name = "urllib3" +version = "2.3.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "wcwidth" version = "0.2.13" @@ -1565,6 +2901,136 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "web3" +version = "7.7.0" +description = "web3: A Python library for interacting with Ethereum" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "web3-7.7.0-py3-none-any.whl", hash = "sha256:2e29147c0f43cf191af788af8f004368b70994db40162f1240607f663dc68ea6"}, + {file = "web3-7.7.0.tar.gz", hash = "sha256:4d0332b9a78b855e57ccebd9e1e74c8e855b95869ac7b8fe5878731593e76408"}, +] + +[package.dependencies] +aiohttp = ">=3.7.4.post0" +eth-abi = ">=5.0.1" +eth-account = ">=0.13.1" +eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]} +eth-typing = ">=5.0.0" +eth-utils = ">=5.0.0" +hexbytes = ">=1.2.0" +pydantic = ">=2.4.0" +pyunormalize = ">=15.0.0" +pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} +requests = ">=2.23.0" +types-requests = ">=2.0.0" +typing-extensions = ">=4.0.1" +websockets = ">=10.0.0,<14.0.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-tester[py-evm] (>=0.12.0b1,<0.13.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-geth (>=5.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-xdist (>=2.4.0)", "setuptools (>=38.6.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "tqdm (>4.32)", "twine (>=1.13)", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["eth-tester[py-evm] (>=0.12.0b1,<0.13.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-geth (>=5.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-xdist (>=2.4.0)", "tox (>=4.0.0)"] +tester = ["eth-tester[py-evm] (>=0.12.0b1,<0.13.0b1)", "py-geth (>=5.1.0)"] + +[[package]] +name = "websockets" +version = "13.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, + {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, + {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, + {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, + {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, + {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, + {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, + {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, + {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, + {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, + {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, + {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, + {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, + {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, + {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, + {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, + {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, + {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, + {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, + {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, + {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, + {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, + {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, + {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, + {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, + {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, + {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, + {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, + {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, + {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, + {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, + {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, + {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, + {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, + {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, + {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, + {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, +] + [[package]] name = "xdg-base-dirs" version = "6.0.2" @@ -1577,6 +3043,103 @@ files = [ {file = "xdg_base_dirs-6.0.2.tar.gz", hash = "sha256:950504e14d27cf3c9cb37744680a43bf0ac42efefc4ef4acf98dc736cab2bced"}, ] +[[package]] +name = "yarl" +version = "1.18.3" +description = "Yet another URL library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, + {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, + {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, + {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, + {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, + {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, + {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, + {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, + {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, + {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, + {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, + {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, + {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" + [[package]] name = "zipp" version = "3.21.0" @@ -1600,4 +3163,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "664d8cf4ce1a2ba9dfdfd5fcee8d87df81504c04e65a928aa5f745d40cfbe72b" +content-hash = "52f29a6c61e8156b502677af306cb4dc6e3d3654cbeb6f8217d4c0189e53ce43" diff --git a/pyproject.toml b/pyproject.toml index e4dd162a2..ad90a5028 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,10 +12,11 @@ authors = [ [tool.poetry.dependencies] python = "^3.10" -kevm-pyk = { git = "https://github.com/runtimeverification/evm-semantics.git", tag = "v1.0.787", subdirectory = "kevm-pyk" } -eth-utils = "^4.1.1" +kevm-pyk = { path = "/home/anvacaru/dev/evm-semantics/fork-testing-experimental", develop = true, subdirectory = "kevm-pyk" } +eth-utils = "*" pycryptodome = "^3.20.0" pyevmasm = "^0.2.3" +web3 = "*" [tool.poetry.group.dev.dependencies] autoflake = "*" diff --git a/src/kontrol/cli.py b/src/kontrol/cli.py index 4bbead52c..044f45667 100644 --- a/src/kontrol/cli.py +++ b/src/kontrol/cli.py @@ -591,6 +591,18 @@ def parse(s: str) -> list[T]: 'Format is :.' ), ) + prove_args.add_argument( + '--fork-url', + dest='fork_url', + default=None, + help=('Fetch state over a remote endpoint instead of starting from an abstract state'), + ) + prove_args.add_argument( + '--fork-block-number', + dest='fork_block_number', + default=None, + help=('Fetch state from a specific block number over a remote endpoint'), + ) show_args = command_parser.add_parser( 'show', diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index 0bd9ed138..88e5d8ed6 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -104,8 +104,21 @@ def cut_point_rules( break_on_storage: bool, break_on_basic_blocks: bool, break_on_load_program: bool, + break_on_access_opcode: bool | None = None, ) -> list[str]: - return ['FOUNDRY-CHEAT-CODES.rename', 'FOUNDRY-ACCOUNTS.forget'] + KEVMSemantics.cut_point_rules( + cut_point_rules = ['FOUNDRY-CHEAT-CODES.rename', 'FOUNDRY-ACCOUNTS.forget'] + if break_on_access_opcode: + cut_point_rules.extend( + [ + 'EVM.call.false', + 'EVM.balance.false', + 'EVM.extcodesize.false', + 'EVM.extcodehash.false', + 'EVM.extcodecopy.false', + 'EVM.sload', + ] + ) + return cut_point_rules + KEVMSemantics.cut_point_rules( break_on_jumpi, break_on_jump, break_on_calls, diff --git a/src/kontrol/options.py b/src/kontrol/options.py index dce08fb02..6a80456a7 100644 --- a/src/kontrol/options.py +++ b/src/kontrol/options.py @@ -392,6 +392,8 @@ class ProveOptions( optimize_performance: int | None stack_checks: bool extra_module: str | None + fork_url: str | None + fork_block_number: str | None def __init__(self, args: dict[str, Any]) -> None: super().__init__(args) @@ -423,6 +425,8 @@ def default() -> dict[str, Any]: 'optimize_performance': None, 'stack_checks': True, 'extra_module': None, + 'fork_url': None, + 'fork_block_number': None, } @staticmethod diff --git a/src/kontrol/prove.py b/src/kontrol/prove.py index dca5d03d8..fa9cfcefc 100644 --- a/src/kontrol/prove.py +++ b/src/kontrol/prove.py @@ -41,6 +41,7 @@ from .solc_to_k import Contract, hex_string_to_int from .state_record import StateDiffEntry, StateDumpEntry from .utils import console, parse_test_version_tuple +from .web3_rpc import Web3Providers, get_block_metadata if TYPE_CHECKING: from collections.abc import Iterable @@ -396,6 +397,12 @@ def create_kcfg_explore() -> KCFGExplore: ): options.config_type = ConfigType.SUMMARY_CONFIG + w3 = None + block_metadata = None + if options.fork_url: + w3 = Web3Providers.get_provider(options.fork_url) + block_metadata = get_block_metadata(w3) + proof = method_to_apr_proof( test=test, foundry=foundry, @@ -424,6 +431,7 @@ def create_kcfg_explore() -> KCFGExplore: 'trace_wordstack': options.trace_wordstack, } ), + block_metadata=block_metadata, ) cut_point_rules = KontrolSemantics.cut_point_rules( options.break_on_jumpi, @@ -432,6 +440,7 @@ def create_kcfg_explore() -> KCFGExplore: options.break_on_storage, options.break_on_basic_blocks, options.break_on_load_program, + break_on_access_opcode=(not options.fork_url is None), ) if options.break_on_cheatcodes: cut_point_rules.extend( @@ -582,6 +591,7 @@ def method_to_apr_proof( active_symbolik: bool = False, hevm: bool = False, trace_options: TraceOptions | None = None, + block_metadata: dict[str, int] | None = None, ) -> APRProof: setup_proof = None setup_proof_is_constructor = False @@ -608,6 +618,7 @@ def method_to_apr_proof( hevm=hevm, trace_options=trace_options, config_type=config_type, + block_metadata=block_metadata, ) apr_proof = APRProof( @@ -654,6 +665,7 @@ def _method_to_initialized_cfg( active_symbolik: bool = False, hevm: bool = False, trace_options: TraceOptions | None = None, + block_metadata: dict[str, int] | None = None, ) -> tuple[KCFG, int, int, Iterable[int]]: _LOGGER.info(f'Initializing KCFG for test: {test.id}') @@ -672,6 +684,7 @@ def _method_to_initialized_cfg( stack_checks=stack_checks, hevm=hevm, trace_options=trace_options, + block_metadata=block_metadata, ) for node_id in new_node_ids: @@ -706,6 +719,7 @@ def _method_to_cfg( stack_checks: bool, hevm: bool = False, trace_options: TraceOptions | None = None, + block_metadata: dict[str, int] | None = None, ) -> tuple[KCFG, list[int], int, int, Iterable[int]]: calldata = None callvalue = None @@ -743,6 +757,7 @@ def _method_to_cfg( config_type=config_type, additional_accounts=external_libs, stack_checks=stack_checks, + block_metadata=block_metadata, ) new_node_ids = [] bounded_node_ids = [] @@ -1004,6 +1019,7 @@ def _init_cterm( callvalue: KInner | None = None, recorded_state_entries: Iterable[StateDiffEntry] | Iterable[StateDumpEntry] | None = None, trace_options: TraceOptions | None = None, + block_metadata: dict[str, int] | None = None, ) -> CTerm: schedule = KApply(evm_chain_options.schedule + '_EVM') contract_name = contract_name.upper() @@ -1069,6 +1085,19 @@ def _init_cterm( 'ACCOUNTS_CELL': KEVM.accounts(init_account_list), } init_subst.update(init_subst_test) + if block_metadata: + init_subst_fork_data = { + 'NUMBER_CELL': token(block_metadata['block_number']), + 'CHAINID_CELL': token(block_metadata['chain_id']), + 'GASLIMIT_CELL': token(block_metadata['gas_limit']), + 'GASPRICE_CELL': token(block_metadata['gas_price']), + 'BASEFEE_CELL': token(block_metadata['block_base_fee_per_gas']), + 'COINBASE_CELL': token(block_metadata['block_coinbase']), + 'TIMESTAMP_CELL': token(block_metadata['block_timestamp']), + 'DIFFICUTLY_CELL': token(block_metadata['block_difficulty']), + } + init_subst.update(init_subst_fork_data) + else: # CSE needs to be agnostic of the following Kontrol cells del init_subst['ACTIVE_CELL'] diff --git a/src/kontrol/web3_rpc.py b/src/kontrol/web3_rpc.py new file mode 100644 index 000000000..8707f572c --- /dev/null +++ b/src/kontrol/web3_rpc.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING + +from web3 import Web3 + +if TYPE_CHECKING: + from typing import Final + +_LOGGER: Final = logging.getLogger(__name__) + + +class Web3Providers: + """ + A simple registry that returns a single Web3 instance per unique URL to avoid duplicate sessions and redundant + connections. + """ + + _instances: dict[str, Web3] = {} + + @classmethod + def get_provider(cls, url: str) -> Web3: + if url not in cls._instances: + _LOGGER.info(f'Creating connection to web3 provider: {url}') + cls._instances[url] = Web3(Web3.HTTPProvider(url)) + else: + _LOGGER.debug(f'Reusing existing provider for: {url}') + return cls._instances[url] + + +def get_block_metadata(w3: Web3) -> dict[str, int]: + block_number = w3.eth.block_number + w3.eth.chain_id + block_metadata = w3.eth.get_block(block_number) + # TODO: fetch rest of the block header + # TODO: fix error: Dict entry 3 has incompatible type "str": "object"; expected "str": "int" [dict-item] + + return { + 'block_number': block_number, + 'chain_id': w3.eth.chain_id, + 'gas_limit': block_metadata.get('gasLimit', 9223372036854775807), + 'gas_price': int(str(block_metadata.get('gasPrice', 0))), + 'block_base_fee_per_gas': block_metadata.get('baseFeePerGas', 0), + 'block_coinbase': int(block_metadata.get('miner', '0x0'), 0), + 'block_timestamp': block_metadata.get('timestamp', 1), + 'block_difficulty': block_metadata.get('difficulty', 0), + } From d0484619dc11896a2f8579484968fe50dd34d4d8 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 1 Feb 2025 01:58:21 +0200 Subject: [PATCH 02/19] working prototype; rough code --- src/kontrol/foundry.py | 279 ++++++++++++++++++++++++++++++++++- src/kontrol/kdist/foundry.md | 37 +++++ src/kontrol/prove.py | 5 +- 3 files changed, 313 insertions(+), 8 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index 88e5d8ed6..459e0560b 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -20,7 +20,7 @@ from kevm_pyk.kevm import KEVM, KEVMNodePrinter, KEVMSemantics from kevm_pyk.utils import byte_offset_to_lines, legacy_explore, print_failure_info, print_model from pyk.cterm import CTerm -from pyk.kast.inner import KApply, KInner, KSequence, KSort, KToken, KVariable, Subst +from pyk.kast.inner import KApply, KInner, KSequence, KSort, KToken, KVariable, Subst, build_assoc from pyk.kast.manip import ( cell_label_to_var_name, collect, @@ -37,15 +37,17 @@ from pyk.kcfg.minimize import KCFGMinimizer from pyk.kdist import kdist from pyk.prelude.bytes import bytesToken -from pyk.prelude.collections import map_empty +from pyk.prelude.collections import map_empty, set_empty from pyk.prelude.k import DOTS, GENERATED_TOP_CELL from pyk.prelude.kbool import notBool from pyk.prelude.kint import INT, intToken from pyk.prelude.ml import mlEqualsFalse, mlEqualsTrue +from pyk.prelude.utils import token from pyk.proof.proof import Proof from pyk.proof.reachability import APRFailureInfo, APRProof from pyk.proof.show import APRProofNodePrinter, APRProofShow from pyk.utils import ensure_dir_path, hash_str, run_process_2, single, unique +from web3 import Web3 from . import VERSION from .solc import CompilationUnit @@ -60,6 +62,7 @@ kontrol_up_to_date, write_to_file, ) +from .web3_rpc import Web3Providers if TYPE_CHECKING: from collections.abc import Iterable @@ -95,6 +98,19 @@ class KontrolSemantics(KEVMSemantics): + _provider: Web3 | None + _external_accounts: list[int] + + def __init__( + self, auto_abstract_gas: bool = False, allow_symbolic_program: bool = False, provider_url: str | None = None + ) -> None: + super().__init__(auto_abstract_gas=auto_abstract_gas, allow_symbolic_program=allow_symbolic_program) + + self._external_accounts = [] + if provider_url: + self._provider = Web3Providers.get_provider(provider_url) + else: + self._provider = None @staticmethod def cut_point_rules( @@ -111,11 +127,7 @@ def cut_point_rules( cut_point_rules.extend( [ 'EVM.call.false', - 'EVM.balance.false', - 'EVM.extcodesize.false', - 'EVM.extcodehash.false', - 'EVM.extcodecopy.false', - 'EVM.sload', + 'FOUNDRY.sload.false', ] ) return cut_point_rules + KEVMSemantics.cut_point_rules( @@ -295,11 +307,204 @@ def _filter_constraints_by_simplification( new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'K_CELL', KSequence(subst['###CONTINUATION']))) return Step(CTerm(new_cterm.config, new_constraints), 1, (), ['cheatcode_forget'], cut=True) + def _check_fork_pattern(self, cterm: CTerm) -> bool: + print('CHECKING FORK PATTERN') + abstract_pattern = KSequence( + [ + KApply( + 'callwithcode_check_fork', + [ + KVariable('###ACCTFROM'), + KVariable('###ACCTTO'), + KVariable('###ACCTCODE'), + KToken(token='b""', sort=KSort(name='Bytes')), + KVariable('###VALUE'), + KVariable('###APPVALUE'), + KVariable('###ARGS'), + KVariable('###STATIC'), + ], + ), + KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), + KApply('pc', KVariable('###PC')), + KApply('execute', []), + KVariable('###CONTINUATION'), + ] + ) + print(cterm.cell('K_CELL')) + self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) + print(f'RESULT {self._cached_subst is not None}') + return self._cached_subst is not None + + def _exec_fork_call_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: + subst = self._cached_subst + assert subst is not None + if self._provider is None: + raise ValueError('PROVIDER CONN ERR') + assert self._provider is not None + + target_address = subst['###ACCTCODE'] + assert type(target_address) is KToken + address_value = int(target_address.token) + if address_value in self._external_accounts: + raise ValueError('VALUE ALREADY PROCESSED') + + # At this point, we know that target_account is not part of the account cell map, + # so we need to read the account through the web3 provider and inject it in the state + account_code, account = fetch_account_from_provider(provider=self._provider, target_address=target_address) + accounts_cell = cterm.cell('ACCOUNTS_CELL') + all_accounts = flatten_label('_AccountCellMap_', accounts_cell) + all_accounts.append(account) + new_accounts_cell = KEVM.accounts(all_accounts) + + continuation = KSequence( + [ + KApply( + 'callwithcode_check_fork', + [ + subst['###ACCTFROM'], + subst['###ACCTTO'], + subst['###ACCTCODE'], + account_code, + subst['###VALUE'], + subst['###APPVALUE'], + subst['###ARGS'], + subst['###STATIC'], + ], + ), + KApply('#return___EVM_KItem_Int_Int', [subst['###RETURN1'], subst['###RETURN2']]), + KApply('pc', subst['###PC']), + KApply('execute', []), + subst['###CONTINUATION'], + ] + ) + # Add the account address to the cell if not already. + forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') + account_set_item = KApply('SetItem', target_address) + forked_accounts: list[KInner] = [] + if forked_accounts_cell == set_empty(): + forked_accounts = [account_set_item] + else: + forked_accounts = flatten_label('_Set_', forked_accounts_cell) + if account_set_item not in forked_accounts: + forked_accounts.append(account_set_item) + + new_forked_accounts_cell = build_assoc(KApply('.Set'), '_Set_', forked_accounts) + self._external_accounts.append(address_value) + + new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + # Update the Accounts cell with the continuation + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + _LOGGER.info(f'Successfully read account {address_value} from w3 provider and added it to the state') + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.false'], cut=True) + + # KSequence(items=(KApply(label=KLabel(name='FETCH_ACCOUNT_STORAGE', params=()), args=(KToken(token='103357696640705820808527172172828496799009669636', sort=KSort(name='Int')), KToken(token='13407199363679635973052879518465057167389910613330280238043615909335847287356', sort=KSort(name='Int')))), + # KApply(label=KLabel(name='#push_EVM_InternalOp', params=()), args=()), + # KApply(label=KLabel(name='pc', params=()), args=(KApply(label=KLabel(name='SLOAD_EVM_UnStackOp', params=()), args=()),)), + # KApply(label=KLabel(name='execute', params=()), args=()), + # KApply(label=KLabel(name='#return___EVM_KItem_Int_Int', params=()), args=(KToken(token='128', sort=KSort(name='Int')), KToken(token='32', sort=KSort(name='Int')))), + # KApply(label=KLabel(name='pc', params=()), args=(KApply(label=KLabel(name='STATICCALL_EVM_CallSixOp', params=()), args=()),)), KApply(label=KLabel(name='execute', params=()), args=()), + # KVariable(name='###CONTINUATION', sort=KSort(name='K')))) + + def _check_fork_sload_pattern(self, cterm: CTerm) -> bool: + print('CHECKING SLOAD FORK PATTERN') + abstract_pattern = KSequence( + [ + KApply('FETCH_ACCOUNT_STORAGE', [KVariable('###ACCTID'), KVariable('###ACCTSLOT')]), + KApply('#push_EVM_InternalOp'), + KApply('pc', KVariable('###PC1')), + KApply('execute', []), + KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), + KApply('pc', KVariable('###PC2')), + KVariable('###CONTINUATION'), + ] + ) + self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) + print(f'RESULT {self._cached_subst is not None}') + return self._cached_subst is not None + + def _exec_fork_sload_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: + subst = self._cached_subst + assert subst is not None + if self._provider is None: + raise ValueError('PROVIDER CONN ERR') + assert self._provider is not None + + target_address = subst['###ACCTID'] + target_slot = subst['###ACCTSLOT'] + assert type(target_address) is KToken and type(target_slot) is KToken + address_value = int(target_address.token) + + accounts = flatten_label('_AccountCellMap_', cterm.cell('ACCOUNTS_CELL')) + new_account_list: list[KInner] = [] + + if address_value not in self._external_accounts: + self._external_accounts.append(address_value) + _, account_to_update = fetch_account_from_provider(self._provider, target_address) + new_account_list.extend(accounts) + else: + # find target_address in cell map + account_to_update = None + for acct_cell in accounts: + assert type(acct_cell) is KApply + acct_id_cell = acct_cell.args[0] + assert type(acct_id_cell) is KApply + if acct_id_cell.args[0] == target_address: + account_to_update = acct_cell + else: + new_account_list.append(acct_cell) + + assert account_to_update is not None + + value = fetch_storage_value_from_provider(self._provider, target_address, target_slot) + new_account = add_to_account_storage(account_to_update, target_slot, value) + new_account_list.append(new_account) + + new_accounts_cell = KEVM.accounts(new_account_list) + + continuation = KSequence( + [ + value, + KApply('#push_EVM_InternalOp'), + KApply('pc', subst['###PC1']), + KApply('execute'), + KApply('#return___EVM_KItem_Int_Int', [subst['###RETURN1'], subst['###RETURN2']]), + KApply('pc', subst['###PC2']), + subst['###CONTINUATION'], + ] + ) + # Add the account address to the cell if not already. + if address_value not in self._external_accounts: + forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') + account_set_item = KApply('SetItem', target_address) + forked_accounts: list[KInner] = [] + if forked_accounts_cell == set_empty(): + forked_accounts = [account_set_item] + else: + forked_accounts = flatten_label('_Set_', forked_accounts_cell) + if account_set_item not in forked_accounts: + forked_accounts.append(account_set_item) + new_forked_accounts_cell = build_assoc(KApply('.Set'), '_Set_', forked_accounts) + self._external_accounts.append(address_value) + cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + + # Update the Accounts cell with the continuation + new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + _LOGGER.info( + f'Successfully read storage slot {int(target_slot.token)} of address {address_value} from w3 provider and added it to the state' + ) + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_STORAGE'], cut=True) + def custom_step(self, cterm: CTerm, cterm_symbolic: CTermSymbolic) -> KCFGExtendResult | None: if self._check_rename_pattern(cterm): return self._exec_rename_custom_step(cterm) elif self._check_forget_pattern(cterm): return self._exec_forget_custom_step(cterm, cterm_symbolic) + elif self._check_fork_pattern(cterm): + return self._exec_fork_call_pattern(cterm) + elif self._check_fork_sload_pattern(cterm): + return self._exec_fork_sload_pattern(cterm) else: return super().custom_step(cterm, cterm_symbolic) @@ -309,6 +514,66 @@ def can_make_custom_step(self, cterm: CTerm) -> bool: ) +def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KApply]: + hex_address = Web3.to_hex(int(target_address.token)) + checksum_addr = Web3.to_checksum_address(hex_address) + + _LOGGER.info(f'Reading code for {checksum_addr}') + code = bytes(provider.eth.get_code(checksum_addr)) + _LOGGER.info(f'Reading balance for {checksum_addr}') + balance = provider.eth.get_balance(checksum_addr) + return ( + token(code), + KEVM.account_cell( + id=target_address, + balance=token(balance), + code=token(code), + storage=map_empty(), + orig_storage=map_empty(), + transient_storage=map_empty(), + nonce=token(0), + ), + ) + + +def fetch_storage_value_from_provider(provider: Web3, target_address: KToken, target_slot: KToken) -> KToken: + hex_address = Web3.to_hex(int(target_address.token)) + checksum_addr = Web3.to_checksum_address(hex_address) + slot = int(target_slot.token) + _LOGGER.info(f'Reading storage slot {slot} from {checksum_addr}') + value = int.from_bytes(bytes(provider.eth.get_storage_at(checksum_addr, slot))) # convert hex bytes to int + return token(value) + + +def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: + new_map_item = KApply('_|->_', [slot, value]) + acct_id_cell = account.args[0] + balance_cell = account.args[1] + code_cell = account.args[2] + storage_cell = account.args[3] + transient_storage_cell = account.args[5] + nonce_cell = account.args[6] + assert type(acct_id_cell) is KApply and acct_id_cell.label.name == '' + assert type(balance_cell) is KApply and balance_cell.label.name == '' + assert type(code_cell) is KApply and code_cell.label.name == '' + assert type(storage_cell) is KApply and storage_cell.label.name == '' + assert type(transient_storage_cell) is KApply and transient_storage_cell.label.name == '' + assert type(nonce_cell) is KApply and nonce_cell.label.name == '' + storage_map_items = flatten_label('_Map_', storage_cell.args[0]) + storage_map_items.append(new_map_item) + new_storage = build_assoc(map_empty(), '_Map_', storage_map_items) + + return KEVM.account_cell( + id=acct_id_cell.args[0], + balance=balance_cell.args[0], + code=code_cell.args[0], + storage=new_storage, + orig_storage=new_storage, + transient_storage=transient_storage_cell.args[0], + nonce=nonce_cell.args[0], + ) + + class FoundryKEVM(KEVM): foundry: Foundry diff --git a/src/kontrol/kdist/foundry.md b/src/kontrol/kdist/foundry.md index 871f0dd18..8e55ab809 100644 --- a/src/kontrol/kdist/foundry.md +++ b/src/kontrol/kdist/foundry.md @@ -30,10 +30,47 @@ module FOUNDRY configuration + .Set true + + // Comment: these two functions could be upstreamed to KEVM + syntax Bool ::= #accountInState ( Int ) [function, symbol(#accountInState)] + // --------------------------------------------------------------------------- + rule [[ #accountInState(ACCT) => true ]] + + ACCT + ... + + rule #accountInState(_) => false [owise] + + syntax Bool ::= #accountHasStorageSlot ( Int , Int ) [function, symbol(#accountHasStorageSlot)] + // ----------------------------------------------------------------------------------------------- + rule [[ #accountHasStorageSlot(ACCT, INDEX) => INDEX in_keys(STORAGE_MAP) ]] + + ACCT + STORAGE_MAP + ... + + rule #accountHasStorageSlot (_,_) => false [owise] + +// Comment: Ideally, rules below would be available only when --fork-url is provided. + syntax KItem ::= "FETCH_ACCOUNT_STORAGE" Int Int [symbol(FETCH_ACCOUNT_STORAGE)] + // | "FETCH_ACCOUNT_BALANCE" Int [symbol(FETCH_ACCOUNT_BALANCE)] + // | "FETCH_ACCOUNT_CODE" Int [symbol(FETCH_ACCOUNT_CODE)] + // | "FETCH_ACCOUNT_CODE_SIZE" Int [symbol(FETCH_ACCOUNT_CODE_SIZE)] + // | "FETCH_ACCOUNT_CODE_HASH" Int [symbol(FETCH_ACCOUNT_CODE_HASH)] + // -------------------------------------------------------------------------------- + rule [sload.false]: + SLOAD INDEX => FETCH_ACCOUNT_STORAGE ACCT INDEX ~> #push ... + ACCT + FA + requires notBool #accountInState(ACCT) + orBool (ACCT in FA andBool notBool #accountHasStorageSlot(ACCT, INDEX)) + [priority(30)] + endmodule ``` diff --git a/src/kontrol/prove.py b/src/kontrol/prove.py index fa9cfcefc..1085dae1b 100644 --- a/src/kontrol/prove.py +++ b/src/kontrol/prove.py @@ -382,7 +382,9 @@ def create_kcfg_explore() -> KCFGExplore: ) return KCFGExplore( cterm_symbolic, - kcfg_semantics=KontrolSemantics(auto_abstract_gas=options.auto_abstract_gas), + kcfg_semantics=KontrolSemantics( + auto_abstract_gas=options.auto_abstract_gas, provider_url=options.fork_url + ), id=test.id, ) @@ -1064,6 +1066,7 @@ def _init_cterm( 'TRACEMEMORY_CELL': TRUE if trace_options.trace_memory else FALSE, 'RECORDEDTRACE_CELL': FALSE, 'TRACEDATA_CELL': KApply('.List'), + 'FORKEDACCOUNTS_CELL': set_empty(), } storage_constraints: list[KApply] = [] From 575b71fe75ae230e6a52c19c72815bb2bf16845e Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 1 Feb 2025 14:02:29 +0200 Subject: [PATCH 03/19] move provider functions to web3_rpc.py --- src/kontrol/foundry.py | 36 +--------------- src/kontrol/web3_rpc.py | 91 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index 459e0560b..9b01739f4 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -42,12 +42,10 @@ from pyk.prelude.kbool import notBool from pyk.prelude.kint import INT, intToken from pyk.prelude.ml import mlEqualsFalse, mlEqualsTrue -from pyk.prelude.utils import token from pyk.proof.proof import Proof from pyk.proof.reachability import APRFailureInfo, APRProof from pyk.proof.show import APRProofNodePrinter, APRProofShow from pyk.utils import ensure_dir_path, hash_str, run_process_2, single, unique -from web3 import Web3 from . import VERSION from .solc import CompilationUnit @@ -62,7 +60,7 @@ kontrol_up_to_date, write_to_file, ) -from .web3_rpc import Web3Providers +from .web3_rpc import Web3Providers, fetch_account_from_provider, fetch_storage_value_from_provider if TYPE_CHECKING: from collections.abc import Iterable @@ -76,6 +74,7 @@ from pyk.proof.implies import RefutationProof from pyk.proof.show import NodePrinter from pyk.utils import BugReport + from web3 import Web3 from .options import ( CleanOptions, @@ -514,37 +513,6 @@ def can_make_custom_step(self, cterm: CTerm) -> bool: ) -def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KApply]: - hex_address = Web3.to_hex(int(target_address.token)) - checksum_addr = Web3.to_checksum_address(hex_address) - - _LOGGER.info(f'Reading code for {checksum_addr}') - code = bytes(provider.eth.get_code(checksum_addr)) - _LOGGER.info(f'Reading balance for {checksum_addr}') - balance = provider.eth.get_balance(checksum_addr) - return ( - token(code), - KEVM.account_cell( - id=target_address, - balance=token(balance), - code=token(code), - storage=map_empty(), - orig_storage=map_empty(), - transient_storage=map_empty(), - nonce=token(0), - ), - ) - - -def fetch_storage_value_from_provider(provider: Web3, target_address: KToken, target_slot: KToken) -> KToken: - hex_address = Web3.to_hex(int(target_address.token)) - checksum_addr = Web3.to_checksum_address(hex_address) - slot = int(target_slot.token) - _LOGGER.info(f'Reading storage slot {slot} from {checksum_addr}') - value = int.from_bytes(bytes(provider.eth.get_storage_at(checksum_addr, slot))) # convert hex bytes to int - return token(value) - - def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) acct_id_cell = account.args[0] diff --git a/src/kontrol/web3_rpc.py b/src/kontrol/web3_rpc.py index 8707f572c..3ca1b7a59 100644 --- a/src/kontrol/web3_rpc.py +++ b/src/kontrol/web3_rpc.py @@ -3,11 +3,17 @@ import logging from typing import TYPE_CHECKING +from kevm_pyk.kevm import KEVM +from pyk.prelude.collections import map_empty +from pyk.prelude.utils import token from web3 import Web3 if TYPE_CHECKING: from typing import Final + from eth_typing.evm import ChecksumAddress + from pyk.kast.inner import KApply, KToken + _LOGGER: Final = logging.getLogger(__name__) @@ -28,17 +34,21 @@ def get_provider(cls, url: str) -> Web3: _LOGGER.debug(f'Reusing existing provider for: {url}') return cls._instances[url] + @staticmethod + def get_checksum_address(address_token: KToken) -> ChecksumAddress: + """Converts a KToken representing an address into a checksum address string.""" + hex_address = Web3.to_hex(int(address_token.token)) + return Web3.to_checksum_address(hex_address) + -def get_block_metadata(w3: Web3) -> dict[str, int]: - block_number = w3.eth.block_number - w3.eth.chain_id - block_metadata = w3.eth.get_block(block_number) +def get_block_metadata(provider: Web3) -> dict[str, int]: + block_number = provider.eth.block_number + block_metadata = provider.eth.get_block(block_number) # TODO: fetch rest of the block header - # TODO: fix error: Dict entry 3 has incompatible type "str": "object"; expected "str": "int" [dict-item] return { 'block_number': block_number, - 'chain_id': w3.eth.chain_id, + 'chain_id': provider.eth.chain_id, 'gas_limit': block_metadata.get('gasLimit', 9223372036854775807), 'gas_price': int(str(block_metadata.get('gasPrice', 0))), 'block_base_fee_per_gas': block_metadata.get('baseFeePerGas', 0), @@ -46,3 +56,72 @@ def get_block_metadata(w3: Web3) -> dict[str, int]: 'block_timestamp': block_metadata.get('timestamp', 1), 'block_difficulty': block_metadata.get('difficulty', 0), } + + +def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KApply]: + """Fetch the account's code and balance from the provider, and return a tuple containing: + - A KToken representing the account code. + - A KApply account cell with the fetched data and empty storage. + """ + + code_token = fetch_code_from_provider(provider, target_address) + balance_token = fetch_balance_from_provider(provider, target_address) + + return ( + code_token, + KEVM.account_cell( + id=target_address, + balance=balance_token, + code=code_token, + storage=map_empty(), + orig_storage=map_empty(), + transient_storage=map_empty(), + nonce=token(0), + ), + ) + + +def fetch_storage_value_from_provider(provider: Web3, target_address: KToken, target_slot: KToken) -> KToken: + """Fetch the value stored at a specific slot for a given account address from the provider, + and return it as a KToken. + """ + checksum_addr = Web3Providers.get_checksum_address(target_address) + slot = int(target_slot.token) + _LOGGER.info(f'Reading storage slot {slot} from {checksum_addr}') + + try: + storage_bytes = provider.eth.get_storage_at(checksum_addr, slot) + except Exception as e: + _LOGGER.error(f'Error fetching storage at slot {slot} for {checksum_addr}: {e}') + raise + + value = int.from_bytes(storage_bytes, byteorder='big') + return token(value) + + +def fetch_code_from_provider(provider: Web3, target_address: KToken) -> KToken: + """Fetch the code of a given account address from the provider and return it as a KToken.""" + + checksum_addr = Web3Providers.get_checksum_address(target_address) + _LOGGER.info(f'Reading code for {checksum_addr}') + + try: + code_bytes = provider.eth.get_code(checksum_addr) + except Exception as e: + _LOGGER.error(f'Error fetching code for {checksum_addr}: {e}') + raise + return token(bytes(code_bytes)) + + +def fetch_balance_from_provider(provider: Web3, target_address: KToken) -> KToken: + """Fetch the balance of a given account address from the provider and return it as a KToken.""" + + checksum_addr = Web3Providers.get_checksum_address(target_address) + _LOGGER.info(f'Reading balance for {checksum_addr}') + + try: + balance = provider.eth.get_balance(checksum_addr) + except Exception as e: + _LOGGER.error(f'Error fetching balance for {checksum_addr}: {e}') + raise + return token(balance) From 93024aaeea554775e0eca635a69e451088fca1cb Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 1 Feb 2025 16:00:51 +0200 Subject: [PATCH 04/19] remove notes from code --- src/kontrol/foundry.py | 113 +++++++++++++++++++--------------------- src/kontrol/web3_rpc.py | 3 +- 2 files changed, 55 insertions(+), 61 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index 9b01739f4..7f42070bf 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -98,14 +98,14 @@ class KontrolSemantics(KEVMSemantics): _provider: Web3 | None - _external_accounts: list[int] + _external_accounts: set[int] def __init__( self, auto_abstract_gas: bool = False, allow_symbolic_program: bool = False, provider_url: str | None = None ) -> None: super().__init__(auto_abstract_gas=auto_abstract_gas, allow_symbolic_program=allow_symbolic_program) - self._external_accounts = [] + self._external_accounts = set() if provider_url: self._provider = Web3Providers.get_provider(provider_url) else: @@ -306,8 +306,7 @@ def _filter_constraints_by_simplification( new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'K_CELL', KSequence(subst['###CONTINUATION']))) return Step(CTerm(new_cterm.config, new_constraints), 1, (), ['cheatcode_forget'], cut=True) - def _check_fork_pattern(self, cterm: CTerm) -> bool: - print('CHECKING FORK PATTERN') + def _check_fork_call_pattern(self, cterm: CTerm) -> bool: abstract_pattern = KSequence( [ KApply( @@ -329,32 +328,33 @@ def _check_fork_pattern(self, cterm: CTerm) -> bool: KVariable('###CONTINUATION'), ] ) - print(cterm.cell('K_CELL')) self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) - print(f'RESULT {self._cached_subst is not None}') return self._cached_subst is not None def _exec_fork_call_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: + if self._provider is None: + raise ValueError('No web3 provider configured for fork execution.') subst = self._cached_subst assert subst is not None - if self._provider is None: - raise ValueError('PROVIDER CONN ERR') - assert self._provider is not None target_address = subst['###ACCTCODE'] - assert type(target_address) is KToken + if type(target_address) is not KToken: + raise TypeError('Expected target_address to be a KToken.') + address_value = int(target_address.token) if address_value in self._external_accounts: - raise ValueError('VALUE ALREADY PROCESSED') + raise ValueError(f'Account {address_value} already processed for fork.') - # At this point, we know that target_account is not part of the account cell map, - # so we need to read the account through the web3 provider and inject it in the state + # Read the account from the web3 provider account_code, account = fetch_account_from_provider(provider=self._provider, target_address=target_address) + + # Update the ACCOUNTS_CELL by appending the new account. accounts_cell = cterm.cell('ACCOUNTS_CELL') all_accounts = flatten_label('_AccountCellMap_', accounts_cell) all_accounts.append(account) new_accounts_cell = KEVM.accounts(all_accounts) + # Build a new continuation, replacing the account code placeholder with the fetched code. continuation = KSequence( [ KApply( @@ -376,37 +376,20 @@ def _exec_fork_call_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: subst['###CONTINUATION'], ] ) - # Add the account address to the cell if not already. - forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') - account_set_item = KApply('SetItem', target_address) - forked_accounts: list[KInner] = [] - if forked_accounts_cell == set_empty(): - forked_accounts = [account_set_item] - else: - forked_accounts = flatten_label('_Set_', forked_accounts_cell) - if account_set_item not in forked_accounts: - forked_accounts.append(account_set_item) - new_forked_accounts_cell = build_assoc(KApply('.Set'), '_Set_', forked_accounts) - self._external_accounts.append(address_value) + # Update the FORKEDACCOUNTS_CELL via a helper. + new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) + self._external_accounts.add(address_value) + # Chain cell updates into a new configuration. new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - # Update the Accounts cell with the continuation new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) - _LOGGER.info(f'Successfully read account {address_value} from w3 provider and added it to the state') - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.false'], cut=True) - # KSequence(items=(KApply(label=KLabel(name='FETCH_ACCOUNT_STORAGE', params=()), args=(KToken(token='103357696640705820808527172172828496799009669636', sort=KSort(name='Int')), KToken(token='13407199363679635973052879518465057167389910613330280238043615909335847287356', sort=KSort(name='Int')))), - # KApply(label=KLabel(name='#push_EVM_InternalOp', params=()), args=()), - # KApply(label=KLabel(name='pc', params=()), args=(KApply(label=KLabel(name='SLOAD_EVM_UnStackOp', params=()), args=()),)), - # KApply(label=KLabel(name='execute', params=()), args=()), - # KApply(label=KLabel(name='#return___EVM_KItem_Int_Int', params=()), args=(KToken(token='128', sort=KSort(name='Int')), KToken(token='32', sort=KSort(name='Int')))), - # KApply(label=KLabel(name='pc', params=()), args=(KApply(label=KLabel(name='STATICCALL_EVM_CallSixOp', params=()), args=()),)), KApply(label=KLabel(name='execute', params=()), args=()), - # KVariable(name='###CONTINUATION', sort=KSort(name='K')))) + _LOGGER.info(f'Successfully read account {address_value} from provider and added it to the state') + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.false'], cut=True) def _check_fork_sload_pattern(self, cterm: CTerm) -> bool: - print('CHECKING SLOAD FORK PATTERN') abstract_pattern = KSequence( [ KApply('FETCH_ACCOUNT_STORAGE', [KVariable('###ACCTID'), KVariable('###ACCTSLOT')]), @@ -419,48 +402,56 @@ def _check_fork_sload_pattern(self, cterm: CTerm) -> bool: ] ) self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) - print(f'RESULT {self._cached_subst is not None}') return self._cached_subst is not None def _exec_fork_sload_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: - subst = self._cached_subst - assert subst is not None if self._provider is None: - raise ValueError('PROVIDER CONN ERR') - assert self._provider is not None + raise ValueError('No web3 provider configured for fork execution.') + + subst = self._cached_subst + if subst is None: + raise ValueError('Fork sload pattern substitution missing.') target_address = subst['###ACCTID'] target_slot = subst['###ACCTSLOT'] - assert type(target_address) is KToken and type(target_slot) is KToken + if not (type(target_address) is KToken and type(target_slot) is KToken): + raise TypeError('Expected target_address and target_slot to be KToken instances.') + address_value = int(target_address.token) accounts = flatten_label('_AccountCellMap_', cterm.cell('ACCOUNTS_CELL')) new_account_list: list[KInner] = [] + # Fetch the account from the web3 provider if it hasn't been processed yet. + if address_value not in self._external_accounts: - self._external_accounts.append(address_value) _, account_to_update = fetch_account_from_provider(self._provider, target_address) new_account_list.extend(accounts) else: # find target_address in cell map account_to_update = None for acct_cell in accounts: - assert type(acct_cell) is KApply + if not type(acct_cell) is KApply: + continue acct_id_cell = acct_cell.args[0] - assert type(acct_id_cell) is KApply + if not type(acct_id_cell) is KApply: + continue if acct_id_cell.args[0] == target_address: account_to_update = acct_cell else: new_account_list.append(acct_cell) - assert account_to_update is not None + if account_to_update is None: + raise ValueError(f'Account corresponding to {target_address} not found in ACCOUNTS_CELL.') + # Fetch the storage value at the given slot. value = fetch_storage_value_from_provider(self._provider, target_address, target_slot) new_account = add_to_account_storage(account_to_update, target_slot, value) new_account_list.append(new_account) new_accounts_cell = KEVM.accounts(new_account_list) + # Build the new continuation. continuation = KSequence( [ value, @@ -472,19 +463,11 @@ def _exec_fork_sload_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: subst['###CONTINUATION'], ] ) - # Add the account address to the cell if not already. + + # Update the forked accounts cell if targed_address had to be fetched. if address_value not in self._external_accounts: - forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') - account_set_item = KApply('SetItem', target_address) - forked_accounts: list[KInner] = [] - if forked_accounts_cell == set_empty(): - forked_accounts = [account_set_item] - else: - forked_accounts = flatten_label('_Set_', forked_accounts_cell) - if account_set_item not in forked_accounts: - forked_accounts.append(account_set_item) - new_forked_accounts_cell = build_assoc(KApply('.Set'), '_Set_', forked_accounts) - self._external_accounts.append(address_value) + new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) + self._external_accounts.add(address_value) cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) # Update the Accounts cell with the continuation @@ -500,7 +483,7 @@ def custom_step(self, cterm: CTerm, cterm_symbolic: CTermSymbolic) -> KCFGExtend return self._exec_rename_custom_step(cterm) elif self._check_forget_pattern(cterm): return self._exec_forget_custom_step(cterm, cterm_symbolic) - elif self._check_fork_pattern(cterm): + elif self._check_fork_call_pattern(cterm): return self._exec_fork_call_pattern(cterm) elif self._check_fork_sload_pattern(cterm): return self._exec_fork_sload_pattern(cterm) @@ -512,6 +495,18 @@ def can_make_custom_step(self, cterm: CTerm) -> bool: [self._check_rename_pattern(cterm), self._check_forget_pattern(cterm), super().can_make_custom_step(cterm)] ) + def _update_forked_accounts(self, cterm: CTerm, target_address: KToken) -> KInner: + """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" + + forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') + account_set_item = KApply('SetItem', target_address) + if forked_accounts_cell == set_empty(): + forked_accounts: list[KInner] = [account_set_item] + else: + forked_accounts = flatten_label('_Set_', forked_accounts_cell) + if account_set_item not in forked_accounts: + forked_accounts.append(account_set_item) + return build_assoc(KApply('.Set'), '_Set_', forked_accounts) def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) diff --git a/src/kontrol/web3_rpc.py b/src/kontrol/web3_rpc.py index 3ca1b7a59..11931bfc2 100644 --- a/src/kontrol/web3_rpc.py +++ b/src/kontrol/web3_rpc.py @@ -18,8 +18,7 @@ class Web3Providers: - """ - A simple registry that returns a single Web3 instance per unique URL to avoid duplicate sessions and redundant + """A simple registry that returns a single Web3 instance per unique URL to avoid duplicate sessions and redundant connections. """ From 4ad4a0929b710345b9f5a03f3dde4b62c8932a24 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:27:39 +0200 Subject: [PATCH 05/19] refactor custom_steps; remove caching the subst --- src/kontrol/foundry.py | 160 +++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 96 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index 7f42070bf..e3b2a3458 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -111,6 +111,13 @@ def __init__( else: self._provider = None + self._custom_step_definitions = self._custom_step_definitions + ( + (self._rename_pattern, self._exec_rename_custom_step), + (self._forget_branch_pattern, self._exec_forget_custom_step), + (self._call_fork_pattern, self._exec_fork_call_custom_step), + (self._sload_fork_pattern, self._exec_fork_sload_custom_step), + ) + @staticmethod def cut_point_rules( break_on_jumpi: bool, @@ -138,25 +145,63 @@ def cut_point_rules( break_on_load_program, ) - def _check_rename_pattern(self, cterm: CTerm) -> bool: - """Given a CTerm, check if the rule 'FOUNDRY-CHEAT-CODES.rename' is at the top of the K_CELL. - - :param cterm: The CTerm representing the current state of the proof node. - :return: `True` if the pattern matches and a custom step can be made; `False` otherwise. - """ - abstract_pattern = KSequence( + @property + def _rename_pattern(self) -> KSequence: + return KSequence( [ KApply('foundry_rename', [KVariable('###RENAME_TARGET'), KVariable('###NEW_NAME')]), KVariable('###CONTINUATION'), ] ) - self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) - return self._cached_subst is not None - def _exec_rename_custom_step(self, cterm: CTerm) -> KCFGExtendResult | None: - subst = self._cached_subst - assert subst is not None + @property + def _forget_branch_pattern(self) -> KSequence: + return KSequence( + [ + KApply('cheatcode_forget', [KVariable('###TERM1'), KVariable('###OPERATOR'), KVariable('###TERM2')]), + KVariable('###CONTINUATION'), + ] + ) + + @property + def _call_fork_pattern(self) -> KSequence: + return KSequence( + [ + KApply( + 'callwithcode_check_fork', + [ + KVariable('###ACCTFROM'), + KVariable('###ACCTTO'), + KVariable('###ACCTCODE'), + KToken(token='b""', sort=KSort(name='Bytes')), + KVariable('###VALUE'), + KVariable('###APPVALUE'), + KVariable('###ARGS'), + KVariable('###STATIC'), + ], + ), + KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), + KApply('pc', KVariable('###PC')), + KApply('execute', []), + KVariable('###CONTINUATION'), + ] + ) + + @property + def _sload_fork_pattern(self) -> KSequence: + return KSequence( + [ + KApply('FETCH_ACCOUNT_STORAGE', [KVariable('###ACCTID'), KVariable('###ACCTSLOT')]), + KApply('#push_EVM_InternalOp'), + KApply('pc', KVariable('###PC1')), + KApply('execute', []), + KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), + KApply('pc', KVariable('###PC2')), + KVariable('###CONTINUATION'), + ] + ) + def _exec_rename_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: # Extract the target var and new name from the substitution target_var = subst['###RENAME_TARGET'] name_token = subst['###NEW_NAME'] @@ -179,23 +224,9 @@ def _exec_rename_custom_step(self, cterm: CTerm) -> KCFGExtendResult | None: _LOGGER.info(f'Renaming {target_var.name} to {name}') return Step(CTerm(new_cterm.config, constraints), 1, (), ['foundry_rename'], cut=True) - def _check_forget_pattern(self, cterm: CTerm) -> bool: - """Given a CTerm, check if the rule 'FOUNDRY-ACCOUNTS.forget' is at the top of the K_CELL. - This method checks if the 'FOUNDRY-ACCOUNTS.forget' rule is at the top of the `K_CELL` in the given `cterm`. - If the rule matches, the resulting substitution is cached in `_cached_subst` for later use in `custom_step` - :param cterm: The CTerm representing the current state of the proof node. - :return: `True` if the pattern matches and a custom step can be made; `False` otherwise. - """ - abstract_pattern = KSequence( - [ - KApply('cheatcode_forget', [KVariable('###TERM1'), KVariable('###OPERATOR'), KVariable('###TERM2')]), - KVariable('###CONTINUATION'), - ] - ) - self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) - return self._cached_subst is not None - - def _exec_forget_custom_step(self, cterm: CTerm, cterm_symbolic: CTermSymbolic) -> KCFGExtendResult | None: + def _exec_forget_custom_step( + self, subst: Subst, cterm: CTerm, cterm_symbolic: CTermSymbolic + ) -> KCFGExtendResult | None: """Remove the constraint at the top of K_CELL of a given CTerm from its path constraints, as part of the 'FOUNDRY-ACCOUNTS.forget' cut-rule. :param cterm: CTerm representing a proof node @@ -270,8 +301,7 @@ def _filter_constraints_by_simplification( return constraints _operators = ['_==Int_', '_=/=Int_', '_<=Int_', '_=Int_', '_>Int_'] - subst = self._cached_subst - assert subst is not None + # Extract the terms and operator from the substitution fst_term = subst['###TERM1'] snd_term = subst['###TERM2'] @@ -306,36 +336,9 @@ def _filter_constraints_by_simplification( new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'K_CELL', KSequence(subst['###CONTINUATION']))) return Step(CTerm(new_cterm.config, new_constraints), 1, (), ['cheatcode_forget'], cut=True) - def _check_fork_call_pattern(self, cterm: CTerm) -> bool: - abstract_pattern = KSequence( - [ - KApply( - 'callwithcode_check_fork', - [ - KVariable('###ACCTFROM'), - KVariable('###ACCTTO'), - KVariable('###ACCTCODE'), - KToken(token='b""', sort=KSort(name='Bytes')), - KVariable('###VALUE'), - KVariable('###APPVALUE'), - KVariable('###ARGS'), - KVariable('###STATIC'), - ], - ), - KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), - KApply('pc', KVariable('###PC')), - KApply('execute', []), - KVariable('###CONTINUATION'), - ] - ) - self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) - return self._cached_subst is not None - - def _exec_fork_call_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: + def _exec_fork_call_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: if self._provider is None: raise ValueError('No web3 provider configured for fork execution.') - subst = self._cached_subst - assert subst is not None target_address = subst['###ACCTCODE'] if type(target_address) is not KToken: @@ -389,29 +392,10 @@ def _exec_fork_call_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: _LOGGER.info(f'Successfully read account {address_value} from provider and added it to the state') return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.false'], cut=True) - def _check_fork_sload_pattern(self, cterm: CTerm) -> bool: - abstract_pattern = KSequence( - [ - KApply('FETCH_ACCOUNT_STORAGE', [KVariable('###ACCTID'), KVariable('###ACCTSLOT')]), - KApply('#push_EVM_InternalOp'), - KApply('pc', KVariable('###PC1')), - KApply('execute', []), - KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), - KApply('pc', KVariable('###PC2')), - KVariable('###CONTINUATION'), - ] - ) - self._cached_subst = abstract_pattern.match(cterm.cell('K_CELL')) - return self._cached_subst is not None - - def _exec_fork_sload_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: + def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: if self._provider is None: raise ValueError('No web3 provider configured for fork execution.') - subst = self._cached_subst - if subst is None: - raise ValueError('Fork sload pattern substitution missing.') - target_address = subst['###ACCTID'] target_slot = subst['###ACCTSLOT'] if not (type(target_address) is KToken and type(target_slot) is KToken): @@ -478,23 +462,6 @@ def _exec_fork_sload_pattern(self, cterm: CTerm) -> KCFGExtendResult | None: ) return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_STORAGE'], cut=True) - def custom_step(self, cterm: CTerm, cterm_symbolic: CTermSymbolic) -> KCFGExtendResult | None: - if self._check_rename_pattern(cterm): - return self._exec_rename_custom_step(cterm) - elif self._check_forget_pattern(cterm): - return self._exec_forget_custom_step(cterm, cterm_symbolic) - elif self._check_fork_call_pattern(cterm): - return self._exec_fork_call_pattern(cterm) - elif self._check_fork_sload_pattern(cterm): - return self._exec_fork_sload_pattern(cterm) - else: - return super().custom_step(cterm, cterm_symbolic) - - def can_make_custom_step(self, cterm: CTerm) -> bool: - return any( - [self._check_rename_pattern(cterm), self._check_forget_pattern(cterm), super().can_make_custom_step(cterm)] - ) - def _update_forked_accounts(self, cterm: CTerm, target_address: KToken) -> KInner: """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" @@ -508,6 +475,7 @@ def _update_forked_accounts(self, cterm: CTerm, target_address: KToken) -> KInne forked_accounts.append(account_set_item) return build_assoc(KApply('.Set'), '_Set_', forked_accounts) + def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) acct_id_cell = account.args[0] From aa7e7271274f4af9e3d939727322b44e6ea17b32 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:54:56 +0200 Subject: [PATCH 06/19] remove unused flag --- src/kontrol/cli.py | 6 ------ src/kontrol/options.py | 2 -- 2 files changed, 8 deletions(-) diff --git a/src/kontrol/cli.py b/src/kontrol/cli.py index 044f45667..7f64e3493 100644 --- a/src/kontrol/cli.py +++ b/src/kontrol/cli.py @@ -597,12 +597,6 @@ def parse(s: str) -> list[T]: default=None, help=('Fetch state over a remote endpoint instead of starting from an abstract state'), ) - prove_args.add_argument( - '--fork-block-number', - dest='fork_block_number', - default=None, - help=('Fetch state from a specific block number over a remote endpoint'), - ) show_args = command_parser.add_parser( 'show', diff --git a/src/kontrol/options.py b/src/kontrol/options.py index 6a80456a7..deb3c9939 100644 --- a/src/kontrol/options.py +++ b/src/kontrol/options.py @@ -393,7 +393,6 @@ class ProveOptions( stack_checks: bool extra_module: str | None fork_url: str | None - fork_block_number: str | None def __init__(self, args: dict[str, Any]) -> None: super().__init__(args) @@ -426,7 +425,6 @@ def default() -> dict[str, Any]: 'stack_checks': True, 'extra_module': None, 'fork_url': None, - 'fork_block_number': None, } @staticmethod From 592ae79963a260b3f1ca9b4682ac96a1f03d7238 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Thu, 6 Feb 2025 18:16:10 +0200 Subject: [PATCH 07/19] add fetch productions for access opcodes --- src/kontrol/foundry.py | 45 +++++++++++++++++++++++++++--------- src/kontrol/kdist/foundry.md | 40 ++++++++++++++++++++++++++------ src/kontrol/prove.py | 8 ++++--- 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index e3b2a3458..bc65b9d4e 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -17,7 +17,7 @@ from typing import TYPE_CHECKING import tomlkit -from kevm_pyk.kevm import KEVM, KEVMNodePrinter, KEVMSemantics +from kevm_pyk.kevm import KEVM, CustomStep, KEVMNodePrinter, KEVMSemantics from kevm_pyk.utils import byte_offset_to_lines, legacy_explore, print_failure_info, print_model from pyk.cterm import CTerm from pyk.kast.inner import KApply, KInner, KSequence, KSort, KToken, KVariable, Subst, build_assoc @@ -103,7 +103,19 @@ class KontrolSemantics(KEVMSemantics): def __init__( self, auto_abstract_gas: bool = False, allow_symbolic_program: bool = False, provider_url: str | None = None ) -> None: - super().__init__(auto_abstract_gas=auto_abstract_gas, allow_symbolic_program=allow_symbolic_program) + + custom_steps = ( + CustomStep(self._rename_pattern, self._exec_rename_custom_step), + CustomStep(self._forget_branch_pattern, self._exec_forget_custom_step), + CustomStep(self._call_fork_pattern, self._exec_fork_call_custom_step), + CustomStep(self._sload_fork_pattern, self._exec_fork_sload_custom_step), + ) + + super().__init__( + auto_abstract_gas=auto_abstract_gas, + allow_symbolic_program=allow_symbolic_program, + custom_step_definitions=custom_steps, + ) self._external_accounts = set() if provider_url: @@ -111,13 +123,6 @@ def __init__( else: self._provider = None - self._custom_step_definitions = self._custom_step_definitions + ( - (self._rename_pattern, self._exec_rename_custom_step), - (self._forget_branch_pattern, self._exec_forget_custom_step), - (self._call_fork_pattern, self._exec_fork_call_custom_step), - (self._sload_fork_pattern, self._exec_fork_sload_custom_step), - ) - @staticmethod def cut_point_rules( break_on_jumpi: bool, @@ -133,7 +138,11 @@ def cut_point_rules( cut_point_rules.extend( [ 'EVM.call.false', - 'FOUNDRY.sload.false', + 'FOUNDRY.sload.w3provider', + 'FOUNDRY.balance.w3provider', + 'FOUNDRY.extcodesize.w3provider', + 'FOUNDRY.extcodehash.w3provider', + 'FOUNDRY.extcodecopy.w3provider', ] ) return cut_point_rules + KEVMSemantics.cut_point_rules( @@ -201,6 +210,16 @@ def _sload_fork_pattern(self) -> KSequence: ] ) + @property + def _balance_fork_pattern(self) -> KSequence: + return KSequence( + [ + KApply('FETCH_ACCOUNT_BALANCE', KVariable('###ACCTID')), + KApply('#push_EVM_InternalOp'), + KVariable('###CONTINUATION'), + ] + ) + def _exec_rename_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: # Extract the target var and new name from the substitution target_var = subst['###RENAME_TARGET'] @@ -357,6 +376,10 @@ def _exec_fork_call_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbo all_accounts.append(account) new_accounts_cell = KEVM.accounts(all_accounts) + if account_code is KToken('b""', sort='Bytes'): + _LOGGER.warning(f'Account {target_address.token} has no code available. Continuing execution.') + return None + # Build a new continuation, replacing the account code placeholder with the fetched code. continuation = KSequence( [ @@ -390,7 +413,7 @@ def _exec_fork_call_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbo new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) _LOGGER.info(f'Successfully read account {address_value} from provider and added it to the state') - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.false'], cut=True) + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.true'], cut=True) def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: if self._provider is None: diff --git a/src/kontrol/kdist/foundry.md b/src/kontrol/kdist/foundry.md index 8e55ab809..b78e8bb82 100644 --- a/src/kontrol/kdist/foundry.md +++ b/src/kontrol/kdist/foundry.md @@ -31,6 +31,7 @@ module FOUNDRY .Set + false true @@ -57,20 +58,45 @@ module FOUNDRY rule #accountHasStorageSlot (_,_) => false [owise] // Comment: Ideally, rules below would be available only when --fork-url is provided. - syntax KItem ::= "FETCH_ACCOUNT_STORAGE" Int Int [symbol(FETCH_ACCOUNT_STORAGE)] - // | "FETCH_ACCOUNT_BALANCE" Int [symbol(FETCH_ACCOUNT_BALANCE)] - // | "FETCH_ACCOUNT_CODE" Int [symbol(FETCH_ACCOUNT_CODE)] - // | "FETCH_ACCOUNT_CODE_SIZE" Int [symbol(FETCH_ACCOUNT_CODE_SIZE)] - // | "FETCH_ACCOUNT_CODE_HASH" Int [symbol(FETCH_ACCOUNT_CODE_HASH)] - // -------------------------------------------------------------------------------- - rule [sload.false]: +// For this I'm using the cell + syntax KItem ::= "FETCH_ACCOUNT_STORAGE" Int Int [symbol(FETCH_ACCOUNT_STORAGE) ] + | "FETCH_ACCOUNT_BALANCE" Int [symbol(FETCH_ACCOUNT_BALANCE) ] + | "FETCH_ACCOUNT_CODE_SIZE" Int [symbol(FETCH_ACCOUNT_CODE_SIZE)] + | "FETCH_ACCOUNT_CODE_HASH" Int [symbol(FETCH_ACCOUNT_CODE_HASH)] + | "FETCH_ACCOUNT_CODE" Int Int Int Int [symbol(FETCH_ACCOUNT_CODE)] + // ---------------------------------------------------------------------------------- + rule [sload.w3provider]: SLOAD INDEX => FETCH_ACCOUNT_STORAGE ACCT INDEX ~> #push ... ACCT + true FA requires notBool #accountInState(ACCT) orBool (ACCT in FA andBool notBool #accountHasStorageSlot(ACCT, INDEX)) [priority(30)] + rule [balance.w3provider]: + BALANCE ACCT => #accessAccounts ACCT ~> FETCH_ACCOUNT_BALANCE ACCT ~> #push ... + true + requires notBool #accountInState(ACCT) + [priority(30)] + + rule [extcodesize.w3provider]: + EXTCODESIZE ACCT => #accessAccounts ACCT ~> FETCH_ACCOUNT_CODE_SIZE ACCT ~> #push ... + true + requires notBool #accountInState(ACCT) + [priority(30)] + + rule [extcodecopy.w3provider]: + EXTCODECOPY ACCT MEMSTART PGMSTART WIDTH => #accessAccounts ACCT ~> FETCH_ACCOUNT_CODE ACCT MEMSTART PGMSTART WIDTH ... + true + requires notBool #accountInState(ACCT) + [priority(30)] + + rule [extcodehash.w3provider]: + EXTCODEHASH ACCT => #accessAccounts ACCT ~> FETCH_ACCOUNT_CODE_HASH ACCT ~> #push ... + true + requires notBool #accountInState(ACCT) + [priority(30)] endmodule ``` diff --git a/src/kontrol/prove.py b/src/kontrol/prove.py index 1085dae1b..74848e569 100644 --- a/src/kontrol/prove.py +++ b/src/kontrol/prove.py @@ -399,11 +399,11 @@ def create_kcfg_explore() -> KCFGExplore: ): options.config_type = ConfigType.SUMMARY_CONFIG - w3 = None + provider = None block_metadata = None if options.fork_url: - w3 = Web3Providers.get_provider(options.fork_url) - block_metadata = get_block_metadata(w3) + provider = Web3Providers.get_provider(options.fork_url) + block_metadata = get_block_metadata(provider) proof = method_to_apr_proof( test=test, @@ -1067,6 +1067,7 @@ def _init_cterm( 'RECORDEDTRACE_CELL': FALSE, 'TRACEDATA_CELL': KApply('.List'), 'FORKEDACCOUNTS_CELL': set_empty(), + 'ALLOWWEB3CONNECTION_CELL': FALSE, } storage_constraints: list[KApply] = [] @@ -1090,6 +1091,7 @@ def _init_cterm( init_subst.update(init_subst_test) if block_metadata: init_subst_fork_data = { + 'ALLOWWEB3CONNECTION_CELL': TRUE, 'NUMBER_CELL': token(block_metadata['block_number']), 'CHAINID_CELL': token(block_metadata['chain_id']), 'GASLIMIT_CELL': token(block_metadata['gas_limit']), From 53ce3ace8911d0685d9601c41632ed7432c268fd Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Fri, 7 Feb 2025 16:34:24 +0200 Subject: [PATCH 08/19] add rest of opcode hooks --- src/kontrol/foundry.py | 227 +++++++++++++++++++++++++++++++++++----- src/kontrol/web3_rpc.py | 3 +- 2 files changed, 205 insertions(+), 25 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index bc65b9d4e..c01c71dbe 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -109,6 +109,10 @@ def __init__( CustomStep(self._forget_branch_pattern, self._exec_forget_custom_step), CustomStep(self._call_fork_pattern, self._exec_fork_call_custom_step), CustomStep(self._sload_fork_pattern, self._exec_fork_sload_custom_step), + CustomStep(self._balance_fork_pattern, self._exec_balance_fork_custom_step), + CustomStep(self._extcodesize_fork_pattern, self._exec_extcodesize_fork_custom_step), + CustomStep(self._extcodehash_fork_pattern, self._exec_extcodehash_fork_custom_step), + CustomStep(self._extcodecopy_fork_pattern, self._exec_extcodecopy_fork_custom_step), ) super().__init__( @@ -138,11 +142,11 @@ def cut_point_rules( cut_point_rules.extend( [ 'EVM.call.false', - 'FOUNDRY.sload.w3provider', - 'FOUNDRY.balance.w3provider', - 'FOUNDRY.extcodesize.w3provider', - 'FOUNDRY.extcodehash.w3provider', - 'FOUNDRY.extcodecopy.w3provider', + # 'FOUNDRY.sload.w3provider', + # 'FOUNDRY.balance.w3provider', + # 'FOUNDRY.extcodesize.w3provider', + # 'FOUNDRY.extcodehash.w3provider', + # 'FOUNDRY.extcodecopy.w3provider', ] ) return cut_point_rules + KEVMSemantics.cut_point_rules( @@ -189,9 +193,6 @@ def _call_fork_pattern(self) -> KSequence: KVariable('###STATIC'), ], ), - KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), - KApply('pc', KVariable('###PC')), - KApply('execute', []), KVariable('###CONTINUATION'), ] ) @@ -201,11 +202,6 @@ def _sload_fork_pattern(self) -> KSequence: return KSequence( [ KApply('FETCH_ACCOUNT_STORAGE', [KVariable('###ACCTID'), KVariable('###ACCTSLOT')]), - KApply('#push_EVM_InternalOp'), - KApply('pc', KVariable('###PC1')), - KApply('execute', []), - KApply('#return___EVM_KItem_Int_Int', [KVariable('###RETURN1'), KVariable('###RETURN2')]), - KApply('pc', KVariable('###PC2')), KVariable('###CONTINUATION'), ] ) @@ -215,7 +211,36 @@ def _balance_fork_pattern(self) -> KSequence: return KSequence( [ KApply('FETCH_ACCOUNT_BALANCE', KVariable('###ACCTID')), - KApply('#push_EVM_InternalOp'), + KVariable('###CONTINUATION'), + ] + ) + + @property + def _extcodesize_fork_pattern(self) -> KSequence: + return KSequence( + [ + KApply('FETCH_ACCOUNT_CODE_SIZE', KVariable('###ACCTID')), + KVariable('###CONTINUATION'), + ] + ) + + @property + def _extcodehash_fork_pattern(self) -> KSequence: + return KSequence( + [ + KApply('FETCH_ACCOUNT_CODE_HASH', KVariable('###ACCTID')), + KVariable('###CONTINUATION'), + ] + ) + + @property + def _extcodecopy_fork_pattern(self) -> KSequence: + return KSequence( + [ + KApply( + 'FETCH_ACCOUNT_CODE', + [KVariable('###ACCTID'), KVariable('###MEMSTART'), KVariable('###PGMSTART'), KVariable('###WIDTH')], + ), KVariable('###CONTINUATION'), ] ) @@ -368,7 +393,7 @@ def _exec_fork_call_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbo raise ValueError(f'Account {address_value} already processed for fork.') # Read the account from the web3 provider - account_code, account = fetch_account_from_provider(provider=self._provider, target_address=target_address) + account_code, _, account = fetch_account_from_provider(provider=self._provider, target_address=target_address) # Update the ACCOUNTS_CELL by appending the new account. accounts_cell = cterm.cell('ACCOUNTS_CELL') @@ -396,9 +421,6 @@ def _exec_fork_call_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbo subst['###STATIC'], ], ), - KApply('#return___EVM_KItem_Int_Int', [subst['###RETURN1'], subst['###RETURN2']]), - KApply('pc', subst['###PC']), - KApply('execute', []), subst['###CONTINUATION'], ] ) @@ -432,7 +454,7 @@ def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymb # Fetch the account from the web3 provider if it hasn't been processed yet. if address_value not in self._external_accounts: - _, account_to_update = fetch_account_from_provider(self._provider, target_address) + _, _, account_to_update = fetch_account_from_provider(self._provider, target_address) new_account_list.extend(accounts) else: # find target_address in cell map @@ -462,11 +484,6 @@ def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymb continuation = KSequence( [ value, - KApply('#push_EVM_InternalOp'), - KApply('pc', subst['###PC1']), - KApply('execute'), - KApply('#return___EVM_KItem_Int_Int', [subst['###RETURN1'], subst['###RETURN2']]), - KApply('pc', subst['###PC2']), subst['###CONTINUATION'], ] ) @@ -485,6 +502,168 @@ def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymb ) return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_STORAGE'], cut=True) + def _exec_balance_fork_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: + if self._provider is None: + raise ValueError('No web3 provider configured for fork execution.') + + target_address = subst['###ACCTID'] + if not type(target_address) is KToken: + raise TypeError('Expected target_address to be KToken instance.') + address_value = int(target_address.token) + + _, account_balance, account = fetch_account_from_provider(self._provider, target_address) + + # Update the ACCOUNTS_CELL by appending the new account. + accounts_cell = cterm.cell('ACCOUNTS_CELL') + all_accounts = flatten_label('_AccountCellMap_', accounts_cell) + all_accounts.append(account) + new_accounts_cell = KEVM.accounts(all_accounts) + + # Build the new continuation. + continuation = KSequence( + [ + account_balance, + subst['###CONTINUATION'], + ] + ) + + # Update the FORKEDACCOUNTS_CELL via a helper. + new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) + self._external_accounts.add(address_value) + + # Update the Accounts cell with the continuation + new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_BALANCE'], cut=True) + + def _exec_extcodesize_fork_custom_step( + self, subst: Subst, cterm: CTerm, _c: CTermSymbolic + ) -> KCFGExtendResult | None: + if self._provider is None: + raise ValueError('No web3 provider configured for fork execution.') + + target_address = subst['###ACCTID'] + if not type(target_address) is KToken: + raise TypeError('Expected target_address to be KToken instance.') + address_value = int(target_address.token) + + account_code, _, account = fetch_account_from_provider(self._provider, target_address) + + # Update the ACCOUNTS_CELL by appending the new account. + accounts_cell = cterm.cell('ACCOUNTS_CELL') + all_accounts = flatten_label('_AccountCellMap_', accounts_cell) + all_accounts.append(account) + new_accounts_cell = KEVM.accounts(all_accounts) + + # Build the new continuation. + continuation = KSequence( + [ + KEVM.size_bytes(account_code), + subst['###CONTINUATION'], + ] + ) + # Update the FORKEDACCOUNTS_CELL via a helper. + new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) + self._external_accounts.add(address_value) + + # Update the Accounts cell with the continuation + new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_CODE_SIZE'], cut=True) + + def _exec_extcodehash_fork_custom_step( + self, subst: Subst, cterm: CTerm, _c: CTermSymbolic + ) -> KCFGExtendResult | None: + if self._provider is None: + raise ValueError('No web3 provider configured for fork execution.') + + target_address = subst['###ACCTID'] + if not type(target_address) is KToken: + raise TypeError('Expected target_address to be KToken instance.') + address_value = int(target_address.token) + + account_code, _, account = fetch_account_from_provider(self._provider, target_address) + + # Update the ACCOUNTS_CELL by appending the new account. + accounts_cell = cterm.cell('ACCOUNTS_CELL') + all_accounts = flatten_label('_AccountCellMap_', accounts_cell) + all_accounts.append(account) + new_accounts_cell = KEVM.accounts(all_accounts) + + # Build the new continuation. + continuation = KSequence( + [ + KApply('keccak', account_code), + subst['###CONTINUATION'], + ] + ) + # Update the FORKEDACCOUNTS_CELL via a helper. + new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) + self._external_accounts.add(address_value) + + # Update the Accounts cell with the continuation + new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_CODE_HASH'], cut=True) + + def _exec_extcodecopy_fork_custom_step( + self, subst: Subst, cterm: CTerm, _c: CTermSymbolic + ) -> KCFGExtendResult | None: + if self._provider is None: + raise ValueError('No web3 provider configured for fork execution.') + + target_address = subst['###ACCTID'] + memstart = subst['###MEMSTART'] + pgmstart = subst['###PGMSTART'] + width = subst['###WIDTH'] + if not ( + type(target_address) is KToken + and type(memstart) is KToken + and type(pgmstart) is KToken + and type(width) is KToken + ): + raise TypeError('Expected target_address to be KToken instance.') + address_value = int(target_address.token) + + account_code, _, account = fetch_account_from_provider(self._provider, target_address) + + # Update the ACCOUNTS_CELL by appending the new account. + accounts_cell = cterm.cell('ACCOUNTS_CELL') + all_accounts = flatten_label('_AccountCellMap_', accounts_cell) + all_accounts.append(account) + new_accounts_cell = KEVM.accounts(all_accounts) + + # LM => LM [ MEMSTART := #range(PGM, PGMSTART, WIDTH) ] + local_mem = cterm.cell('LOCALMEM_CELL') + new_local_mem = KApply( + 'mapWriteRange', [local_mem, memstart, KApply('#range', [account_code, pgmstart, width])] + ) + cterm = CTerm.from_kast(set_cell(cterm.kast, 'LOCALMEM_CELL', new_local_mem)) + + # Build the new continuation. + continuation = KSequence( + [ + subst['###CONTINUATION'], + ] + ) + + # Update the FORKEDACCOUNTS_CELL via a helper. + new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) + self._external_accounts.add(address_value) + + # Update the Accounts cell with the continuation + new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_CODE'], cut=True) + def _update_forked_accounts(self, cterm: CTerm, target_address: KToken) -> KInner: """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" diff --git a/src/kontrol/web3_rpc.py b/src/kontrol/web3_rpc.py index 11931bfc2..f8ce659bd 100644 --- a/src/kontrol/web3_rpc.py +++ b/src/kontrol/web3_rpc.py @@ -57,7 +57,7 @@ def get_block_metadata(provider: Web3) -> dict[str, int]: } -def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KApply]: +def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KToken, KApply]: """Fetch the account's code and balance from the provider, and return a tuple containing: - A KToken representing the account code. - A KApply account cell with the fetched data and empty storage. @@ -68,6 +68,7 @@ def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple return ( code_token, + balance_token, KEVM.account_cell( id=target_address, balance=balance_token, From f3ded6b505ccd20aa065e4e44edc3438bdc17995 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Fri, 7 Feb 2025 18:57:55 +0200 Subject: [PATCH 09/19] Refactor custom steps --- src/kontrol/foundry.py | 359 +++++------------------------------ src/kontrol/kdist/foundry.md | 53 +++--- src/kontrol/web3_rpc.py | 3 +- 3 files changed, 77 insertions(+), 338 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index c01c71dbe..d08d68721 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -98,7 +98,6 @@ class KontrolSemantics(KEVMSemantics): _provider: Web3 | None - _external_accounts: set[int] def __init__( self, auto_abstract_gas: bool = False, allow_symbolic_program: bool = False, provider_url: str | None = None @@ -107,12 +106,8 @@ def __init__( custom_steps = ( CustomStep(self._rename_pattern, self._exec_rename_custom_step), CustomStep(self._forget_branch_pattern, self._exec_forget_custom_step), - CustomStep(self._call_fork_pattern, self._exec_fork_call_custom_step), - CustomStep(self._sload_fork_pattern, self._exec_fork_sload_custom_step), - CustomStep(self._balance_fork_pattern, self._exec_balance_fork_custom_step), - CustomStep(self._extcodesize_fork_pattern, self._exec_extcodesize_fork_custom_step), - CustomStep(self._extcodehash_fork_pattern, self._exec_extcodehash_fork_custom_step), - CustomStep(self._extcodecopy_fork_pattern, self._exec_extcodecopy_fork_custom_step), + CustomStep(self._fetch_storage_pattern, self._exec_fetch_storage_custom_step), + CustomStep(self._fetch_account_pattern, self._exec_fetch_account_custom_step), ) super().__init__( @@ -121,7 +116,6 @@ def __init__( custom_step_definitions=custom_steps, ) - self._external_accounts = set() if provider_url: self._provider = Web3Providers.get_provider(provider_url) else: @@ -142,11 +136,6 @@ def cut_point_rules( cut_point_rules.extend( [ 'EVM.call.false', - # 'FOUNDRY.sload.w3provider', - # 'FOUNDRY.balance.w3provider', - # 'FOUNDRY.extcodesize.w3provider', - # 'FOUNDRY.extcodehash.w3provider', - # 'FOUNDRY.extcodecopy.w3provider', ] ) return cut_point_rules + KEVMSemantics.cut_point_rules( @@ -158,6 +147,12 @@ def cut_point_rules( break_on_load_program, ) + @property + def provider(self) -> Web3: + if self._provider is None: + raise ValueError('No web3 provider configured for fork execution.') + return self._provider + @property def _rename_pattern(self) -> KSequence: return KSequence( @@ -177,28 +172,7 @@ def _forget_branch_pattern(self) -> KSequence: ) @property - def _call_fork_pattern(self) -> KSequence: - return KSequence( - [ - KApply( - 'callwithcode_check_fork', - [ - KVariable('###ACCTFROM'), - KVariable('###ACCTTO'), - KVariable('###ACCTCODE'), - KToken(token='b""', sort=KSort(name='Bytes')), - KVariable('###VALUE'), - KVariable('###APPVALUE'), - KVariable('###ARGS'), - KVariable('###STATIC'), - ], - ), - KVariable('###CONTINUATION'), - ] - ) - - @property - def _sload_fork_pattern(self) -> KSequence: + def _fetch_storage_pattern(self) -> KSequence: return KSequence( [ KApply('FETCH_ACCOUNT_STORAGE', [KVariable('###ACCTID'), KVariable('###ACCTSLOT')]), @@ -207,40 +181,10 @@ def _sload_fork_pattern(self) -> KSequence: ) @property - def _balance_fork_pattern(self) -> KSequence: - return KSequence( - [ - KApply('FETCH_ACCOUNT_BALANCE', KVariable('###ACCTID')), - KVariable('###CONTINUATION'), - ] - ) - - @property - def _extcodesize_fork_pattern(self) -> KSequence: + def _fetch_account_pattern(self) -> KSequence: return KSequence( [ - KApply('FETCH_ACCOUNT_CODE_SIZE', KVariable('###ACCTID')), - KVariable('###CONTINUATION'), - ] - ) - - @property - def _extcodehash_fork_pattern(self) -> KSequence: - return KSequence( - [ - KApply('FETCH_ACCOUNT_CODE_HASH', KVariable('###ACCTID')), - KVariable('###CONTINUATION'), - ] - ) - - @property - def _extcodecopy_fork_pattern(self) -> KSequence: - return KSequence( - [ - KApply( - 'FETCH_ACCOUNT_CODE', - [KVariable('###ACCTID'), KVariable('###MEMSTART'), KVariable('###PGMSTART'), KVariable('###WIDTH')], - ), + KApply('FETCH_ACCOUNT', KVariable('###ACCTID')), KVariable('###CONTINUATION'), ] ) @@ -380,84 +324,23 @@ def _filter_constraints_by_simplification( new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'K_CELL', KSequence(subst['###CONTINUATION']))) return Step(CTerm(new_cterm.config, new_constraints), 1, (), ['cheatcode_forget'], cut=True) - def _exec_fork_call_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: - if self._provider is None: - raise ValueError('No web3 provider configured for fork execution.') - - target_address = subst['###ACCTCODE'] - if type(target_address) is not KToken: - raise TypeError('Expected target_address to be a KToken.') - - address_value = int(target_address.token) - if address_value in self._external_accounts: - raise ValueError(f'Account {address_value} already processed for fork.') - - # Read the account from the web3 provider - account_code, _, account = fetch_account_from_provider(provider=self._provider, target_address=target_address) - - # Update the ACCOUNTS_CELL by appending the new account. - accounts_cell = cterm.cell('ACCOUNTS_CELL') - all_accounts = flatten_label('_AccountCellMap_', accounts_cell) - all_accounts.append(account) - new_accounts_cell = KEVM.accounts(all_accounts) - - if account_code is KToken('b""', sort='Bytes'): - _LOGGER.warning(f'Account {target_address.token} has no code available. Continuing execution.') - return None - - # Build a new continuation, replacing the account code placeholder with the fetched code. - continuation = KSequence( - [ - KApply( - 'callwithcode_check_fork', - [ - subst['###ACCTFROM'], - subst['###ACCTTO'], - subst['###ACCTCODE'], - account_code, - subst['###VALUE'], - subst['###APPVALUE'], - subst['###ARGS'], - subst['###STATIC'], - ], - ), - subst['###CONTINUATION'], - ] - ) - - # Update the FORKEDACCOUNTS_CELL via a helper. - new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) - self._external_accounts.add(address_value) - - # Chain cell updates into a new configuration. - new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) - - _LOGGER.info(f'Successfully read account {address_value} from provider and added it to the state') - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['call.true'], cut=True) - - def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: - if self._provider is None: - raise ValueError('No web3 provider configured for fork execution.') + def _exec_fetch_storage_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: + provider = self.provider target_address = subst['###ACCTID'] target_slot = subst['###ACCTSLOT'] if not (type(target_address) is KToken and type(target_slot) is KToken): raise TypeError('Expected target_address and target_slot to be KToken instances.') - address_value = int(target_address.token) - accounts = flatten_label('_AccountCellMap_', cterm.cell('ACCOUNTS_CELL')) - new_account_list: list[KInner] = [] - - # Fetch the account from the web3 provider if it hasn't been processed yet. + new_accounts: list[KInner] = [] - if address_value not in self._external_accounts: - _, _, account_to_update = fetch_account_from_provider(self._provider, target_address) - new_account_list.extend(accounts) + # If the account is not in the state, fetch the account code and balance. + if not account_already_forked(target_address, cterm): + _, account_to_update = fetch_account_from_provider(provider, target_address) + new_accounts.extend(accounts) else: - # find target_address in cell map + # Find the account in , save the other accounts as new_accounts. account_to_update = None for acct_cell in accounts: if not type(acct_cell) is KApply: @@ -468,17 +351,15 @@ def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymb if acct_id_cell.args[0] == target_address: account_to_update = acct_cell else: - new_account_list.append(acct_cell) - + new_accounts.append(acct_cell) if account_to_update is None: raise ValueError(f'Account corresponding to {target_address} not found in ACCOUNTS_CELL.') - # Fetch the storage value at the given slot. - value = fetch_storage_value_from_provider(self._provider, target_address, target_slot) - new_account = add_to_account_storage(account_to_update, target_slot, value) - new_account_list.append(new_account) - - new_accounts_cell = KEVM.accounts(new_account_list) + # Fetch the storage value at the given slot and store it. + value = fetch_storage_value_from_provider(provider, target_address, target_slot) + updated_account = add_to_account_storage(account_to_update, target_slot, value) + new_accounts.append(updated_account) + new_accounts_cell = KEVM.accounts(new_accounts) # Build the new continuation. continuation = KSequence( @@ -488,30 +369,17 @@ def _exec_fork_sload_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymb ] ) - # Update the forked accounts cell if targed_address had to be fetched. - if address_value not in self._external_accounts: - new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) - self._external_accounts.add(address_value) - cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - - # Update the Accounts cell with the continuation - new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) - _LOGGER.info( - f'Successfully read storage slot {int(target_slot.token)} of address {address_value} from w3 provider and added it to the state' - ) + new_cterm = self._commit_changes_to_cterm(cterm, new_accounts_cell, continuation, target_address) return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_STORAGE'], cut=True) - def _exec_balance_fork_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: - if self._provider is None: - raise ValueError('No web3 provider configured for fork execution.') + def _exec_fetch_account_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSymbolic) -> KCFGExtendResult | None: + provider = self.provider target_address = subst['###ACCTID'] if not type(target_address) is KToken: raise TypeError('Expected target_address to be KToken instance.') - address_value = int(target_address.token) - _, account_balance, account = fetch_account_from_provider(self._provider, target_address) + _, account = fetch_account_from_provider(provider, target_address) # Update the ACCOUNTS_CELL by appending the new account. accounts_cell = cterm.cell('ACCOUNTS_CELL') @@ -522,161 +390,38 @@ def _exec_balance_fork_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermSy # Build the new continuation. continuation = KSequence( [ - account_balance, subst['###CONTINUATION'], ] ) - # Update the FORKEDACCOUNTS_CELL via a helper. - new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) - self._external_accounts.add(address_value) + new_cterm = self._commit_changes_to_cterm(cterm, new_accounts_cell, continuation, target_address) + return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT'], cut=True) - # Update the Accounts cell with the continuation - new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) + def _commit_changes_to_cterm( + self, cterm: CTerm, new_accounts_cell: KInner, continuation: KSequence, target_address: KToken + ) -> CTerm: + """Update the ACCOUNTS_CELL, FORKEDACCOUNTS_CELL and K_CELL of the CTerm to commit the data retrieved from + the web3 provider.""" - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_BALANCE'], cut=True) + new_forked_accounts_cell = self._update_forked_accounts_cell(cterm, target_address) + updated_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) + updated_cterm = CTerm.from_kast(set_cell(updated_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) + updated_cterm = CTerm.from_kast(set_cell(updated_cterm.kast, 'K_CELL', continuation)) + _LOGGER.info(f'Successfully read account {target_address.token} from provider and added it to the state.') - def _exec_extcodesize_fork_custom_step( - self, subst: Subst, cterm: CTerm, _c: CTermSymbolic - ) -> KCFGExtendResult | None: - if self._provider is None: - raise ValueError('No web3 provider configured for fork execution.') + return updated_cterm - target_address = subst['###ACCTID'] - if not type(target_address) is KToken: - raise TypeError('Expected target_address to be KToken instance.') - address_value = int(target_address.token) - - account_code, _, account = fetch_account_from_provider(self._provider, target_address) - - # Update the ACCOUNTS_CELL by appending the new account. - accounts_cell = cterm.cell('ACCOUNTS_CELL') - all_accounts = flatten_label('_AccountCellMap_', accounts_cell) - all_accounts.append(account) - new_accounts_cell = KEVM.accounts(all_accounts) - - # Build the new continuation. - continuation = KSequence( - [ - KEVM.size_bytes(account_code), - subst['###CONTINUATION'], - ] - ) - # Update the FORKEDACCOUNTS_CELL via a helper. - new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) - self._external_accounts.add(address_value) - - # Update the Accounts cell with the continuation - new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) - - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_CODE_SIZE'], cut=True) - - def _exec_extcodehash_fork_custom_step( - self, subst: Subst, cterm: CTerm, _c: CTermSymbolic - ) -> KCFGExtendResult | None: - if self._provider is None: - raise ValueError('No web3 provider configured for fork execution.') - - target_address = subst['###ACCTID'] - if not type(target_address) is KToken: - raise TypeError('Expected target_address to be KToken instance.') - address_value = int(target_address.token) - - account_code, _, account = fetch_account_from_provider(self._provider, target_address) - - # Update the ACCOUNTS_CELL by appending the new account. - accounts_cell = cterm.cell('ACCOUNTS_CELL') - all_accounts = flatten_label('_AccountCellMap_', accounts_cell) - all_accounts.append(account) - new_accounts_cell = KEVM.accounts(all_accounts) - - # Build the new continuation. - continuation = KSequence( - [ - KApply('keccak', account_code), - subst['###CONTINUATION'], - ] - ) - # Update the FORKEDACCOUNTS_CELL via a helper. - new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) - self._external_accounts.add(address_value) - - # Update the Accounts cell with the continuation - new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) - - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_CODE_HASH'], cut=True) - - def _exec_extcodecopy_fork_custom_step( - self, subst: Subst, cterm: CTerm, _c: CTermSymbolic - ) -> KCFGExtendResult | None: - if self._provider is None: - raise ValueError('No web3 provider configured for fork execution.') - - target_address = subst['###ACCTID'] - memstart = subst['###MEMSTART'] - pgmstart = subst['###PGMSTART'] - width = subst['###WIDTH'] - if not ( - type(target_address) is KToken - and type(memstart) is KToken - and type(pgmstart) is KToken - and type(width) is KToken - ): - raise TypeError('Expected target_address to be KToken instance.') - address_value = int(target_address.token) - - account_code, _, account = fetch_account_from_provider(self._provider, target_address) - - # Update the ACCOUNTS_CELL by appending the new account. - accounts_cell = cterm.cell('ACCOUNTS_CELL') - all_accounts = flatten_label('_AccountCellMap_', accounts_cell) - all_accounts.append(account) - new_accounts_cell = KEVM.accounts(all_accounts) - - # LM => LM [ MEMSTART := #range(PGM, PGMSTART, WIDTH) ] - local_mem = cterm.cell('LOCALMEM_CELL') - new_local_mem = KApply( - 'mapWriteRange', [local_mem, memstart, KApply('#range', [account_code, pgmstart, width])] - ) - cterm = CTerm.from_kast(set_cell(cterm.kast, 'LOCALMEM_CELL', new_local_mem)) - - # Build the new continuation. - continuation = KSequence( - [ - subst['###CONTINUATION'], - ] - ) - - # Update the FORKEDACCOUNTS_CELL via a helper. - new_forked_accounts_cell = self._update_forked_accounts(cterm, target_address) - self._external_accounts.add(address_value) - - # Update the Accounts cell with the continuation - new_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) - new_cterm = CTerm.from_kast(set_cell(new_cterm.kast, 'K_CELL', continuation)) - - return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT_CODE'], cut=True) - - def _update_forked_accounts(self, cterm: CTerm, target_address: KToken) -> KInner: - """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" - - forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') - account_set_item = KApply('SetItem', target_address) - if forked_accounts_cell == set_empty(): - forked_accounts: list[KInner] = [account_set_item] - else: - forked_accounts = flatten_label('_Set_', forked_accounts_cell) - if account_set_item not in forked_accounts: - forked_accounts.append(account_set_item) - return build_assoc(KApply('.Set'), '_Set_', forked_accounts) +def account_already_forked(target_address: KToken, cterm: CTerm) -> bool: + """Check if target_address is part of the FORKEDACCOUNTS_CELL of a CTerm.""" + forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') + if forked_accounts_cell == set_empty(): + return False + account_set_item = KApply('SetItem', target_address) + forked_accounts = flatten_label('_Set_', forked_accounts_cell) + if account_set_item in forked_accounts: + return True + return False def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) diff --git a/src/kontrol/kdist/foundry.md b/src/kontrol/kdist/foundry.md index b78e8bb82..e5998c154 100644 --- a/src/kontrol/kdist/foundry.md +++ b/src/kontrol/kdist/foundry.md @@ -57,46 +57,41 @@ module FOUNDRY rule #accountHasStorageSlot (_,_) => false [owise] -// Comment: Ideally, rules below would be available only when --fork-url is provided. -// For this I'm using the cell - syntax KItem ::= "FETCH_ACCOUNT_STORAGE" Int Int [symbol(FETCH_ACCOUNT_STORAGE) ] - | "FETCH_ACCOUNT_BALANCE" Int [symbol(FETCH_ACCOUNT_BALANCE) ] - | "FETCH_ACCOUNT_CODE_SIZE" Int [symbol(FETCH_ACCOUNT_CODE_SIZE)] - | "FETCH_ACCOUNT_CODE_HASH" Int [symbol(FETCH_ACCOUNT_CODE_HASH)] - | "FETCH_ACCOUNT_CODE" Int Int Int Int [symbol(FETCH_ACCOUNT_CODE)] - // ---------------------------------------------------------------------------------- - rule [sload.w3provider]: - SLOAD INDEX => FETCH_ACCOUNT_STORAGE ACCT INDEX ~> #push ... - ACCT - true - FA - requires notBool #accountInState(ACCT) - orBool (ACCT in FA andBool notBool #accountHasStorageSlot(ACCT, INDEX)) - [priority(30)] - - rule [balance.w3provider]: - BALANCE ACCT => #accessAccounts ACCT ~> FETCH_ACCOUNT_BALANCE ACCT ~> #push ... + syntax KItem ::= "FETCH_ACCOUNT" Int [symbol(FETCH_ACCOUNT) ] + | "FETCH_ACCOUNT_STORAGE" Int Int [symbol(FETCH_ACCOUNT_STORAGE)] + // -------------------------------------------------------------------------------- + rule [call.w3provider]: + (.K => FETCH_ACCOUNT ACCTCODE) + ~> #call _ACCTFROM _ACCTTO ACCTCODE _VALUE _APPVALUE _ARGS _STATIC + ... + true - requires notBool #accountInState(ACCT) - [priority(30)] + requires notBool #accountInState(ACCTCODE) + [priority(40)] - rule [extcodesize.w3provider]: - EXTCODESIZE ACCT => #accessAccounts ACCT ~> FETCH_ACCOUNT_CODE_SIZE ACCT ~> #push ... + rule [unstackop.w3provider]: + (.K => FETCH_ACCOUNT ACCT) ~> OPCODE:UnStackOp ACCT ... true requires notBool #accountInState(ACCT) - [priority(30)] + andBool ( OPCODE ==K BALANCE + orBool OPCODE ==K EXTCODESIZE + orBool OPCODE ==K EXTCODEHASH ) + [priority(40)] rule [extcodecopy.w3provider]: - EXTCODECOPY ACCT MEMSTART PGMSTART WIDTH => #accessAccounts ACCT ~> FETCH_ACCOUNT_CODE ACCT MEMSTART PGMSTART WIDTH ... + (.K => FETCH_ACCOUNT ACCT) ~> EXTCODECOPY ACCT _MEMSTART _PGMSTART _WIDTH ... true requires notBool #accountInState(ACCT) - [priority(30)] + [priority(40)] - rule [extcodehash.w3provider]: - EXTCODEHASH ACCT => #accessAccounts ACCT ~> FETCH_ACCOUNT_CODE_HASH ACCT ~> #push ... + rule [sload.w3provider]: + SLOAD INDEX => FETCH_ACCOUNT_STORAGE ACCT INDEX ~> #push ... + ACCT true + FA requires notBool #accountInState(ACCT) - [priority(30)] + orBool (ACCT in FA andBool notBool #accountHasStorageSlot(ACCT, INDEX)) + [priority(40)] endmodule ``` diff --git a/src/kontrol/web3_rpc.py b/src/kontrol/web3_rpc.py index f8ce659bd..11931bfc2 100644 --- a/src/kontrol/web3_rpc.py +++ b/src/kontrol/web3_rpc.py @@ -57,7 +57,7 @@ def get_block_metadata(provider: Web3) -> dict[str, int]: } -def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KToken, KApply]: +def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KApply]: """Fetch the account's code and balance from the provider, and return a tuple containing: - A KToken representing the account code. - A KApply account cell with the fetched data and empty storage. @@ -68,7 +68,6 @@ def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple return ( code_token, - balance_token, KEVM.account_cell( id=target_address, balance=balance_token, From 7d098eac18bd1e63b3a7fcb5dd35e9fef6aada89 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Fri, 7 Feb 2025 19:04:09 +0200 Subject: [PATCH 10/19] fix formatting --- src/kontrol/foundry.py | 26 +++++++++++++++++--------- src/kontrol/prove.py | 1 - 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index d08d68721..bf0c1fe7a 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -129,16 +129,8 @@ def cut_point_rules( break_on_storage: bool, break_on_basic_blocks: bool, break_on_load_program: bool, - break_on_access_opcode: bool | None = None, ) -> list[str]: - cut_point_rules = ['FOUNDRY-CHEAT-CODES.rename', 'FOUNDRY-ACCOUNTS.forget'] - if break_on_access_opcode: - cut_point_rules.extend( - [ - 'EVM.call.false', - ] - ) - return cut_point_rules + KEVMSemantics.cut_point_rules( + return ['FOUNDRY-CHEAT-CODES.rename', 'FOUNDRY-ACCOUNTS.forget'] + KEVMSemantics.cut_point_rules( break_on_jumpi, break_on_jump, break_on_calls, @@ -397,6 +389,20 @@ def _exec_fetch_account_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS new_cterm = self._commit_changes_to_cterm(cterm, new_accounts_cell, continuation, target_address) return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT'], cut=True) + def _update_forked_accounts_cell(self, cterm: CTerm, target_address: KToken) -> KInner: + """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" + + forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') + account_set_item = KApply('SetItem', target_address) + if forked_accounts_cell == set_empty(): + forked_accounts: list[KInner] = [account_set_item] + else: + forked_accounts = flatten_label('_Set_', forked_accounts_cell) + if account_set_item in forked_accounts: + return forked_accounts_cell + forked_accounts.append(account_set_item) + return build_assoc(KApply('.Set'), '_Set_', forked_accounts) + def _commit_changes_to_cterm( self, cterm: CTerm, new_accounts_cell: KInner, continuation: KSequence, target_address: KToken ) -> CTerm: @@ -411,6 +417,7 @@ def _commit_changes_to_cterm( return updated_cterm + def account_already_forked(target_address: KToken, cterm: CTerm) -> bool: """Check if target_address is part of the FORKEDACCOUNTS_CELL of a CTerm.""" @@ -423,6 +430,7 @@ def account_already_forked(target_address: KToken, cterm: CTerm) -> bool: return True return False + def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) acct_id_cell = account.args[0] diff --git a/src/kontrol/prove.py b/src/kontrol/prove.py index 74848e569..66bccd113 100644 --- a/src/kontrol/prove.py +++ b/src/kontrol/prove.py @@ -442,7 +442,6 @@ def create_kcfg_explore() -> KCFGExplore: options.break_on_storage, options.break_on_basic_blocks, options.break_on_load_program, - break_on_access_opcode=(not options.fork_url is None), ) if options.break_on_cheatcodes: cut_point_rules.extend( From cb269e2ab586dbcc20a42355ca96f4d64b47e955 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Fri, 7 Feb 2025 19:42:48 +0200 Subject: [PATCH 11/19] small tweaks --- src/kontrol/foundry.py | 48 ++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index bf0c1fe7a..9e38bcb47 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -328,7 +328,7 @@ def _exec_fetch_storage_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS new_accounts: list[KInner] = [] # If the account is not in the state, fetch the account code and balance. - if not account_already_forked(target_address, cterm): + if not self._account_already_forked(cterm, target_address): _, account_to_update = fetch_account_from_provider(provider, target_address) new_accounts.extend(accounts) else: @@ -349,7 +349,7 @@ def _exec_fetch_storage_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS # Fetch the storage value at the given slot and store it. value = fetch_storage_value_from_provider(provider, target_address, target_slot) - updated_account = add_to_account_storage(account_to_update, target_slot, value) + updated_account = add_storage_slot_to_account(account_to_update, target_slot, value) new_accounts.append(updated_account) new_accounts_cell = KEVM.accounts(new_accounts) @@ -389,27 +389,13 @@ def _exec_fetch_account_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS new_cterm = self._commit_changes_to_cterm(cterm, new_accounts_cell, continuation, target_address) return Step(CTerm(new_cterm.config, cterm.constraints), 1, (), ['FETCH_ACCOUNT'], cut=True) - def _update_forked_accounts_cell(self, cterm: CTerm, target_address: KToken) -> KInner: - """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" - - forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') - account_set_item = KApply('SetItem', target_address) - if forked_accounts_cell == set_empty(): - forked_accounts: list[KInner] = [account_set_item] - else: - forked_accounts = flatten_label('_Set_', forked_accounts_cell) - if account_set_item in forked_accounts: - return forked_accounts_cell - forked_accounts.append(account_set_item) - return build_assoc(KApply('.Set'), '_Set_', forked_accounts) - def _commit_changes_to_cterm( self, cterm: CTerm, new_accounts_cell: KInner, continuation: KSequence, target_address: KToken ) -> CTerm: """Update the ACCOUNTS_CELL, FORKEDACCOUNTS_CELL and K_CELL of the CTerm to commit the data retrieved from the web3 provider.""" - new_forked_accounts_cell = self._update_forked_accounts_cell(cterm, target_address) + new_forked_accounts_cell = update_forked_accounts_cell(cterm, target_address) updated_cterm = CTerm.from_kast(set_cell(cterm.kast, 'FORKEDACCOUNTS_CELL', new_forked_accounts_cell)) updated_cterm = CTerm.from_kast(set_cell(updated_cterm.kast, 'ACCOUNTS_CELL', new_accounts_cell)) updated_cterm = CTerm.from_kast(set_cell(updated_cterm.kast, 'K_CELL', continuation)) @@ -417,21 +403,29 @@ def _commit_changes_to_cterm( return updated_cterm + def _account_already_forked(self, cterm: CTerm, target_address: KToken) -> bool: + """Check if target_address is part of the FORKEDACCOUNTS_CELL of a CTerm.""" + return KApply('SetItem', target_address) in get_set_from_cterm(cterm, 'FORKEDACCOUNTS_CELL') -def account_already_forked(target_address: KToken, cterm: CTerm) -> bool: - """Check if target_address is part of the FORKEDACCOUNTS_CELL of a CTerm.""" - forked_accounts_cell = cterm.cell('FORKEDACCOUNTS_CELL') - if forked_accounts_cell == set_empty(): - return False +def update_forked_accounts_cell(cterm: CTerm, target_address: KToken) -> KInner: + """Update the FORKEDACCOUNTS_CELL by adding target_address if it is not already present.""" account_set_item = KApply('SetItem', target_address) - forked_accounts = flatten_label('_Set_', forked_accounts_cell) - if account_set_item in forked_accounts: - return True - return False + accounts = get_set_from_cterm(cterm, 'FORKEDACCOUNTS_CELL') + if account_set_item in accounts: + return cterm.cell('FORKEDACCOUNTS_CELL') + accounts.append(account_set_item) + return build_assoc(KApply('.Set'), '_Set_', accounts) + + +def get_set_from_cterm(cterm: CTerm, key: str) -> list[KInner]: + values = cterm.cell(key) + if values == set_empty(): + return [] + return flatten_label('_Set_', values) -def add_to_account_storage(account: KApply, slot: KToken, value: KToken) -> KApply: +def add_storage_slot_to_account(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) acct_id_cell = account.args[0] balance_cell = account.args[1] From ccc4d5a644cc40114d44b818f46385ee80334e8b Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 15 Feb 2025 17:28:19 +0200 Subject: [PATCH 12/19] update expected output --- ...ramsTest.testDealConcrete().trace.expected | 6 + .../AddConst.applyOp(uint256).cse.expected | 12 + .../AddrTest.test_addr_true().trace.expected | 6 + ...t_double_add(uint256,uint256).cse.expected | 30 ++ ...d_double_sub(uint256,uint256).cse.expected | 42 +++ ...rnal(uint256,uint256,uint256).cse.expected | 42 +++ ...Contract.add(uint256,uint256).cse.expected | 12 + ...rnal(uint256,uint256,uint256).cse.expected | 24 ++ ...sertTest.checkFail_assert_false().expected | 30 ++ ...AssertTest.testFail_assert_true().expected | 36 ++ ...sertTest.testFail_expect_revert().expected | 96 +++++ .../AssertTest.test_assert_false().expected | 36 ++ .../AssertTest.test_assert_true().expected | 30 ++ ...Test.test_failing_branch(uint256).expected | 60 +++ ...st_revert_branch(uint256,uint256).expected | 66 ++++ ...ail_assume_false(uint256,uint256).expected | 36 ++ ...Fail_assume_true(uint256,uint256).expected | 48 +++ ...est_assume_false(uint256,uint256).expected | 54 +++ .../show/BMCBoundTest.testBound().expected | 84 +++++ ...aramsTest.testWarp(uint256).trace.expected | 6 + ...st_add_const(uint256,uint256).cse.expected | 18 + ...est_identity(uint256,uint256).cse.expected | 18 + ...CallableStorageContract.str().cse.expected | 12 + ...allableStorageTest.test_str().cse.expected | 6 + .../show/ConstructorTest.init.cse.expected | 6 + ...ctorTest.test_contract_call().cse.expected | 6 + ...ctFieldTest.testEscrowToken().cse.expected | 6 + ...um.enum_argument_range(uint8).cse.expected | 6 + .../Enum.enum_storage_range().cse.expected | 12 + .../test-data/show/Enum.init.cse.expected | 6 + ...chTest.test_forgetBranch(uint256).expected | 30 ++ .../Identity.applyOp(uint256).cse.expected | 12 + .../Identity.identity(uint256).cse.expected | 6 + ...ImportedContract.add(uint256).cse.expected | 12 + .../ImportedContract.count().cse.expected | 6 + .../show/ImportedContract.init.cse.expected | 6 + ...ImportedContract.set(uint256).cse.expected | 12 + ...erfaceTagTest.testInterface().cse.expected | 6 + ...RandomVarTest.test_custom_names().expected | 90 +++++ ...etUpDeployTest.test_extcodesize().expected | 30 ++ ...aticCallContract.set(uint256).cse.expected | 6 + ...e.getEscrowTokenTotalSupply().cse.expected | 18 + .../test-data/show/gas-abstraction.expected | 24 ++ .../test-data/show/merge-loop-heads.expected | 48 +++ ...sertTest.testFail_expect_revert().expected | 12 + .../AssertTest.test_assert_false().expected | 12 + ...Test.test_failing_branch(uint256).expected | 24 ++ ...st_revert_branch(uint256,uint256).expected | 30 ++ ...ranch_merge(uint256,uint256,bool).expected | 24 ++ .../test-data/show/node-refutation.expected | 24 ++ .../test-data/show/split-node.expected | 342 ++++++++++++++++++ 51 files changed, 1626 insertions(+) diff --git a/src/tests/integration/test-data/show/AccountParamsTest.testDealConcrete().trace.expected b/src/tests/integration/test-data/show/AccountParamsTest.testDealConcrete().trace.expected index e294d8942..8a16267d1 100644 --- a/src/tests/integration/test-data/show/AccountParamsTest.testDealConcrete().trace.expected +++ b/src/tests/integration/test-data/show/AccountParamsTest.testDealConcrete().trace.expected @@ -220,6 +220,12 @@ module SUMMARY-TEST%ACCOUNTPARAMSTEST.TESTDEALCONCRETE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AddConst.applyOp(uint256).cse.expected b/src/tests/integration/test-data/show/AddConst.applyOp(uint256).cse.expected index 47b57f6fb..e50da0add 100644 --- a/src/tests/integration/test-data/show/AddConst.applyOp(uint256).cse.expected +++ b/src/tests/integration/test-data/show/AddConst.applyOp(uint256).cse.expected @@ -175,6 +175,12 @@ module SUMMARY-SRC%CSE%ADDCONST.APPLYOP(UINT256):0 ... + + .Set + + + false + true @@ -354,6 +360,12 @@ module SUMMARY-SRC%CSE%ADDCONST.APPLYOP(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AddrTest.test_addr_true().trace.expected b/src/tests/integration/test-data/show/AddrTest.test_addr_true().trace.expected index 86ee1bdf0..df89bcd9f 100644 --- a/src/tests/integration/test-data/show/AddrTest.test_addr_true().trace.expected +++ b/src/tests/integration/test-data/show/AddrTest.test_addr_true().trace.expected @@ -180,6 +180,12 @@ module SUMMARY-TEST%ADDRTEST.TEST-ADDR-TRUE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add(uint256,uint256).cse.expected b/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add(uint256,uint256).cse.expected index d91eb8d9e..fdef0196b 100644 --- a/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add(uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add(uint256,uint256).cse.expected @@ -412,6 +412,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -821,6 +827,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1212,6 +1224,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1605,6 +1623,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1999,6 +2023,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_double_sub(uint256,uint256).cse.expected b/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_double_sub(uint256,uint256).cse.expected index e848dce80..414ae8a67 100644 --- a/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_double_sub(uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_double_sub(uint256,uint256).cse.expected @@ -461,6 +461,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true @@ -870,6 +876,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true @@ -1261,6 +1273,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true @@ -1654,6 +1672,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true @@ -2048,6 +2072,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true @@ -2446,6 +2476,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true @@ -2846,6 +2882,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-DOUBLE-SUB(UINT256,UINT25 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_sub_external(uint256,uint256,uint256).cse.expected b/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_sub_external(uint256,uint256,uint256).cse.expected index 8c6b2142a..463528646 100644 --- a/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_sub_external(uint256,uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/ArithmeticCallTest.test_double_add_sub_external(uint256,uint256,uint256).cse.expected @@ -465,6 +465,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true @@ -858,6 +864,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true @@ -1270,6 +1282,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true @@ -1663,6 +1681,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true @@ -2061,6 +2085,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true @@ -2460,6 +2490,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true @@ -2860,6 +2896,12 @@ module SUMMARY-TEST%ARITHMETICCALLTEST.TEST-DOUBLE-ADD-SUB-EXTERNAL(UINT256,UINT ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ArithmeticContract.add(uint256,uint256).cse.expected b/src/tests/integration/test-data/show/ArithmeticContract.add(uint256,uint256).cse.expected index e3d2d76ba..284014844 100644 --- a/src/tests/integration/test-data/show/ArithmeticContract.add(uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/ArithmeticContract.add(uint256,uint256).cse.expected @@ -172,6 +172,12 @@ module SUMMARY-SRC%ARITHMETICCONTRACT.ADD(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -350,6 +356,12 @@ module SUMMARY-SRC%ARITHMETICCONTRACT.ADD(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ArithmeticContract.add_sub_external(uint256,uint256,uint256).cse.expected b/src/tests/integration/test-data/show/ArithmeticContract.add_sub_external(uint256,uint256,uint256).cse.expected index 37ea0b070..8ba94f8d5 100644 --- a/src/tests/integration/test-data/show/ArithmeticContract.add_sub_external(uint256,uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/ArithmeticContract.add_sub_external(uint256,uint256,uint256).cse.expected @@ -247,6 +247,12 @@ module SUMMARY-SRC%ARITHMETICCONTRACT.ADD-SUB-EXTERNAL(UINT256,UINT256,UINT256): ... + + .Set + + + false + true @@ -436,6 +442,12 @@ module SUMMARY-SRC%ARITHMETICCONTRACT.ADD-SUB-EXTERNAL(UINT256,UINT256,UINT256): ... + + .Set + + + false + true @@ -626,6 +638,12 @@ module SUMMARY-SRC%ARITHMETICCONTRACT.ADD-SUB-EXTERNAL(UINT256,UINT256,UINT256): ... + + .Set + + + false + true @@ -817,6 +835,12 @@ module SUMMARY-SRC%ARITHMETICCONTRACT.ADD-SUB-EXTERNAL(UINT256,UINT256,UINT256): ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.checkFail_assert_false().expected b/src/tests/integration/test-data/show/AssertTest.checkFail_assert_false().expected index 692177cb1..209f0946f 100644 --- a/src/tests/integration/test-data/show/AssertTest.checkFail_assert_false().expected +++ b/src/tests/integration/test-data/show/AssertTest.checkFail_assert_false().expected @@ -213,6 +213,12 @@ module SUMMARY-TEST%ASSERTTEST.CHECKFAIL-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -455,6 +461,12 @@ module SUMMARY-TEST%ASSERTTEST.CHECKFAIL-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -696,6 +708,12 @@ module SUMMARY-TEST%ASSERTTEST.CHECKFAIL-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -939,6 +957,12 @@ module SUMMARY-TEST%ASSERTTEST.CHECKFAIL-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -1182,6 +1206,12 @@ module SUMMARY-TEST%ASSERTTEST.CHECKFAIL-ASSERT-FALSE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.testFail_assert_true().expected b/src/tests/integration/test-data/show/AssertTest.testFail_assert_true().expected index c1e8c9594..f3dc9f8c7 100644 --- a/src/tests/integration/test-data/show/AssertTest.testFail_assert_true().expected +++ b/src/tests/integration/test-data/show/AssertTest.testFail_assert_true().expected @@ -213,6 +213,12 @@ Node 10: ... + + .Set + + + false + true @@ -459,6 +465,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -701,6 +713,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -942,6 +960,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -1185,6 +1209,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -1428,6 +1458,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-ASSERT-TRUE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.testFail_expect_revert().expected b/src/tests/integration/test-data/show/AssertTest.testFail_expect_revert().expected index b8992bd88..bc7777296 100644 --- a/src/tests/integration/test-data/show/AssertTest.testFail_expect_revert().expected +++ b/src/tests/integration/test-data/show/AssertTest.testFail_expect_revert().expected @@ -299,6 +299,12 @@ Node 20: ... + + .Set + + + false + true @@ -550,6 +556,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -792,6 +804,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -1033,6 +1051,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -1276,6 +1300,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -1522,6 +1552,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -1772,6 +1808,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -2119,6 +2161,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -2464,6 +2512,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -2810,6 +2864,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -3159,6 +3219,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -3508,6 +3574,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -3860,6 +3932,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -4212,6 +4290,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -4460,6 +4544,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true @@ -4708,6 +4798,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.test_assert_false().expected b/src/tests/integration/test-data/show/AssertTest.test_assert_false().expected index 02e640bf7..96f015d22 100644 --- a/src/tests/integration/test-data/show/AssertTest.test_assert_false().expected +++ b/src/tests/integration/test-data/show/AssertTest.test_assert_false().expected @@ -210,6 +210,12 @@ Node 10: ... + + .Set + + + false + true @@ -456,6 +462,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -698,6 +710,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -939,6 +957,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -1182,6 +1206,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-FALSE():0 ... + + .Set + + + false + true @@ -1425,6 +1455,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-FALSE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.test_assert_true().expected b/src/tests/integration/test-data/show/AssertTest.test_assert_true().expected index b84d0a7c6..2ed0161db 100644 --- a/src/tests/integration/test-data/show/AssertTest.test_assert_true().expected +++ b/src/tests/integration/test-data/show/AssertTest.test_assert_true().expected @@ -216,6 +216,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -458,6 +464,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -699,6 +711,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -942,6 +960,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-TRUE():0 ... + + .Set + + + false + true @@ -1185,6 +1209,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-TRUE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.test_failing_branch(uint256).expected b/src/tests/integration/test-data/show/AssertTest.test_failing_branch(uint256).expected index 3cd858d9a..f329b6c22 100644 --- a/src/tests/integration/test-data/show/AssertTest.test_failing_branch(uint256).expected +++ b/src/tests/integration/test-data/show/AssertTest.test_failing_branch(uint256).expected @@ -273,6 +273,12 @@ Node 16: ... + + .Set + + + false + true @@ -522,6 +528,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -764,6 +776,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -1008,6 +1026,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -1251,6 +1275,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -1495,6 +1525,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -1741,6 +1777,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -1987,6 +2029,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -2233,6 +2281,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -2479,6 +2533,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssertTest.test_revert_branch(uint256,uint256).expected b/src/tests/integration/test-data/show/AssertTest.test_revert_branch(uint256,uint256).expected index 125015839..6adb56643 100644 --- a/src/tests/integration/test-data/show/AssertTest.test_revert_branch(uint256,uint256).expected +++ b/src/tests/integration/test-data/show/AssertTest.test_revert_branch(uint256,uint256).expected @@ -271,6 +271,12 @@ Node 16: ... + + .Set + + + false + true @@ -522,6 +528,12 @@ Node 15: ... + + .Set + + + false + true @@ -773,6 +785,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1015,6 +1033,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1261,6 +1285,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1506,6 +1536,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1752,6 +1788,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -2000,6 +2042,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -2248,6 +2296,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -2496,6 +2550,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -2744,6 +2804,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssumeTest.testFail_assume_false(uint256,uint256).expected b/src/tests/integration/test-data/show/AssumeTest.testFail_assume_false(uint256,uint256).expected index bfd587e66..044db4b61 100644 --- a/src/tests/integration/test-data/show/AssumeTest.testFail_assume_false(uint256,uint256).expected +++ b/src/tests/integration/test-data/show/AssumeTest.testFail_assume_false(uint256,uint256).expected @@ -211,6 +211,12 @@ Node 7: ... + + .Set + + + false + true @@ -460,6 +466,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -708,6 +720,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -957,6 +975,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1206,6 +1230,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1453,6 +1483,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssumeTest.testFail_assume_true(uint256,uint256).expected b/src/tests/integration/test-data/show/AssumeTest.testFail_assume_true(uint256,uint256).expected index a632a7ae1..39b9c911b 100644 --- a/src/tests/integration/test-data/show/AssumeTest.testFail_assume_true(uint256,uint256).expected +++ b/src/tests/integration/test-data/show/AssumeTest.testFail_assume_true(uint256,uint256).expected @@ -237,6 +237,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -485,6 +491,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -733,6 +745,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -979,6 +997,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1228,6 +1252,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1478,6 +1508,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1727,6 +1763,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1976,6 +2018,12 @@ module SUMMARY-TEST%ASSUMETEST.TESTFAIL-ASSUME-TRUE(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/AssumeTest.test_assume_false(uint256,uint256).expected b/src/tests/integration/test-data/show/AssumeTest.test_assume_false(uint256,uint256).expected index 55b810848..24ed49b71 100644 --- a/src/tests/integration/test-data/show/AssumeTest.test_assume_false(uint256,uint256).expected +++ b/src/tests/integration/test-data/show/AssumeTest.test_assume_false(uint256,uint256).expected @@ -235,6 +235,12 @@ Node 10: ... + + .Set + + + false + true @@ -486,6 +492,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -734,6 +746,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -982,6 +1000,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1228,6 +1252,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1477,6 +1507,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1727,6 +1763,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1976,6 +2018,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -2225,6 +2273,12 @@ module SUMMARY-TEST%ASSUMETEST.TEST-ASSUME-FALSE(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/BMCBoundTest.testBound().expected b/src/tests/integration/test-data/show/BMCBoundTest.testBound().expected index abff58716..3af06bc39 100644 --- a/src/tests/integration/test-data/show/BMCBoundTest.testBound().expected +++ b/src/tests/integration/test-data/show/BMCBoundTest.testBound().expected @@ -383,6 +383,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -630,6 +636,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -877,6 +889,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -1125,6 +1143,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -1374,6 +1398,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -1621,6 +1651,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -1869,6 +1905,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -2114,6 +2156,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -2360,6 +2408,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -2607,6 +2661,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -2855,6 +2915,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -3099,6 +3165,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -3344,6 +3416,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true @@ -3590,6 +3668,12 @@ module SUMMARY-TEST%BMCBOUNDTEST.TESTBOUND():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/BlockParamsTest.testWarp(uint256).trace.expected b/src/tests/integration/test-data/show/BlockParamsTest.testWarp(uint256).trace.expected index cade6532c..6ee73593c 100644 --- a/src/tests/integration/test-data/show/BlockParamsTest.testWarp(uint256).trace.expected +++ b/src/tests/integration/test-data/show/BlockParamsTest.testWarp(uint256).trace.expected @@ -180,6 +180,12 @@ module SUMMARY-TEST%BLOCKPARAMSTEST.TESTWARP(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/CSETest.test_add_const(uint256,uint256).cse.expected b/src/tests/integration/test-data/show/CSETest.test_add_const(uint256,uint256).cse.expected index d4ce2bb25..de623ba85 100644 --- a/src/tests/integration/test-data/show/CSETest.test_add_const(uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/CSETest.test_add_const(uint256,uint256).cse.expected @@ -291,6 +291,12 @@ module SUMMARY-TEST%CSETEST.TEST-ADD-CONST(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -606,6 +612,12 @@ module SUMMARY-TEST%CSETEST.TEST-ADD-CONST(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -942,6 +954,12 @@ module SUMMARY-TEST%CSETEST.TEST-ADD-CONST(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/CSETest.test_identity(uint256,uint256).cse.expected b/src/tests/integration/test-data/show/CSETest.test_identity(uint256,uint256).cse.expected index 585839bf6..0ae86227d 100644 --- a/src/tests/integration/test-data/show/CSETest.test_identity(uint256,uint256).cse.expected +++ b/src/tests/integration/test-data/show/CSETest.test_identity(uint256,uint256).cse.expected @@ -287,6 +287,12 @@ module SUMMARY-TEST%CSETEST.TEST-IDENTITY(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -602,6 +608,12 @@ module SUMMARY-TEST%CSETEST.TEST-IDENTITY(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -936,6 +948,12 @@ module SUMMARY-TEST%CSETEST.TEST-IDENTITY(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/CallableStorageContract.str().cse.expected b/src/tests/integration/test-data/show/CallableStorageContract.str().cse.expected index f20ab0f43..0babde35f 100644 --- a/src/tests/integration/test-data/show/CallableStorageContract.str().cse.expected +++ b/src/tests/integration/test-data/show/CallableStorageContract.str().cse.expected @@ -178,6 +178,12 @@ module SUMMARY-TEST%CALLABLESTORAGECONTRACT.STR():0 ... + + .Set + + + false + true @@ -360,6 +366,12 @@ module SUMMARY-TEST%CALLABLESTORAGECONTRACT.STR():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/CallableStorageTest.test_str().cse.expected b/src/tests/integration/test-data/show/CallableStorageTest.test_str().cse.expected index 1739edbe5..bc3cee622 100644 --- a/src/tests/integration/test-data/show/CallableStorageTest.test_str().cse.expected +++ b/src/tests/integration/test-data/show/CallableStorageTest.test_str().cse.expected @@ -221,6 +221,12 @@ module SUMMARY-TEST%CALLABLESTORAGETEST.TEST-STR():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ConstructorTest.init.cse.expected b/src/tests/integration/test-data/show/ConstructorTest.init.cse.expected index 8ede6917e..d03aa1188 100644 --- a/src/tests/integration/test-data/show/ConstructorTest.init.cse.expected +++ b/src/tests/integration/test-data/show/ConstructorTest.init.cse.expected @@ -221,6 +221,12 @@ module SUMMARY-TEST%CONSTRUCTORTEST.INIT:0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ConstructorTest.test_contract_call().cse.expected b/src/tests/integration/test-data/show/ConstructorTest.test_contract_call().cse.expected index a3dab6987..00710b393 100644 --- a/src/tests/integration/test-data/show/ConstructorTest.test_contract_call().cse.expected +++ b/src/tests/integration/test-data/show/ConstructorTest.test_contract_call().cse.expected @@ -246,6 +246,12 @@ module SUMMARY-TEST%CONSTRUCTORTEST.TEST-CONTRACT-CALL():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ContractFieldTest.testEscrowToken().cse.expected b/src/tests/integration/test-data/show/ContractFieldTest.testEscrowToken().cse.expected index 8edd43a3e..6172a821e 100644 --- a/src/tests/integration/test-data/show/ContractFieldTest.testEscrowToken().cse.expected +++ b/src/tests/integration/test-data/show/ContractFieldTest.testEscrowToken().cse.expected @@ -246,6 +246,12 @@ module SUMMARY-TEST%CONTRACTFIELDTEST.TESTESCROWTOKEN():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/Enum.enum_argument_range(uint8).cse.expected b/src/tests/integration/test-data/show/Enum.enum_argument_range(uint8).cse.expected index f47525a7e..76cb4563b 100644 --- a/src/tests/integration/test-data/show/Enum.enum_argument_range(uint8).cse.expected +++ b/src/tests/integration/test-data/show/Enum.enum_argument_range(uint8).cse.expected @@ -151,6 +151,12 @@ module SUMMARY-TEST%ENUM.ENUM-ARGUMENT-RANGE(UINT8):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/Enum.enum_storage_range().cse.expected b/src/tests/integration/test-data/show/Enum.enum_storage_range().cse.expected index 0a5565f89..b4b6a5476 100644 --- a/src/tests/integration/test-data/show/Enum.enum_storage_range().cse.expected +++ b/src/tests/integration/test-data/show/Enum.enum_storage_range().cse.expected @@ -210,6 +210,12 @@ module SUMMARY-TEST%ENUM.ENUM-STORAGE-RANGE():0 ... + + .Set + + + false + true @@ -423,6 +429,12 @@ module SUMMARY-TEST%ENUM.ENUM-STORAGE-RANGE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/Enum.init.cse.expected b/src/tests/integration/test-data/show/Enum.init.cse.expected index ca8a34226..bd1850868 100644 --- a/src/tests/integration/test-data/show/Enum.init.cse.expected +++ b/src/tests/integration/test-data/show/Enum.init.cse.expected @@ -126,6 +126,12 @@ module SUMMARY-TEST%ENUM.INIT:0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ForgetBranchTest.test_forgetBranch(uint256).expected b/src/tests/integration/test-data/show/ForgetBranchTest.test_forgetBranch(uint256).expected index 155c43bdc..e5ba8cd56 100644 --- a/src/tests/integration/test-data/show/ForgetBranchTest.test_forgetBranch(uint256).expected +++ b/src/tests/integration/test-data/show/ForgetBranchTest.test_forgetBranch(uint256).expected @@ -249,6 +249,12 @@ module SUMMARY-TEST%FORGETBRANCHTEST.TEST-FORGETBRANCH(UINT256):0 ... + + .Set + + + false + false @@ -494,6 +500,12 @@ module SUMMARY-TEST%FORGETBRANCHTEST.TEST-FORGETBRANCH(UINT256):0 ... + + .Set + + + false + false @@ -739,6 +751,12 @@ module SUMMARY-TEST%FORGETBRANCHTEST.TEST-FORGETBRANCH(UINT256):0 ... + + .Set + + + false + false @@ -985,6 +1003,12 @@ module SUMMARY-TEST%FORGETBRANCHTEST.TEST-FORGETBRANCH(UINT256):0 ... + + .Set + + + false + false @@ -1232,6 +1256,12 @@ module SUMMARY-TEST%FORGETBRANCHTEST.TEST-FORGETBRANCH(UINT256):0 ... + + .Set + + + false + false diff --git a/src/tests/integration/test-data/show/Identity.applyOp(uint256).cse.expected b/src/tests/integration/test-data/show/Identity.applyOp(uint256).cse.expected index 0df5fd4d6..7808d7ca1 100644 --- a/src/tests/integration/test-data/show/Identity.applyOp(uint256).cse.expected +++ b/src/tests/integration/test-data/show/Identity.applyOp(uint256).cse.expected @@ -181,6 +181,12 @@ module SUMMARY-SRC%CSE%IDENTITY.APPLYOP(UINT256):0 ... + + .Set + + + false + true @@ -363,6 +369,12 @@ module SUMMARY-SRC%CSE%IDENTITY.APPLYOP(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/Identity.identity(uint256).cse.expected b/src/tests/integration/test-data/show/Identity.identity(uint256).cse.expected index 90df0a73c..891d0a54b 100644 --- a/src/tests/integration/test-data/show/Identity.identity(uint256).cse.expected +++ b/src/tests/integration/test-data/show/Identity.identity(uint256).cse.expected @@ -127,6 +127,12 @@ module SUMMARY-SRC%CSE%IDENTITY.IDENTITY(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ImportedContract.add(uint256).cse.expected b/src/tests/integration/test-data/show/ImportedContract.add(uint256).cse.expected index 5b823eab8..d6c8bdbfc 100644 --- a/src/tests/integration/test-data/show/ImportedContract.add(uint256).cse.expected +++ b/src/tests/integration/test-data/show/ImportedContract.add(uint256).cse.expected @@ -178,6 +178,12 @@ module SUMMARY-TEST%IMPORTEDCONTRACT.ADD(UINT256):0 ... + + .Set + + + false + true @@ -362,6 +368,12 @@ module SUMMARY-TEST%IMPORTEDCONTRACT.ADD(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ImportedContract.count().cse.expected b/src/tests/integration/test-data/show/ImportedContract.count().cse.expected index 5ab5f8ba7..771380771 100644 --- a/src/tests/integration/test-data/show/ImportedContract.count().cse.expected +++ b/src/tests/integration/test-data/show/ImportedContract.count().cse.expected @@ -130,6 +130,12 @@ module SUMMARY-TEST%IMPORTEDCONTRACT.COUNT():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ImportedContract.init.cse.expected b/src/tests/integration/test-data/show/ImportedContract.init.cse.expected index ad37a5b66..ce6b68dc8 100644 --- a/src/tests/integration/test-data/show/ImportedContract.init.cse.expected +++ b/src/tests/integration/test-data/show/ImportedContract.init.cse.expected @@ -131,6 +131,12 @@ module SUMMARY-TEST%IMPORTEDCONTRACT.INIT:0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/ImportedContract.set(uint256).cse.expected b/src/tests/integration/test-data/show/ImportedContract.set(uint256).cse.expected index 1384adf69..a0f75006f 100644 --- a/src/tests/integration/test-data/show/ImportedContract.set(uint256).cse.expected +++ b/src/tests/integration/test-data/show/ImportedContract.set(uint256).cse.expected @@ -178,6 +178,12 @@ module SUMMARY-TEST%IMPORTEDCONTRACT.SET(UINT256):0 ... + + .Set + + + false + true @@ -360,6 +366,12 @@ module SUMMARY-TEST%IMPORTEDCONTRACT.SET(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/InterfaceTagTest.testInterface().cse.expected b/src/tests/integration/test-data/show/InterfaceTagTest.testInterface().cse.expected index fdef4cb8a..b8b93bdd9 100644 --- a/src/tests/integration/test-data/show/InterfaceTagTest.testInterface().cse.expected +++ b/src/tests/integration/test-data/show/InterfaceTagTest.testInterface().cse.expected @@ -245,6 +245,12 @@ module SUMMARY-TEST%INTERFACETAGTEST.TESTINTERFACE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/RandomVarTest.test_custom_names().expected b/src/tests/integration/test-data/show/RandomVarTest.test_custom_names().expected index ae77193e6..dc83fe10b 100644 --- a/src/tests/integration/test-data/show/RandomVarTest.test_custom_names().expected +++ b/src/tests/integration/test-data/show/RandomVarTest.test_custom_names().expected @@ -307,6 +307,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -552,6 +558,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -799,6 +811,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -1046,6 +1064,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -1294,6 +1318,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -1543,6 +1573,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -1790,6 +1826,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -2039,6 +2081,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -2290,6 +2338,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -2587,6 +2641,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -2858,6 +2918,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -3130,6 +3196,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -3402,6 +3474,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -3675,6 +3753,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false @@ -3949,6 +4033,12 @@ module SUMMARY-TEST%RANDOMVARTEST.TEST-CUSTOM-NAMES():0 ... + + .Set + + + false + false diff --git a/src/tests/integration/test-data/show/SetUpDeployTest.test_extcodesize().expected b/src/tests/integration/test-data/show/SetUpDeployTest.test_extcodesize().expected index 58cdd380b..e2bd64f68 100644 --- a/src/tests/integration/test-data/show/SetUpDeployTest.test_extcodesize().expected +++ b/src/tests/integration/test-data/show/SetUpDeployTest.test_extcodesize().expected @@ -257,6 +257,12 @@ module SUMMARY-TEST%SETUPDEPLOYTEST.TEST-EXTCODESIZE():0 ... + + .Set + + + false + true @@ -520,6 +526,12 @@ module SUMMARY-TEST%SETUPDEPLOYTEST.TEST-EXTCODESIZE():0 ... + + .Set + + + false + true @@ -782,6 +794,12 @@ module SUMMARY-TEST%SETUPDEPLOYTEST.TEST-EXTCODESIZE():0 ... + + .Set + + + false + true @@ -1046,6 +1064,12 @@ module SUMMARY-TEST%SETUPDEPLOYTEST.TEST-EXTCODESIZE():0 ... + + .Set + + + false + true @@ -1310,6 +1334,12 @@ module SUMMARY-TEST%SETUPDEPLOYTEST.TEST-EXTCODESIZE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/StaticCallContract.set(uint256).cse.expected b/src/tests/integration/test-data/show/StaticCallContract.set(uint256).cse.expected index 3c9bc316c..912e9fd84 100644 --- a/src/tests/integration/test-data/show/StaticCallContract.set(uint256).cse.expected +++ b/src/tests/integration/test-data/show/StaticCallContract.set(uint256).cse.expected @@ -133,6 +133,12 @@ module SUMMARY-TEST%STATICCALLCONTRACT.SET(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/TGovernance.getEscrowTokenTotalSupply().cse.expected b/src/tests/integration/test-data/show/TGovernance.getEscrowTokenTotalSupply().cse.expected index 68f7502c2..8b0b7bd08 100644 --- a/src/tests/integration/test-data/show/TGovernance.getEscrowTokenTotalSupply().cse.expected +++ b/src/tests/integration/test-data/show/TGovernance.getEscrowTokenTotalSupply().cse.expected @@ -280,6 +280,12 @@ module SUMMARY-TEST%TGOVERNANCE.GETESCROWTOKENTOTALSUPPLY():0 ... + + .Set + + + false + true @@ -530,6 +536,12 @@ module SUMMARY-TEST%TGOVERNANCE.GETESCROWTOKENTOTALSUPPLY():0 ... + + .Set + + + false + true @@ -778,6 +790,12 @@ module SUMMARY-TEST%TGOVERNANCE.GETESCROWTOKENTOTALSUPPLY():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/gas-abstraction.expected b/src/tests/integration/test-data/show/gas-abstraction.expected index 27840799e..792027d42 100644 --- a/src/tests/integration/test-data/show/gas-abstraction.expected +++ b/src/tests/integration/test-data/show/gas-abstraction.expected @@ -290,6 +290,12 @@ Node 6: + + .Set + + + false + true @@ -570,6 +576,12 @@ module SUMMARY-TEST%GASTEST.TESTINFINITEGAS():0 ... + + .Set + + + false + true @@ -808,6 +820,12 @@ module SUMMARY-TEST%GASTEST.TESTINFINITEGAS():0 ... + + .Set + + + false + true @@ -1046,6 +1064,12 @@ module SUMMARY-TEST%GASTEST.TESTINFINITEGAS():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/merge-loop-heads.expected b/src/tests/integration/test-data/show/merge-loop-heads.expected index 4af6dbda2..2e1c5fba6 100644 --- a/src/tests/integration/test-data/show/merge-loop-heads.expected +++ b/src/tests/integration/test-data/show/merge-loop-heads.expected @@ -353,6 +353,12 @@ Node 21: ... + + .Set + + + false + true @@ -605,6 +611,12 @@ Node 22: ... + + .Set + + + false + true @@ -857,6 +869,12 @@ Node 23: ... + + .Set + + + false + true @@ -1106,6 +1124,12 @@ module SUMMARY-TEST%BMCLOOPSTEST.TEST-BMC(UINT256):0 ... + + .Set + + + false + true @@ -1349,6 +1373,12 @@ module SUMMARY-TEST%BMCLOOPSTEST.TEST-BMC(UINT256):0 ... + + .Set + + + false + true @@ -1593,6 +1623,12 @@ module SUMMARY-TEST%BMCLOOPSTEST.TEST-BMC(UINT256):0 ... + + .Set + + + false + true @@ -1838,6 +1874,12 @@ module SUMMARY-TEST%BMCLOOPSTEST.TEST-BMC(UINT256):0 ... + + .Set + + + false + true @@ -2085,6 +2127,12 @@ module SUMMARY-TEST%BMCLOOPSTEST.TEST-BMC(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/minimized/AssertTest.testFail_expect_revert().expected b/src/tests/integration/test-data/show/minimized/AssertTest.testFail_expect_revert().expected index bed1dffc4..0fc45b8c4 100644 --- a/src/tests/integration/test-data/show/minimized/AssertTest.testFail_expect_revert().expected +++ b/src/tests/integration/test-data/show/minimized/AssertTest.testFail_expect_revert().expected @@ -177,6 +177,12 @@ Node 20: ... + + .Set + + + false + true @@ -428,6 +434,12 @@ module SUMMARY-TEST%ASSERTTEST.TESTFAIL-EXPECT-REVERT():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/minimized/AssertTest.test_assert_false().expected b/src/tests/integration/test-data/show/minimized/AssertTest.test_assert_false().expected index bce650c4a..9affb168c 100644 --- a/src/tests/integration/test-data/show/minimized/AssertTest.test_assert_false().expected +++ b/src/tests/integration/test-data/show/minimized/AssertTest.test_assert_false().expected @@ -176,6 +176,12 @@ Node 10: ... + + .Set + + + false + true @@ -422,6 +428,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-ASSERT-FALSE():0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/minimized/AssertTest.test_failing_branch(uint256).expected b/src/tests/integration/test-data/show/minimized/AssertTest.test_failing_branch(uint256).expected index 34757ac56..7f4032447 100644 --- a/src/tests/integration/test-data/show/minimized/AssertTest.test_failing_branch(uint256).expected +++ b/src/tests/integration/test-data/show/minimized/AssertTest.test_failing_branch(uint256).expected @@ -221,6 +221,12 @@ Node 16: ... + + .Set + + + false + true @@ -469,6 +475,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -716,6 +728,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true @@ -962,6 +980,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-FAILING-BRANCH(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/minimized/AssertTest.test_revert_branch(uint256,uint256).expected b/src/tests/integration/test-data/show/minimized/AssertTest.test_revert_branch(uint256,uint256).expected index 65d3baf3b..a6d67416d 100644 --- a/src/tests/integration/test-data/show/minimized/AssertTest.test_revert_branch(uint256,uint256).expected +++ b/src/tests/integration/test-data/show/minimized/AssertTest.test_revert_branch(uint256,uint256).expected @@ -219,6 +219,12 @@ Node 16: ... + + .Set + + + false + true @@ -470,6 +476,12 @@ Node 15: ... + + .Set + + + false + true @@ -720,6 +732,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -969,6 +987,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true @@ -1217,6 +1241,12 @@ module SUMMARY-TEST%ASSERTTEST.TEST-REVERT-BRANCH(UINT256,UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/minimized/MergeKCFGTest.test_branch_merge(uint256,uint256,bool).expected b/src/tests/integration/test-data/show/minimized/MergeKCFGTest.test_branch_merge(uint256,uint256,bool).expected index 7bc19343e..b45d43a70 100644 --- a/src/tests/integration/test-data/show/minimized/MergeKCFGTest.test_branch_merge(uint256,uint256,bool).expected +++ b/src/tests/integration/test-data/show/minimized/MergeKCFGTest.test_branch_merge(uint256,uint256,bool).expected @@ -423,6 +423,12 @@ module SUMMARY-TEST%MERGEKCFGTEST.TEST-BRANCH-MERGE(UINT256,UINT256,BOOL):0 ... + + .Set + + + false + true @@ -816,6 +822,12 @@ module SUMMARY-TEST%MERGEKCFGTEST.TEST-BRANCH-MERGE(UINT256,UINT256,BOOL):0 ... + + .Set + + + false + true @@ -1208,6 +1220,12 @@ module SUMMARY-TEST%MERGEKCFGTEST.TEST-BRANCH-MERGE(UINT256,UINT256,BOOL):0 ... + + .Set + + + false + true @@ -1601,6 +1619,12 @@ module SUMMARY-TEST%MERGEKCFGTEST.TEST-BRANCH-MERGE(UINT256,UINT256,BOOL):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/node-refutation.expected b/src/tests/integration/test-data/show/node-refutation.expected index b3eef77cf..c0ddda252 100644 --- a/src/tests/integration/test-data/show/node-refutation.expected +++ b/src/tests/integration/test-data/show/node-refutation.expected @@ -231,6 +231,12 @@ module SUMMARY-TEST%MERGETEST.TEST-BRANCH-MERGE(UINT256):0 ... + + .Set + + + false + true @@ -475,6 +481,12 @@ module SUMMARY-TEST%MERGETEST.TEST-BRANCH-MERGE(UINT256):0 ... + + .Set + + + false + true @@ -722,6 +734,12 @@ module SUMMARY-TEST%MERGETEST.TEST-BRANCH-MERGE(UINT256):0 ... + + .Set + + + false + true @@ -969,6 +987,12 @@ module SUMMARY-TEST%MERGETEST.TEST-BRANCH-MERGE(UINT256):0 ... + + .Set + + + false + true diff --git a/src/tests/integration/test-data/show/split-node.expected b/src/tests/integration/test-data/show/split-node.expected index 2d28bc313..e5b7fbb53 100644 --- a/src/tests/integration/test-data/show/split-node.expected +++ b/src/tests/integration/test-data/show/split-node.expected @@ -847,6 +847,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -1110,6 +1116,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -1375,6 +1387,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -1641,6 +1659,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -1909,6 +1933,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -2178,6 +2208,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -2461,6 +2497,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -2744,6 +2786,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -3069,6 +3117,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -3355,6 +3409,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -3638,6 +3698,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -3921,6 +3987,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -4225,6 +4297,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -4629,6 +4707,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -5030,6 +5114,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -5431,6 +5521,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -5874,6 +5970,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -6276,6 +6378,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -6675,6 +6783,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -7074,6 +7188,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -7515,6 +7635,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -7918,6 +8044,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -8318,6 +8450,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -8718,6 +8856,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -9160,6 +9304,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -9566,6 +9716,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -9969,6 +10125,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -10372,6 +10534,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -10817,6 +10985,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -11223,6 +11397,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -11626,6 +11806,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -12029,6 +12215,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -12474,6 +12666,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -12883,6 +13081,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -13289,6 +13493,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -13695,6 +13905,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -14143,6 +14359,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -14552,6 +14774,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -14958,6 +15186,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -15364,6 +15598,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -15812,6 +16052,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -16101,6 +16347,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -16386,6 +16638,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -16671,6 +16929,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -16977,6 +17241,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -17267,6 +17537,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -17553,6 +17829,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -17839,6 +18121,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -18146,6 +18434,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -18432,6 +18726,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -18714,6 +19014,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -18996,6 +19302,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -19299,6 +19611,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -19585,6 +19903,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -19867,6 +20191,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -20149,6 +20479,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true @@ -20452,6 +20788,12 @@ module SUMMARY-TEST%PRANKTEST.TESTSYMBOLICSTARTPRANK(ADDRESS):0 ... + + .Set + + + false + true From 581b517d74c100c66e1e508d76970fbb9cb8e9b9 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 15 Feb 2025 18:26:36 +0200 Subject: [PATCH 13/19] add fork_block_number cli arg --- src/kontrol/cli.py | 8 ++++++++ src/kontrol/foundry.py | 15 ++++++++++++--- src/kontrol/options.py | 2 ++ src/kontrol/prove.py | 2 +- src/kontrol/web3_rpc.py | 28 +++++++++++++++------------- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/kontrol/cli.py b/src/kontrol/cli.py index 7f64e3493..619fa99fc 100644 --- a/src/kontrol/cli.py +++ b/src/kontrol/cli.py @@ -598,6 +598,14 @@ def parse(s: str) -> list[T]: help=('Fetch state over a remote endpoint instead of starting from an abstract state'), ) + prove_args.add_argument( + '--fork-block-number', + type=int, + dest='fork_block_number', + default=None, + help=('Fetch state from a specific block number over a remote endpoint.'), + ) + show_args = command_parser.add_parser( 'show', help='Print the CFG for a given proof.', diff --git a/src/kontrol/foundry.py b/src/kontrol/foundry.py index 9e38bcb47..36c250926 100644 --- a/src/kontrol/foundry.py +++ b/src/kontrol/foundry.py @@ -326,10 +326,11 @@ def _exec_fetch_storage_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS accounts = flatten_label('_AccountCellMap_', cterm.cell('ACCOUNTS_CELL')) new_accounts: list[KInner] = [] + block_number = get_token_int(cterm, 'NUMBER_CELL') # If the account is not in the state, fetch the account code and balance. if not self._account_already_forked(cterm, target_address): - _, account_to_update = fetch_account_from_provider(provider, target_address) + _, account_to_update = fetch_account_from_provider(provider, target_address, block_number) new_accounts.extend(accounts) else: # Find the account in , save the other accounts as new_accounts. @@ -348,7 +349,7 @@ def _exec_fetch_storage_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS raise ValueError(f'Account corresponding to {target_address} not found in ACCOUNTS_CELL.') # Fetch the storage value at the given slot and store it. - value = fetch_storage_value_from_provider(provider, target_address, target_slot) + value = fetch_storage_value_from_provider(provider, target_address, target_slot, block_number) updated_account = add_storage_slot_to_account(account_to_update, target_slot, value) new_accounts.append(updated_account) new_accounts_cell = KEVM.accounts(new_accounts) @@ -371,7 +372,9 @@ def _exec_fetch_account_custom_step(self, subst: Subst, cterm: CTerm, _c: CTermS if not type(target_address) is KToken: raise TypeError('Expected target_address to be KToken instance.') - _, account = fetch_account_from_provider(provider, target_address) + block_number = get_token_int(cterm, 'NUMBER_CELL') + + _, account = fetch_account_from_provider(provider, target_address, block_number) # Update the ACCOUNTS_CELL by appending the new account. accounts_cell = cterm.cell('ACCOUNTS_CELL') @@ -425,6 +428,12 @@ def get_set_from_cterm(cterm: CTerm, key: str) -> list[KInner]: return flatten_label('_Set_', values) +def get_token_int(cterm: CTerm, key: str) -> int: + cell = cterm.cell(key) + assert type(cell) is KToken + return int(cell.token) + + def add_storage_slot_to_account(account: KApply, slot: KToken, value: KToken) -> KApply: new_map_item = KApply('_|->_', [slot, value]) acct_id_cell = account.args[0] diff --git a/src/kontrol/options.py b/src/kontrol/options.py index deb3c9939..4e1ff65ba 100644 --- a/src/kontrol/options.py +++ b/src/kontrol/options.py @@ -393,6 +393,7 @@ class ProveOptions( stack_checks: bool extra_module: str | None fork_url: str | None + fork_block_number: int | None def __init__(self, args: dict[str, Any]) -> None: super().__init__(args) @@ -425,6 +426,7 @@ def default() -> dict[str, Any]: 'stack_checks': True, 'extra_module': None, 'fork_url': None, + 'fork_block_number': None, } @staticmethod diff --git a/src/kontrol/prove.py b/src/kontrol/prove.py index 66bccd113..61c4a5b7c 100644 --- a/src/kontrol/prove.py +++ b/src/kontrol/prove.py @@ -403,7 +403,7 @@ def create_kcfg_explore() -> KCFGExplore: block_metadata = None if options.fork_url: provider = Web3Providers.get_provider(options.fork_url) - block_metadata = get_block_metadata(provider) + block_metadata = get_block_metadata(provider, options.fork_block_number) proof = method_to_apr_proof( test=test, diff --git a/src/kontrol/web3_rpc.py b/src/kontrol/web3_rpc.py index 11931bfc2..e3fcd776d 100644 --- a/src/kontrol/web3_rpc.py +++ b/src/kontrol/web3_rpc.py @@ -40,10 +40,10 @@ def get_checksum_address(address_token: KToken) -> ChecksumAddress: return Web3.to_checksum_address(hex_address) -def get_block_metadata(provider: Web3) -> dict[str, int]: - block_number = provider.eth.block_number +def get_block_metadata(provider: Web3, fork_block_number: int | None) -> dict[str, int]: + block_number = fork_block_number if fork_block_number is not None else provider.eth.block_number + _LOGGER.info(f'Reading block data from Web3 provider for block number {block_number}') block_metadata = provider.eth.get_block(block_number) - # TODO: fetch rest of the block header return { 'block_number': block_number, @@ -57,14 +57,14 @@ def get_block_metadata(provider: Web3) -> dict[str, int]: } -def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple[KToken, KApply]: - """Fetch the account's code and balance from the provider, and return a tuple containing: +def fetch_account_from_provider(provider: Web3, target_address: KToken, block_number: int) -> tuple[KToken, KApply]: + """Fetch the account's code and balance from the provider at a given block number, and return a tuple containing: - A KToken representing the account code. - A KApply account cell with the fetched data and empty storage. """ - code_token = fetch_code_from_provider(provider, target_address) - balance_token = fetch_balance_from_provider(provider, target_address) + code_token = fetch_code_from_provider(provider, target_address, block_number) + balance_token = fetch_balance_from_provider(provider, target_address, block_number) return ( code_token, @@ -80,7 +80,9 @@ def fetch_account_from_provider(provider: Web3, target_address: KToken) -> tuple ) -def fetch_storage_value_from_provider(provider: Web3, target_address: KToken, target_slot: KToken) -> KToken: +def fetch_storage_value_from_provider( + provider: Web3, target_address: KToken, target_slot: KToken, block_number: int +) -> KToken: """Fetch the value stored at a specific slot for a given account address from the provider, and return it as a KToken. """ @@ -89,7 +91,7 @@ def fetch_storage_value_from_provider(provider: Web3, target_address: KToken, ta _LOGGER.info(f'Reading storage slot {slot} from {checksum_addr}') try: - storage_bytes = provider.eth.get_storage_at(checksum_addr, slot) + storage_bytes = provider.eth.get_storage_at(account=checksum_addr, position=slot, block_identifier=block_number) except Exception as e: _LOGGER.error(f'Error fetching storage at slot {slot} for {checksum_addr}: {e}') raise @@ -98,28 +100,28 @@ def fetch_storage_value_from_provider(provider: Web3, target_address: KToken, ta return token(value) -def fetch_code_from_provider(provider: Web3, target_address: KToken) -> KToken: +def fetch_code_from_provider(provider: Web3, target_address: KToken, block_number: int) -> KToken: """Fetch the code of a given account address from the provider and return it as a KToken.""" checksum_addr = Web3Providers.get_checksum_address(target_address) _LOGGER.info(f'Reading code for {checksum_addr}') try: - code_bytes = provider.eth.get_code(checksum_addr) + code_bytes = provider.eth.get_code(account=checksum_addr, block_identifier=block_number) except Exception as e: _LOGGER.error(f'Error fetching code for {checksum_addr}: {e}') raise return token(bytes(code_bytes)) -def fetch_balance_from_provider(provider: Web3, target_address: KToken) -> KToken: +def fetch_balance_from_provider(provider: Web3, target_address: KToken, block_number: int) -> KToken: """Fetch the balance of a given account address from the provider and return it as a KToken.""" checksum_addr = Web3Providers.get_checksum_address(target_address) _LOGGER.info(f'Reading balance for {checksum_addr}') try: - balance = provider.eth.get_balance(checksum_addr) + balance = provider.eth.get_balance(account=checksum_addr, block_identifier=block_number) except Exception as e: _LOGGER.error(f'Error fetching balance for {checksum_addr}: {e}') raise From 02b0ebb82370d922ce59cfa402e04ef7dbf4bcd1 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 15 Feb 2025 18:27:10 +0200 Subject: [PATCH 14/19] update test-harness --- .github/workflows/test-pr.yml | 2 + .../test-data/end-to-end-prove-all | 5 + .../test-data/end-to-end-prove-forked | 5 + .../test-data/end-to-end-prove-show | 1 + .../ProviderUnitTest.testDeposit().expected | 3973 +++++++++++++++++ .../test-data/src/ProviderUnit.t.sol | 71 + src/tests/integration/test_kontrol.py | 42 +- 7 files changed, 4086 insertions(+), 13 deletions(-) create mode 100644 src/tests/integration/test-data/end-to-end-prove-forked create mode 100644 src/tests/integration/test-data/show/ProviderUnitTest.testDeposit().expected create mode 100644 src/tests/integration/test-data/src/ProviderUnit.t.sol diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index 87217aec7..a2d17e157 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -148,6 +148,8 @@ jobs: docker exec -u github-user kontrol-ci-integration-${GITHUB_SHA} /bin/bash -c 'poetry install' docker exec -u github-user kontrol-ci-integration-${GITHUB_SHA} /bin/bash -c 'CXX=clang++-14 poetry run kdist --verbose build -j`nproc` evm-semantics.haskell kontrol.foundry' - name: 'Run end-to-end tests' + env: + WEB3_PROVIDER_KEY: ${{ secrets.NODE_OPTIMISM_MAIN_HTTPS }} run: | TEST_ARGS='--numprocesses=6 -vv --force-sequential -k "test_kontrol_end_to_end"' docker exec --user github-user kontrol-ci-integration-${GITHUB_SHA} make cov-integration TEST_ARGS="${TEST_ARGS}" diff --git a/src/tests/integration/test-data/end-to-end-prove-all b/src/tests/integration/test-data/end-to-end-prove-all index 76cb04fcd..43afd4a09 100644 --- a/src/tests/integration/test-data/end-to-end-prove-all +++ b/src/tests/integration/test-data/end-to-end-prove-all @@ -2,6 +2,11 @@ AllowChangesTest.testAllowCalls(uint256) AllowChangesTest.testFailAllowCalls_ifNotWhitelisted(uint256) CounterTest.test_Increment() ForgetBranchTest.test_forgetBranch(uint256) +ProviderUnitTest.testBalance() +ProviderUnitTest.testDeposit() +ProviderUnitTest.testExtCodeCopy() +ProviderUnitTest.testExtCodeHash() +ProviderUnitTest.testExtCodeSize() RandomVarTest.test_custom_names() RandomVarTest.test_randomAddress() RandomVarTest.test_randomBool() diff --git a/src/tests/integration/test-data/end-to-end-prove-forked b/src/tests/integration/test-data/end-to-end-prove-forked new file mode 100644 index 000000000..cef385bbf --- /dev/null +++ b/src/tests/integration/test-data/end-to-end-prove-forked @@ -0,0 +1,5 @@ +ProviderUnitTest.testBalance() +ProviderUnitTest.testDeposit() +ProviderUnitTest.testExtCodeCopy() +ProviderUnitTest.testExtCodeHash() +ProviderUnitTest.testExtCodeSize() diff --git a/src/tests/integration/test-data/end-to-end-prove-show b/src/tests/integration/test-data/end-to-end-prove-show index 067333b96..4821ededa 100644 --- a/src/tests/integration/test-data/end-to-end-prove-show +++ b/src/tests/integration/test-data/end-to-end-prove-show @@ -1,2 +1,3 @@ ForgetBranchTest.test_forgetBranch(uint256) +ProviderUnitTest.testDeposit() RandomVarTest.test_custom_names() diff --git a/src/tests/integration/test-data/show/ProviderUnitTest.testDeposit().expected b/src/tests/integration/test-data/show/ProviderUnitTest.testDeposit().expected new file mode 100644 index 000000000..414bf6332 --- /dev/null +++ b/src/tests/integration/test-data/show/ProviderUnitTest.testDeposit().expected @@ -0,0 +1,3973 @@ + +┌─ 1 (root, init) +│ k: #execute ~> CONTINUATION:K +│ pc: 0 +│ callDepth: 0 +│ statusCode: STATUSCODE:StatusCode +│ src: test/ProviderUnit.t.sol:12:70 +│ method: test%ProviderUnitTest.setUp() +│ +│ (236 steps) +├─ 3 (terminal) +│ k: #halt ~> CONTINUATION:K +│ pc: 339 +│ callDepth: 0 +│ statusCode: EVMC_SUCCESS +│ src: test/ProviderUnit.t.sol:42:49 +│ method: test%ProviderUnitTest.setUp() +│ +│ (1 step) +├─ 4 +│ k: #execute ~> CONTINUATION:K +│ pc: 0 +│ callDepth: 0 +│ statusCode: STATUSCODE:StatusCode +│ src: test/ProviderUnit.t.sol:12:70 +│ method: test%ProviderUnitTest.testDeposit() +│ +│ (378 steps) +├─ 6 +│ k: FETCH_ACCOUNT 103357696640705820808527172172828496799009669636 ~> #call 72881556 ... +│ pc: 1663 +│ callDepth: 0 +│ statusCode: STATUSCODE:StatusCode +│ src: test/ProviderUnit.t.sol:22:22 +│ method: test%ProviderUnitTest.testDeposit() +│ +│ (1 step) +├─ 7 +│ k: #call 728815563385977040452943777879061427756277306518 1033576966407058208085271 ... +│ pc: 1663 +│ callDepth: 0 +│ statusCode: STATUSCODE:StatusCode +│ src: test/ProviderUnit.t.sol:22:22 +│ method: test%ProviderUnitTest.testDeposit() +│ +│ (374 steps) +├─ 8 +│ k: FETCH_ACCOUNT_STORAGE 103357696640705820808527172172828496799009669636 134071993 ... +│ pc: 3042 +│ callDepth: 1 +│ statusCode: STATUSCODE:StatusCode +│ +│ (1 step) +├─ 9 +│ k: 0 ~> #push ~> #pc [ SLOAD ] ~> #execute ~> #return 128 32 ~> #pc [ STATICCALL ] ... +│ pc: 3042 +│ callDepth: 1 +│ statusCode: STATUSCODE:StatusCode +│ +│ (89 steps) +├─ 10 +│ k: #halt ~> #return 128 32 ~> #pc [ STATICCALL ] ~> #execute ~> CONTINUATION:K +│ pc: 786 +│ callDepth: 1 +│ statusCode: EVMC_SUCCESS +│ +│ (1000 steps) +├─ 11 +│ k: JUMPDEST ~> #pc [ JUMPDEST ] ~> #execute ~> CONTINUATION:K +│ pc: 2045 +│ callDepth: 0 +│ statusCode: EVMC_SUCCESS +│ src: test/ProviderUnit.t.sol:27:27 +│ method: test%ProviderUnitTest.testDeposit() +│ +│ (508 steps) +├─ 12 +│ k: #halt ~> #return 192 0 ~> #pc [ CALL ] ~> #execute ~> CONTINUATION:K +│ pc: 1041 +│ callDepth: 1 +│ statusCode: EVMC_SUCCESS +│ +│ (677 steps) +├─ 13 +│ k: #halt ~> #return 192 32 ~> #pc [ STATICCALL ] ~> #execute ~> CONTINUATION:K +│ pc: 786 +│ callDepth: 1 +│ statusCode: EVMC_SUCCESS +│ +│ (303 steps) +├─ 14 (terminal) +│ k: #halt ~> CONTINUATION:K +│ pc: 297 +│ callDepth: 0 +│ statusCode: EVMC_SUCCESS +│ src: test/ProviderUnit.t.sol:42:49 +│ method: test%ProviderUnitTest.testDeposit() +│ +┊ constraint: true +┊ subst: ... +└─ 5 (leaf, target, terminal) + k: #halt ~> CONTINUATION:K + pc: PC_CELL_5d410f2a:Int + callDepth: CALLDEPTH_CELL_5d410f2a:Int + statusCode: STATUSCODE_FINAL:StatusCode + + + + +module SUMMARY-TEST%PROVIDERUNITTEST.TESTDEPOSIT():0 + + + rule [BASIC-BLOCK-1-TO-3]: + + + ( #execute => #halt ) + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + ( _STATUSCODE:StatusCode => EVMC_SUCCESS ) + + + .List + + + .List + + + .Set + + + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\n\x92T\xe4" + + + 0 + + + ( .WordStack => ( selector ( "setUp()" ) : .WordStack ) ) + + + ( b"" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80" ) + + + 0 + + + 0 + + + false + + + 0 + + ... + + + + .List + + + 0 + + + .Set + + + .Map + + + .Set + + ... + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( .Map => ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) ) + + + .Map + + + .Map + + + 1 + + ... + ) + + ... + + + ... + + + .Set + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int =/=Int 645326474426547203313410069153905908525362434349 + andBool ( ORIGIN_ID:Int =/=Int 645326474426547203313410069153905908525362434349 + andBool ( _C_PROVIDERUNITTEST_ID:Int =/=Int 645326474426547203313410069153905908525362434349 + andBool ( CALLER_ID:Int + + + ( #halt => #execute ) + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + ( EVMC_SUCCESS => ?_STATUSCODE:StatusCode ) + + + .List + + + .List + + + .Set + + + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + ( b"\n\x92T\xe4" => b"\x7f\x92LN" ) + + + 0 + + + ( ( selector ( "setUp()" ) : .WordStack ) => .WordStack ) + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80" => b"" ) + + + 0 + + + 0 + + + false + + + 0 + + ... + + + + .List + + + 0 + + + .Set + + + .Map + + + .Set + + ... + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) + + ... + + + ... + + + .Set + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + ( .K => FETCH_ACCOUNT 103357696640705820808527172172828496799009669636 + ~> #call 728815563385977040452943777879061427756277306518 103357696640705820808527172172828496799009669636 103357696640705820808527172172828496799009669636 0 0 b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" true + ~> #return 128 32 + ~> #pc [ STATICCALL ] ) + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + .List + + + .List + + + .Set + + + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( .WordStack => ( 164 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) ) + + + ( b"" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" ) + + + 0 + + + 0 + + + false + + + 0 + + ... + + + + .List + + + 0 + + + ( .Set => SetItem ( 103357696640705820808527172172828496799009669636 ) ) + + + .Map + + + .Set + + ... + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) + + ... + + + ... + + + .Set + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int =/=Int 645326474426547203313410069153905908525362434349 + andBool ( ORIGIN_ID:Int =/=Int 645326474426547203313410069153905908525362434349 + andBool ( CALLER_ID:Int + + + ( FETCH_ACCOUNT 103357696640705820808527172172828496799009669636 ~> .K => .K ) + ~> #call 728815563385977040452943777879061427756277306518 103357696640705820808527172172828496799009669636 103357696640705820808527172172828496799009669636 0 0 b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" true + ~> #return 128 32 + ~> #pc [ STATICCALL ] + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + .List + + + .List + + + .Set + + + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 164 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + 0 + + + false + + + 0 + + ... + + + + .List + + + 0 + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + .Map + + + .Set + + ... + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + ( 645326474426547203313410069153905908525362434349 => 103357696640705820808527172172828496799009669636 ) + + + ( 0 => 108013846086269695372 ) + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + ( + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + => ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) ) + + ... + + + ... + + + ( .Set => SetItem ( 103357696640705820808527172172828496799009669636 ) ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + ( #call 728815563385977040452943777879061427756277306518 103357696640705820808527172172828496799009669636 103357696640705820808527172172828496799009669636 0 0 b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" true ~> .K => FETCH_ACCOUNT_STORAGE 103357696640705820808527172172828496799009669636 13407199363679635973052879518465057167389910613330280238043615909335847287356 + ~> #push + ~> #pc [ SLOAD ] + ~> #execute ) + ~> #return 128 32 + ~> #pc [ STATICCALL ] + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + ( .List => ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 164 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + 0 + + + false + + + 0 + + ... + ) ) + + + ( .List => ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + .Map + + + .Set + + } ) ) + + + ( .Set => ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + + ( 728815563385977040452943777879061427756277306518 => 103357696640705820808527172172828496799009669636 ) + + + ( CALLER_ID:Int => 728815563385977040452943777879061427756277306518 ) + + + ( b"\x7f\x92LN" => b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" ) + + + 0 + + + ( ( 164 => 765 ) : ( selector ( "balanceOf(address)" ) : ( ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) => .WordStack ) ) ) + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80" ) + + + 0 + + + 0 + + + ( false => true ) + + + ( 0 => 1 ) + + ... + + + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) => ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + ( FETCH_ACCOUNT_STORAGE 103357696640705820808527172172828496799009669636 13407199363679635973052879518465057167389910613330280238043615909335847287356 => 0 ) + ~> #push + ~> #pc [ SLOAD ] + ~> #execute + ~> #return 128 32 + ~> #pc [ STATICCALL ] + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 164 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + 0 + + + false + + + 0 + + ... + ) + + + ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + .Map + + + .Set + + } ) + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + + 103357696640705820808527172172828496799009669636 + + + 728815563385977040452943777879061427756277306518 + + + b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + ( 765 : ( selector ( "balanceOf(address)" ) : .WordStack ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80" + + + 0 + + + 0 + + + true + + + 1 + + ... + + + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + ( .Map => ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) ) + + + ( .Map => ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + ( 0 + ~> #push + ~> #pc [ SLOAD ] + ~> #execute => #halt ~> .K ) + ~> #return 128 32 + ~> #pc [ STATICCALL ] + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + ( b"" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ) + + + ( _STATUSCODE:StatusCode => EVMC_SUCCESS ) + + + ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 164 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + 0 + + + false + + + 0 + + ... + ) + + + ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + .Map + + + .Set + + } ) + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + + 103357696640705820808527172172828496799009669636 + + + 728815563385977040452943777879061427756277306518 + + + b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + ( 765 : ( selector ( "balanceOf(address)" ) : .WordStack ) ) + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ) + + + 0 + + + 0 + + + true + + + 1 + + ... + + + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + ( #halt + ~> #return 128 32 + ~> #pc [ STATICCALL ] => JUMPDEST + ~> #pc [ JUMPDEST ] ) + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" => b"" ) + + + EVMC_SUCCESS + + + ( ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 164 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" + + + 0 + + + 0 + + + false + + + 0 + + ... + ) => .List ) + + + ( ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + .Map + + + .Set + + } ) => .List ) + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + + ( 103357696640705820808527172172828496799009669636 => 728815563385977040452943777879061427756277306518 ) + + + ( 728815563385977040452943777879061427756277306518 => CALLER_ID:Int ) + + + ( b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" => b"\x7f\x92LN" ) + + + 0 + + + ( ( 765 => 0 ) : ( ( selector ( "balanceOf(address)" ) => 103357696640705820808527172172828496799009669636 ) : ( .WordStack => ( ??WORD:Int : ( 192 : ( 4 : ( 192 : ( 0 : ( 196 : ( ??WORD:Int : ( selector ( "deposit()" ) : ( 103357696640705820808527172172828496799009669636 : ( ??WORD:Int : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +Bytes #buf ( 32 , ??WORD:Int ) +Bytes b"\xd0\xe3\r\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+>\x14\x96" +Bytes #buf ( 32 , ??WORD:Int ) ) + + + 0 + + + 0 + + + ( true => false ) + + + ( 1 => 0 ) + + ... + + + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 728815563385977040452943777879061427756277306518 ) => ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + ( 0 => ??WORD:Int ) + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + ( JUMPDEST + ~> #pc [ JUMPDEST ] => #halt + ~> #return 192 0 + ~> #pc [ CALL ] ) + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + b"" + + + EVMC_SUCCESS + + + ( .List => ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 196 : ( ?WORD:Int : ( selector ( "deposit()" ) : ( 103357696640705820808527172172828496799009669636 : ( ?WORD:Int : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +Bytes #buf ( 32 , ?WORD:Int ) +Bytes b"\xd0\xe3\r\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+>\x14\x96" +Bytes #buf ( 32 , ?WORD:Int ) + + + 0 + + + 0 + + + false + + + 0 + + ... + ) ) + + + ( .List => ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + 108013846086269695372 + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + ?WORD:Int + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + .List + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + } ) ) + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + + ( 728815563385977040452943777879061427756277306518 => 103357696640705820808527172172828496799009669636 ) + + + ( CALLER_ID:Int => 728815563385977040452943777879061427756277306518 ) + + + ( b"\x7f\x92LN" => b"\xd0\xe3\r\xb0" ) + + + ( 0 => ?WORD:Int ) + + + ( ( 0 => selector ( "deposit()" ) ) : ( ( 103357696640705820808527172172828496799009669636 : ( ?WORD:Int : ( 192 : ( 4 : ( 192 : ( 0 : ( 196 : ( ?WORD:Int : ( selector ( "deposit()" ) : ( 103357696640705820808527172172828496799009669636 : ( ?WORD:Int : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) ) ) ) ) ) ) ) ) => .WordStack ) ) + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ) +Bytes ( #buf ( 32 , ?WORD:Int ) +Bytes b"\xd0\xe3\r\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+>\x14\x96" +Bytes #buf ( 32 , ?WORD:Int ) => #buf ( 32 , ?WORD:Int ) ) + + + 0 + + + 0 + + + false + + + ( 0 => 1 ) + + ... + + + + SELFDESTRUCT_CELL:Set + + + ( .List => ListItem ( { 103357696640705820808527172172828496799009669636 | ListItem ( 102222681472383059465863322013072701928378550215632170212813623808969952268444 ) ListItem ( 728815563385977040452943777879061427756277306518 ) | #buf ( 32 , ?WORD:Int ) } ) ) + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + ( 108013846086269695372 => chop ( ( ?WORD:Int +Int 108013846086269695372 ) ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> ( 0 => ?WORD:Int ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + ( ?WORD:Int => 0 ) + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int ?WORD:Int + andBool ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + #halt + ~> ( #return 192 0 + ~> #pc [ CALL ] => #return 192 32 + ~> #pc [ STATICCALL ] ) + ~> #execute + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + ( b"" => #buf ( 32 , ?WORD:Int ) ) + + + EVMC_SUCCESS + + + ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( ( 196 => 228 ) : ( ( ?WORD:Int => selector ( "balanceOf(address)" ) ) : ( ( selector ( "deposit()" ) => 103357696640705820808527172172828496799009669636 ) : ( ( 103357696640705820808527172172828496799009669636 => 0 ) : ( ?WORD:Int : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +Bytes #buf ( 32 , ?WORD:Int ) +Bytes ( b"\xd0\xe3\r\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+>\x14\x96" => b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" ) +Bytes #buf ( 32 , ?WORD:Int ) + + + 0 + + + 0 + + + false + + + 0 + + ... + ) + + + ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + ( 108013846086269695372 => chop ( ( ?WORD:Int +Int 108013846086269695372 ) ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> ( 0 => ?WORD:Int ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + ( ?WORD:Int => 0 ) + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + ( .List => ListItem ( { 103357696640705820808527172172828496799009669636 | ListItem ( 102222681472383059465863322013072701928378550215632170212813623808969952268444 ) ListItem ( 728815563385977040452943777879061427756277306518 ) | #buf ( 32 , ?WORD:Int ) } ) ) + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + } ) + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + + 103357696640705820808527172172828496799009669636 + + + 728815563385977040452943777879061427756277306518 + + + ( b"\xd0\xe3\r\xb0" => b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" ) + + + ( ?WORD:Int => 0 ) + + + ( ( selector ( "deposit()" ) => 765 ) : ( .WordStack => ( selector ( "balanceOf(address)" ) : .WordStack ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +Bytes #buf ( 32 , ?WORD:Int ) + + + 0 + + + 0 + + + ( false => true ) + + + 1 + + ... + + + + SELFDESTRUCT_CELL:Set + + + ListItem ( { 103357696640705820808527172172828496799009669636 | ListItem ( 102222681472383059465863322013072701928378550215632170212813623808969952268444 ) ListItem ( 728815563385977040452943777879061427756277306518 ) | #buf ( 32 , ?WORD:Int ) } ) + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + chop ( ( ?WORD:Int +Int 108013846086269695372 ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> ?WORD:Int ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int ?WORD:Int + andBool ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int + + + #halt + ~> ( #return 192 32 + ~> #pc [ STATICCALL ] + ~> #execute => .K ) + ~> _CONTINUATION:K + + + NORMAL + + + CANCUN + + + false + + + + + ( #buf ( 32 , ?WORD:Int ) => b"" ) + + + EVMC_SUCCESS + + + ( ListItem ( + + 728815563385977040452943777879061427756277306518 + + + CALLER_ID:Int + + + b"\x7f\x92LN" + + + 0 + + + ( 228 : ( selector ( "balanceOf(address)" ) : ( 103357696640705820808527172172828496799009669636 : ( 0 : ( ?WORD:Int : ( 0 : ( 296 : ( selector ( "testDeposit()" ) : .WordStack ) ) ) ) ) ) ) ) + + + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +Bytes #buf ( 32 , ?WORD:Int ) +Bytes b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" +Bytes #buf ( 32 , ?WORD:Int ) + + + 0 + + + 0 + + + false + + + 0 + + ... + ) => .List ) + + + ( ListItem ( { + ( + + 103357696640705820808527172172828496799009669636 + + + chop ( ( ?WORD:Int +Int 108013846086269695372 ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> ?WORD:Int ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + | + + SELFDESTRUCT_CELL:Set + + + ListItem ( { 103357696640705820808527172172828496799009669636 | ListItem ( 102222681472383059465863322013072701928378550215632170212813623808969952268444 ) ListItem ( 728815563385977040452943777879061427756277306518 ) | #buf ( 32 , ?WORD:Int ) } ) + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + } ) => .List ) + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) + + + + ( 103357696640705820808527172172828496799009669636 => 728815563385977040452943777879061427756277306518 ) + + + ( 728815563385977040452943777879061427756277306518 => CALLER_ID:Int ) + + + ( b"p\xa0\x821\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96" => b"\x7f\x92LN" ) + + + 0 + + + ( ( 765 => selector ( "testDeposit()" ) ) : ( ( selector ( "balanceOf(address)" ) : .WordStack ) => .WordStack ) ) + + + ( b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xa98[\xe1\x02\xac>\xac)t\x83\xddb3\xd6+>\x14\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" => b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ) +Bytes ( #buf ( 32 , ?WORD:Int ) => #buf ( 32 , ?WORD:Int ) +Bytes #buf ( 32 , ?WORD:Int ) +Bytes b"+>\x14\x96" +Bytes #buf ( 32 , ?WORD:Int ) ) + + + 0 + + + 0 + + + ( true => false ) + + + ( 1 => 0 ) + + ... + + + + SELFDESTRUCT_CELL:Set + + + ListItem ( { 103357696640705820808527172172828496799009669636 | ListItem ( 102222681472383059465863322013072701928378550215632170212813623808969952268444 ) ListItem ( 728815563385977040452943777879061427756277306518 ) | #buf ( 32 , ?WORD:Int ) } ) + + + 0 + + + ( SetItem ( 103357696640705820808527172172828496799009669636 ) ( SetItem ( 645326474426547203313410069153905908525362434349 ) SetItem ( 728815563385977040452943777879061427756277306518 ) ) ) + + + .Map + + + .Set + + + + 0 + + + ORIGIN_ID:Int + + + + 376793390874373408599387495934666716005045108753 + + + 131674109 + + + 60000000 + + + 1738946995 + + + 585 + + ... + + ... + + + + 10 + + + ( + + 103357696640705820808527172172828496799009669636 + + + chop ( ( ?WORD:Int +Int 108013846086269695372 ) ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> ?WORD:Int ) + + + ( 13407199363679635973052879518465057167389910613330280238043615909335847287356 |-> 0 ) + + + .Map + + + 0 + + ... + + ( + + 645326474426547203313410069153905908525362434349 + + + 0 + + + .Map + + + .Map + + + .Map + + + 0 + + ... + + + + 728815563385977040452943777879061427756277306518 + + + 0 + + + ( maxUInt5 |-> 26459570340020690126982956076244095180546475426816 ) + + + .Map + + + .Map + + + 1 + + ... + ) ) + + ... + + + ... + + + SetItem ( 103357696640705820808527172172828496799009669636 ) + + + true + + + false + + + + + false + + + false + + ... + + + + false + + ... + + + + false + + ... + + + + false + + + false + + ... + + + + false + + + .List + + + false + + + .List + + + + .MockCallCellMap + + + .MockFunctionCellMap + + + + + false + + + false + + + false + + + false + + + false + + + .List + + + + requires ( 0 <=Int ?WORD:Int + andBool ( 0 <=Int CALLER_ID:Int + andBool ( 0 <=Int ORIGIN_ID:Int + andBool ( CALLER_ID:Int =0.8.13; + +import {Test, console} from "forge-std/Test.sol"; + +// Simple ERC20 interface +interface IWETH { + function balanceOf(address account) external view returns (uint256); + function deposit() external payable; +} + +contract ProviderUnitTest is Test { + IWETH public weth; + + function setUp() public { + // WETH address on OP Mainnet + weth = IWETH(0x121ab82b49B2BC4c7901CA46B8277962b4350204); + } + + function testDeposit() public { + + uint balBefore = weth.balanceOf(address(this)); + assert(balBefore == 0); + + uint amount = vm.randomUint(); + vm.deal(address(this), amount); + weth.deposit{value: amount}(); + + uint balAfter = weth.balanceOf(address(this)); + assert(balAfter == amount); + } + + function testBalance() public view{ + uint result; + address target = address(weth); + assembly { + result := balance(target) + } + assertGe (result , 0); + } + + function testExtCodeSize() public view{ + uint size; + address target = address(weth); + assembly { + size := extcodesize(target) + } + assertEq (size , 3305); + } + + function testExtCodeCopy() public view { + address target = address(weth); + bytes memory code = new bytes(3305); + assembly { + // Copy the code starting from offset 0 into memory starting at code + 32 bytes. + extcodecopy(target, add(code, 0x20), 0, 3305) + } + assert(code.length == 3305); + } + + function testExtCodeHash() public view { + address target = address(weth); + bytes32 codehash; + assembly { + codehash := extcodehash(target) + } + + assertEq(codehash, 0xe30dc87ed2bc929b6ab16f1548d804911bada1b629fc3982dda57627ce934acc); + } +} + diff --git a/src/tests/integration/test_kontrol.py b/src/tests/integration/test_kontrol.py index 5e4ea717d..bdefb4eac 100644 --- a/src/tests/integration/test_kontrol.py +++ b/src/tests/integration/test_kontrol.py @@ -1,6 +1,7 @@ from __future__ import annotations import sys +from os import getenv from shutil import copytree from typing import TYPE_CHECKING @@ -80,6 +81,7 @@ def foundry_end_to_end(foundry_root_dir: Path | None, tmp_path_factory: TempPath ALL_PROVE_TESTS: Final = tuple((TEST_DATA_DIR / 'end-to-end-prove-all').read_text().splitlines()) +ALL_FORKED_TESTS: Final = tuple((TEST_DATA_DIR / 'end-to-end-prove-forked').read_text().splitlines()) SKIPPED_PROVE_TESTS: Final = tuple((TEST_DATA_DIR / 'end-to-end-prove-skip').read_text().splitlines()) SHOW_TESTS: Final = tuple((TEST_DATA_DIR / 'end-to-end-prove-show').read_text().splitlines()) @@ -105,21 +107,35 @@ def test_kontrol_end_to_end( if bug_report is not None: server_end_to_end._populate_bug_report(bug_report) + options = ProveOptions( + { + 'tests': [(test_id, None)], + 'bug_report': bug_report, + 'break_on_calls': False, + 'usegas': False, + 'port': server_end_to_end.port, + 'force_sequential': force_sequential, + 'schedule': 'CANCUN', + 'stack_checks': False, + } + ) + fork_options = ProveOptions( + { + 'tests': [(test_id, None)], + 'bug_report': bug_report, + 'break_on_calls': False, + 'usegas': False, + 'port': server_end_to_end.port, + 'force_sequential': force_sequential, + 'schedule': 'CANCUN', + 'stack_checks': False, + 'fork_url': getenv('WEB3_PROVIDER_KEY'), + 'fork_block_number': 131674109, + } + ) # When prove_res = foundry_prove( - foundry=foundry_end_to_end, - options=ProveOptions( - { - 'tests': [(test_id, None)], - 'bug_report': bug_report, - 'break_on_calls': False, - 'usegas': False, - 'port': server_end_to_end.port, - 'force_sequential': force_sequential, - 'schedule': 'CANCUN', - 'stack_checks': False, - } - ), + foundry=foundry_end_to_end, options=fork_options if test_id in ALL_FORKED_TESTS else options ) # Then From 7e3842e54f215ee7b3b7aaad738cdeb7db1a6f72 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sat, 15 Feb 2025 18:50:13 +0200 Subject: [PATCH 15/19] try to fix nix build --- poetry.lock | 2 +- pyproject.toml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index cb213998b..63368b78a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3590,4 +3590,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "51bdf010a638520c29d77c4ff05f4ab2f176ac35304e2854571d8c35041cdd23" +content-hash = "21e42e4046175fa1be4816c67a2cfc72ff8c0822eb4a85ba390d0f7c036b0f87" diff --git a/pyproject.toml b/pyproject.toml index e6ac28400..77391b436 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ pytest-mock = "*" pytest-xdist = "*" pytest-timeout = "*" pyupgrade = "*" +setuptools = "*" [tool.poetry.scripts] kontrol = "kontrol.__main__:main" From 86c078f16cd20ca75ecbead00f5f6c0af31a8330 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sun, 16 Feb 2025 09:13:49 +0200 Subject: [PATCH 16/19] Revert "try to fix nix build" This reverts commit 7e3842e54f215ee7b3b7aaad738cdeb7db1a6f72. --- poetry.lock | 2 +- pyproject.toml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 63368b78a..cb213998b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3590,4 +3590,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "21e42e4046175fa1be4816c67a2cfc72ff8c0822eb4a85ba390d0f7c036b0f87" +content-hash = "51bdf010a638520c29d77c4ff05f4ab2f176ac35304e2854571d8c35041cdd23" diff --git a/pyproject.toml b/pyproject.toml index 77391b436..e6ac28400 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,6 @@ pytest-mock = "*" pytest-xdist = "*" pytest-timeout = "*" pyupgrade = "*" -setuptools = "*" [tool.poetry.scripts] kontrol = "kontrol.__main__:main" From 00e3aa09468162e16dba0b86943d848a8b80e8b0 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sun, 16 Feb 2025 09:15:12 +0200 Subject: [PATCH 17/19] tweaks --- src/tests/integration/test-data/end-to-end-prove-skip | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/integration/test-data/end-to-end-prove-skip b/src/tests/integration/test-data/end-to-end-prove-skip index 2668de8ef..e09511673 100644 --- a/src/tests/integration/test-data/end-to-end-prove-skip +++ b/src/tests/integration/test-data/end-to-end-prove-skip @@ -1,3 +1,7 @@ +ProviderUnitTest.testBalance() +ProviderUnitTest.testExtCodeCopy() +ProviderUnitTest.testExtCodeHash() +ProviderUnitTest.testExtCodeSize() UnitTest.test_assert_eq_address_darray_err() UnitTest.test_assert_eq_bool_darray_err() UnitTest.test_assert_eq_bytes32_darray_err() From b7c15ec75e4feb58388cce69be222444251e9cd0 Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sun, 16 Feb 2025 10:51:52 +0200 Subject: [PATCH 18/19] debug ci test --- src/tests/integration/test_kontrol.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/integration/test_kontrol.py b/src/tests/integration/test_kontrol.py index bdefb4eac..90ec3da52 100644 --- a/src/tests/integration/test_kontrol.py +++ b/src/tests/integration/test_kontrol.py @@ -139,9 +139,9 @@ def test_kontrol_end_to_end( ) # Then - assert_pass(test_id, single(prove_res)) if test_id not in SHOW_TESTS or no_use_booster: + assert_pass(test_id, single(prove_res)) return # And when From e06b71dce04b8d57605fc84167efd858dae48efa Mon Sep 17 00:00:00 2001 From: Andrei <16517508+anvacaru@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:26:09 +0200 Subject: [PATCH 19/19] debug ci test 2 --- src/tests/integration/test_kontrol.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/integration/test_kontrol.py b/src/tests/integration/test_kontrol.py index 90ec3da52..2d6c8121d 100644 --- a/src/tests/integration/test_kontrol.py +++ b/src/tests/integration/test_kontrol.py @@ -133,6 +133,7 @@ def test_kontrol_end_to_end( 'fork_block_number': 131674109, } ) + print('web3 key available: ', getenv('WEB3_PROVIDER_KEY') is not None) # When prove_res = foundry_prove( foundry=foundry_end_to_end, options=fork_options if test_id in ALL_FORKED_TESTS else options