Repository: 0xSpaceShard/starknet-devnet (language: python)

Issue:
Adapt to Starknet 0.11



Discussion / hints:

Fix patch:
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 0f238870d..010decf55 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -11,9 +11,9 @@ aliases:
   - &on_master_after_test_and_build
     <<: *on_master
     requires:
-      - test_py_min
       - test_py_max
-      - test_py_max_rust
+      # TMP: rust vm
+      # - test_py_max_rust
       - image_build
       - image_build_arm
 
@@ -33,6 +33,11 @@ jobs:
       - run:
           name: Install development tools
           command: ./scripts/install_dev_tools.sh
+      - run:
+          name: Compile test contracts
+          command: ./scripts/compile_contracts.sh
+          environment:
+            CAIRO_1_COMPILER_MANIFEST: cairo-compiler/Cargo.toml
       - run:
           name: Check devnet versions
           command: ./scripts/check_versions.sh
@@ -42,9 +47,6 @@ jobs:
       - run:
           name: Check import sort
           command: ./scripts/check_import_sort.sh
-      - run:
-          name: Compile test contracts
-          command: ./scripts/compile_contracts.sh
       - run:
           name: Run pytest tests
           parallel: true
@@ -63,10 +65,12 @@ jobs:
       - store_artifacts:
           path: test-results
 
-  test_py_min:
-    <<: *test_template
-    docker:
-      - image: cimg/python:3.8-node
+  # Since cairo-lang 0.11.0, supported py_min and py_max are the same.
+  # Uncomment and modify these lines if py_min and py_max stop being the same.
+  # test_py_min:
+  #   <<: *test_template
+  #   docker:
+  #     - image: cimg/python: <PY_VERSION> -node
 
   test_py_max_rust:
     <<: *test_template
@@ -125,9 +129,9 @@ workflows:
   version: 2
   test_and_publish:
     jobs:
-      - test_py_min
       - test_py_max
-      - test_py_max_rust
+      # TMP: rust vm
+      # - test_py_max_rust
       - image_build:
           <<: *on_master
       - image_build_arm:
diff --git a/.dockerignore b/.dockerignore
index cc15dba7f..ba730c6a3 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -15,6 +15,7 @@ Dockerfile
 test/
 .pylintrc
 page/
+cairo-compiler
 
 # Hardhat specific
 node_modules/
diff --git a/.gitignore b/.gitignore
index 29c722f51..94025a775 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ starknet-hardhat-example
 .vscode/
 test/build/
 test/artifacts/
+cairo-compiler
 
 # Hardhat specific
 node_modules/
diff --git a/page/docs/guide/development.md b/page/docs/guide/development.md
index 45008f81c..7fb3538d8 100644
--- a/page/docs/guide/development.md
+++ b/page/docs/guide/development.md
@@ -6,6 +6,8 @@ sidebar_position: 18
 
 If you're a developer willing to contribute, be sure to have installed [**Poetry**](https://pypi.org/project/poetry/) and all the dependency packages by running the installation script. Prerequisites for running the script: `gcc`, `g++`, `gmp`, `npm`.
 
+To use an existing Cairo 1 compiler repository, set the environment variable `CAIRO_1_COMPILER_MANIFEST` to the path of the `Cargo.toml` of the compiler. If this variable is not set, a new compiler repository will be downloaded as a subdirectory of your starknet-devnet directory.
+
 ```bash
 ./scripts/install_dev_tools.sh
 ```
@@ -66,9 +68,11 @@ consider running `export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES` in your shell.
 ./scripts/check_versions.sh
 ```
 
-## Development - Working with an archive of cairo-lang
+## Development - Adapting to a new version of cairo-lang
+
+Install the exact version with `poetry add cairo-lang@<VERSION>`.
 
-If you know the URL of the archive (e.g. ZIP) of a new cairo-lang version, you can install it with
+If you only know the URL of the archive (e.g. ZIP) of a new cairo-lang version, you can install it with
 
 ```
 poetry add <URL>
@@ -76,6 +80,10 @@ poetry add <URL>
 
 After adding a new cairo-lang version, you will probably want to recompile contract artifacts.
 
+Why are we installing the exact version? We depend on Starknet's internal code, and any minor change might make Devnet unusable.
+
+When adapting to a new cairo-lang version, to make the tests pass, some hashes will need to be replaced (at least a different version string is stored in the compilation artifacts, leading to a different hash). This is the main argument for keeping the hardcoded hash values in tests: they are only expected to change if a new version cairo-lang version is being added or there is a change with the smart contracts themselves, otherwise a change in the expected hash values probably indicates a bug.
+
 ## Development - Updating accounts
 
 1. Set up https://github.com/OpenZeppelin/cairo-contracts/ locally
diff --git a/page/docs/guide/postman.md b/page/docs/guide/postman.md
index 08b293594..6048c174c 100644
--- a/page/docs/guide/postman.md
+++ b/page/docs/guide/postman.md
@@ -35,7 +35,7 @@ Goes through the newly enqueued messages, sending them from L1 to L2 and from L2
 
 ### Postman - disclaimer
 
-This method of L1 <-> L2 communication testing differs from Starknet Alpha networks. Taking the [**L1 L2 Example .sol**](https://www.cairo-lang.org/docs/_static/L1L2Example.sol) contract in the [**starknet documentation**](https://www.cairo-lang.org/docs/hello_starknet/l1l2.html) :
+This method of L1 <-> L2 communication testing differs from Starknet Alpha networks. Taking the [**L1L2Example.sol**](https://www.cairo-lang.org/docs/_static/L1L2Example.sol) contract from the [**Starknet documentation**](https://www.cairo-lang.org/docs/hello_starknet/l1l2.html):
 
 ```
 constructor(IStarknetCore starknetCore_) public {
diff --git a/page/docs/intro.md b/page/docs/intro.md
index 006682e77..02ddb1f17 100644
--- a/page/docs/intro.md
+++ b/page/docs/intro.md
@@ -16,7 +16,7 @@ Let's discover **[starknet-devnet](https://github.com/Shard-Labs/starknet-devnet
 
 ## Requirements
 
-Works with Python versions >=3.8 and <3.10.
+Works with Python versions >=3.9 and <3.10.
 
 On Ubuntu/Debian, first run:
 
diff --git a/poetry.lock b/poetry.lock
index 7d1b20320..7f0e6ef04 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -205,13 +205,99 @@ tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "
 
 [[package]]
 name = "bitarray"
-version = "1.2.2"
+version = "2.7.3"
 description = "efficient arrays of booleans -- C extension"
 category = "main"
 optional = false
 python-versions = "*"
 files = [
-    {file = "bitarray-1.2.2.tar.gz", hash = "sha256:27a69ffcee3b868abab3ce8b17c69e02b63e722d4d64ffd91d659f81e9984954"},
+    {file = "bitarray-2.7.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:979d42e0b2c3113526f9716a461e08671788a23ce7e3b5cd090ce3e6a6762641"},
+    {file = "bitarray-2.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:860edf8533223d82bd6201894bcaf540f828f49075f363390eecf04b12fb94cb"},
+    {file = "bitarray-2.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:78378d8dacbe1f4f263347f42ec0a41cc2097cd671c6ac30a65a838284a5e141"},
+    {file = "bitarray-2.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:888df211aafe5fad41c0792a686d95c8ba37345d5037f437aa3c09608f9c3b56"},
+    {file = "bitarray-2.7.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb3f003dee96dbf24a6df71443557f249b17b20083c189995302b14eb01530bf"},
+    {file = "bitarray-2.7.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c531532c21bc1063e65957a1a85a2d13601ec21801f70821c89d9339b16ebc78"},
+    {file = "bitarray-2.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8fd92c8026e4ba6874e94f538890e35bef2a3a18ea54e3663c578b7916ade1"},
+    {file = "bitarray-2.7.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d19c34a2121eccfeb642d4ad71163bd3342a8f3a99e6724fe824bdfbc0a5b65"},
+    {file = "bitarray-2.7.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:102db74ee82ec5774aba01481e73eedaebd27ba167344a81d3b42e6fbf9ffb77"},
+    {file = "bitarray-2.7.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7f6540b45b2230442f7a0614745131e0a6f28251f5d33ac19d0ed61d80db7153"},
+    {file = "bitarray-2.7.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:99c9345c417a9cff98f9f6e59b0350dcc10c2e0e1ea66acf7946de1cd60541fa"},
+    {file = "bitarray-2.7.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:a1d439c98e65ab8e5fbcc2b242a16e7a3f076974bff78185ff42ba2d4c220032"},
+    {file = "bitarray-2.7.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:87897ec0e4876c9f2c1ae313519de0ed2ad8041a4d2210a083f9b4a239add2e3"},
+    {file = "bitarray-2.7.3-cp310-cp310-win32.whl", hash = "sha256:cb46c3a4002c8322dd0e1b4b53f8a647dcb0f199f5c7a1fc03d3880c3eabbd2c"},
+    {file = "bitarray-2.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:5df10eb9b794932b0cf806f412d1c6d04fb7655ca7ae5caf6354b9edc380a5f7"},
+    {file = "bitarray-2.7.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:27524bc92fdeb464a5057a4677a35f482cf30be2e920bd1d11c46de533cafda6"},
+    {file = "bitarray-2.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3cf37431de779b29e5c0d8e36868f77f6df53c3c19c20e8404137e257dc80040"},
+    {file = "bitarray-2.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8abd23f94cdcce971d932a5f0a066d40fbc61901fd087aa70d32cccd1793bd20"},
+    {file = "bitarray-2.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7659bdfe7716b14a39007e31e957fa64d7f0d9e40a1dbd024bd81b972d76bffb"},
+    {file = "bitarray-2.7.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1570f301abdfda68f4fdb40c4d3f09af4bb6e4550b4fa5395db0d142b680bc"},
+    {file = "bitarray-2.7.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8becbb9649fd29ee577f9f0405ce2fba5cf9fa2c290c9b044bc235c04473f213"},
+    {file = "bitarray-2.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72fd7f6f940bc42914c86700591ccfd1daeff0e414cefcbd7843117df2fac4e9"},
+    {file = "bitarray-2.7.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23b7bada6d6b62cba08f4a1b8a95da2d8592aae1db3c167dcb52abcba0a7bef5"},
+    {file = "bitarray-2.7.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4b2d150a81a981537801ac7d4f4f5d082c48343612a21f4e2c4cd2e887973bd5"},
+    {file = "bitarray-2.7.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1502660ab489b1f18c3493c766252cd5d24bc1cbf4bdf3594e0a30de142ed453"},
+    {file = "bitarray-2.7.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:91f43f6b6c9129a56d3e2dccb8b88ffce0e4f4893dd9d69d285676bdf5b9ca14"},
+    {file = "bitarray-2.7.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a69c99274aee2ffdc7f1cfd34044ccb7155790d6f5217d677ea46a6ddead6dd2"},
+    {file = "bitarray-2.7.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d63f20299441e32171f08fc62f7ea7e401cc12a96f67a36ab2d76439ecfcb118"},
+    {file = "bitarray-2.7.3-cp311-cp311-win32.whl", hash = "sha256:0b84fd9dbf999cbca1090a7703aa1404cd01af4035c6ba3adf69d41280611fb6"},
+    {file = "bitarray-2.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:76bbbb9ceebb9cbb2b14369b3681fecab226792b339f612e79f6575ca31fed45"},
+    {file = "bitarray-2.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50d5e2c026b3e3d145f64c457338ea99edcbdd302fdcbd96418251ac51a98a59"},
+    {file = "bitarray-2.7.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d571056115bbdc18f199a9ee4c2a1b5884f5e63a3c05fe43d2fc7fc67320515"},
+    {file = "bitarray-2.7.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2a0313657e6656efca2148cfc91c50fdafca6f811b6c7d0906e6ba57134e560"},
+    {file = "bitarray-2.7.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3b5abb73c45d40d27f9795dac9d6eb1515729c13f93dd67df2be07be6549990"},
+    {file = "bitarray-2.7.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7776c070943f45cd8303543a6625cf82f2e000ef9c885d52d7828be099e52f42"},
+    {file = "bitarray-2.7.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:057f9c53a34e42deed6e8813a82b9c85924f4728be28e3b9b65144569ac5a387"},
+    {file = "bitarray-2.7.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8591ad5768860ad186dc94fd58b2932604a7639b57eefbbff2b4865af3407691"},
+    {file = "bitarray-2.7.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bd7f4b2df89bf4e298756c0be0be67fb84d6aa49bda60d46805d43f0e643abd5"},
+    {file = "bitarray-2.7.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:433f91c8ab8338662aaa86b0677e6c15c35f8f7b65d4c43d7d1647a8198bc0b0"},
+    {file = "bitarray-2.7.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:31e60d8341c3189aa156ca8cb2f6370b29d79cf132e3d091714b0a5a9097eb69"},
+    {file = "bitarray-2.7.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ea33ed09157e032f0a7a2627ef87f156e9927697f59b55961439d34bf45af23a"},
+    {file = "bitarray-2.7.3-cp36-cp36m-win32.whl", hash = "sha256:302149aaff75939beb8af7f32ac9bf922480033a24fb54f4ebc0c9dc175247c4"},
+    {file = "bitarray-2.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:7a8995737fae8de03b31ed83acf4f4326a55b217022009d18be19ff87fc9010e"},
+    {file = "bitarray-2.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8b2f31a4cc28aef27355ab896e4b4cc2da2204b2b7adb674d8be7fefa0c93868"},
+    {file = "bitarray-2.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5df624ee8a4098c3b1149f4817f2a4a0121c4920e1c114af324bc52d6659e2b"},
+    {file = "bitarray-2.7.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb1d60ed709989e34e7158d97fdb077a2f2dfc505998a84161a70f81a6101172"},
+    {file = "bitarray-2.7.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:748847e58c45a37f23db1f53a6dc16ae32aa80ee504653d79336830de1a79ed7"},
+    {file = "bitarray-2.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4b7fdb9772e087174f446655bbc497a1600b5758f279c6d44fcf344c13d5c8a"},
+    {file = "bitarray-2.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86e9c48ffeddb0f943e87ab65e1e95dccc9b44ef3761af3bf9642973ab7646d2"},
+    {file = "bitarray-2.7.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d1f49cc51919d6fa0f7eebd073d2c620b80079aa537d084a7fafb46a35c7a4d"},
+    {file = "bitarray-2.7.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b43d56c7c96f5a055f4051be426496db2a616840645d0ab3733d5ceacb2f701b"},
+    {file = "bitarray-2.7.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:01f8d02c3eae82c98d4259777cb2f042a0b3989d7dceeb37c643cb94b91d5a42"},
+    {file = "bitarray-2.7.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d089b1d0b157c9a484f8f7475eecea813d0dc3818adc5bf352903da14fe88fc3"},
+    {file = "bitarray-2.7.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1362e9fb78ca72aa52ec1f1fbd62872801302001b0156ed2a1e707850cd30ffd"},
+    {file = "bitarray-2.7.3-cp37-cp37m-win32.whl", hash = "sha256:2cdf5700537e5aa4ec9f4a0b498b8d5b03b9859d503e01ea17a6a134a838aa30"},
+    {file = "bitarray-2.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1e1553933f4533040491f4e4499bcbbfcee42c4056f56d7e18010e779daab33d"},
+    {file = "bitarray-2.7.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1048a29b3d72b1821a3ae9e8d64e71ed96c53a1a36b1da6db02091a424a8f795"},
+    {file = "bitarray-2.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:10dc358fe29d7a4c5be78ab2fb5aa50cb8066babd23e0b5589eb68e26afe58d8"},
+    {file = "bitarray-2.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8ab6770833976448a9a973bc0df63adedc4c30de4774cec5a9928fc496423ebb"},
+    {file = "bitarray-2.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abe2f829f6f2d330bccf1bcde2192264ab9a15d6d00e507265f46dc66557014"},
+    {file = "bitarray-2.7.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87851a82bdf849e3c40ff6d8af5f734634e17f52a8f7f7e74486c2f8ce717578"},
+    {file = "bitarray-2.7.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5fc2512bdf5289a1412c936c65d17881d2b46edb0036c63a8d5605dc8d398a3"},
+    {file = "bitarray-2.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1289f408a8b5c87cdb4fd7975d4021c6e61209ccb956d0411e72bf43c7f78463"},
+    {file = "bitarray-2.7.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ee181cc00aaba38d9812f4df4e7d828105b6dde3b068cd2c43f1d8f395e0046"},
+    {file = "bitarray-2.7.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:00e93f70cbcbeabd1e79accf1b6f5b2424cd40556e7877f618549523d0031c98"},
+    {file = "bitarray-2.7.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3fb6a952796d16c3a309d866eef56a8f4e5591d112c22446e67d33ecb096b44b"},
+    {file = "bitarray-2.7.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:0fe747a134f7f5bc0877eee58090ae7e7f23628eeb459f681ade65719c3f246a"},
+    {file = "bitarray-2.7.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:2c1b2c91bf991b5c641faee78dd5a751dff6155ec51c7a6c7f922dc85431898e"},
+    {file = "bitarray-2.7.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c3956ae54285ab30d802756144887e30e013f81c9f03e5ffff9daa46d8ca0154"},
+    {file = "bitarray-2.7.3-cp38-cp38-win32.whl", hash = "sha256:00a6fc4355bd4e6ead54d05187dc4ea39f0af439b336ae113f0194673ed730ae"},
+    {file = "bitarray-2.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:305e6f7441c007f296644ba3899c0306ce9fd7a482dbbc06b6e7b7bd6e0ddabc"},
+    {file = "bitarray-2.7.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fe80c23409efb41b86efb5e45f334420a9b5b7828f5b3d08b5ff28f03a024d9e"},
+    {file = "bitarray-2.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16345146b61e93ca20679c83537ccf7245f78b17035f5b1a436fd2b75da04c5e"},
+    {file = "bitarray-2.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1af9b720a048c69e999094e2310138b7cfca5471a9d2c1dbe4b53dd10e516720"},
+    {file = "bitarray-2.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:088e6e9ea7f0eaf8b672679a68096dbc0a7a7b7a4ed567860f7362e1588370a6"},
+    {file = "bitarray-2.7.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:122cd70ee0de2cc9d94da8b8ebcb7dca12b9f4d3beefb94c11e110e1d87503bb"},
+    {file = "bitarray-2.7.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb9a8ee23416bd0cfd457118978bc2f6f02c20b95336db486887f670bf92c2b7"},
+    {file = "bitarray-2.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a544f99c24b6f658907eb9edf290a9c54f4106738b2ab84cd19dc6013cc3abf"},
+    {file = "bitarray-2.7.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:980f6564218f853a9341fb045446539d4153338926ed2fb222e86dc9b2ae9b8f"},
+    {file = "bitarray-2.7.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f64abe9301b918d2c352e42198cea0196f3639bc1ad23a4a9d8ae97f66068901"},
+    {file = "bitarray-2.7.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:029c724bf38c6616b90b1c423b846b63f8d607ed5a23d270e3862696d88a5392"},
+    {file = "bitarray-2.7.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:16cb00911584a6e9ca0f42c305714898120dc6bfbbec90dacedeed4690331a47"},
+    {file = "bitarray-2.7.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:699b0134e87c0c4e3b224d879d218c4385a06e6b72df73b4c9c9d549155fb837"},
+    {file = "bitarray-2.7.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b508e1bba4ec68fd0ef28505e2dad2f56de7df710c8334c97036705a562cb908"},
+    {file = "bitarray-2.7.3-cp39-cp39-win32.whl", hash = "sha256:4b84230624d15868e407ba8b66df54fc69ee6a9e9cb6d51eb264b8f2614596f1"},
+    {file = "bitarray-2.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:757a08bf0aed5a650a399f8c66bcba00c210bce34408b6d7b09b4837bee8f4da"},
+    {file = "bitarray-2.7.3.tar.gz", hash = "sha256:f71256a32609b036adad932e1228b66a6b4e2cae6be397e588ddc0babd9a78b9"},
 ]
 
 [[package]]
@@ -261,18 +347,6 @@ d = ["aiohttp (>=3.7.4)"]
 jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
 uvloop = ["uvloop (>=0.15.2)"]
 
-[[package]]
-name = "cached-property"
-version = "1.5.2"
-description = "A decorator for caching properties in classes."
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
-    {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
-]
-
 [[package]]
 name = "cachetools"
 version = "5.3.0"
@@ -287,13 +361,13 @@ files = [
 
 [[package]]
 name = "cairo-lang"
-version = "0.10.3"
+version = "0.11.0.1"
 description = "Compiler and runner for the Cairo language"
 category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "cairo-lang-0.10.3.zip", hash = "sha256:3093946334590f199d99471912049c182cec1f90d4ad02029f460a0de3a27502"},
+    {file = "cairo-lang-0.11.0.1.zip", hash = "sha256:980be66de30b26ab26f9e4e616e32fbcf53530891a2a0a9d4544f17863cfbfa7"},
 ]
 
 [package.dependencies]
@@ -302,7 +376,7 @@ cachetools = "*"
 ecdsa = "*"
 eth-hash = {version = "*", extras = ["pycryptodome"]}
 fastecdsa = "*"
-frozendict = "1.2"
+frozendict = "*"
 lark = "*"
 marshmallow = ">=3.2.1"
 marshmallow-dataclass = ">=7.1.0"
@@ -316,8 +390,8 @@ pytest = "*"
 pytest-asyncio = "*"
 PyYAML = "*"
 sympy = "*"
-typeguard = "*"
-Web3 = "*"
+typeguard = "<3.0.0"
+Web3 = "<6.0.0"
 
 [[package]]
 name = "cairo-rs-py"
@@ -669,244 +743,185 @@ gmpy2 = ["gmpy2"]
 
 [[package]]
 name = "eth-abi"
-version = "3.0.1"
+version = "2.2.0"
 description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding"
 category = "main"
 optional = false
-python-versions = ">=3.7, <4"
+python-versions = ">=3.6, <4"
 files = [
-    {file = "eth_abi-3.0.1-py3-none-any.whl", hash = "sha256:63d16f1f60870afc974cb0a3325fb275fa97822be1723b8878598df25eea8096"},
-    {file = "eth_abi-3.0.1.tar.gz", hash = "sha256:c3872e3ac1e9ef3f8c6599aaca4ee536d536eefca63a6892ab937f0560edb656"},
+    {file = "eth_abi-2.2.0-py3-none-any.whl", hash = "sha256:8d018351b00e304113f50ffded9baf4b9c6ef1c7e4ddec71bd64048c1c5c438c"},
+    {file = "eth_abi-2.2.0.tar.gz", hash = "sha256:d1bd16a911dd8fe45f1e6ed02099b4fceb8ae9ea741ab11b135cf288ada74a99"},
 ]
 
 [package.dependencies]
-eth-typing = ">=3.0.0,<4.0.0"
-eth-utils = ">=2.0.0,<3.0.0"
+eth-typing = ">=2.0.0,<3.0.0"
+eth-utils = ">=1.2.0,<2.0.0"
 parsimonious = ">=0.8.0,<0.9.0"
 
 [package.extras]
-dev = ["Sphinx (>=1.6.5,<2)", "black", "bumpversion (>=0.5.3,<1)", "eth-hash[pycryptodome]", "flake8 (==4.0.1)", "hypothesis (>=4.18.2,<5.0.0)", "ipython", "isort (>=4.2.15,<5)", "jinja2 (>=3.0.0,<3.1.0)", "mypy (==0.910)", "pydocstyle (>=6.0.0,<7)", "pytest (>=6.2.5,<7)", "pytest-pythonpath (>=0.7.1)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist (>=2.5.0,<3)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=21,<22)", "tox (>=2.9.1,<3)", "twine", "wheel"]
+dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash[pycryptodome]", "flake8 (==4.0.1)", "hypothesis (>=4.18.2,<5.0.0)", "ipython", "isort (>=4.2.15,<5)", "jinja2 (>=3.0.0,<3.1.0)", "mypy (==0.910)", "pydocstyle (>=3.0.0,<4)", "pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist (==1.22.3)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=21,<22)", "tox (>=2.9.1,<3)", "twine", "wheel"]
 doc = ["Sphinx (>=1.6.5,<2)", "jinja2 (>=3.0.0,<3.1.0)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=21,<22)"]
-lint = ["black", "flake8 (==4.0.1)", "isort (>=4.2.15,<5)", "mypy (==0.910)", "pydocstyle (>=6.0.0,<7)"]
-test = ["eth-hash[pycryptodome]", "hypothesis (>=4.18.2,<5.0.0)", "pytest (>=6.2.5,<7)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (>=2.5.0,<3)", "tox (>=2.9.1,<3)"]
+lint = ["flake8 (==4.0.1)", "isort (>=4.2.15,<5)", "mypy (==0.910)", "pydocstyle (>=3.0.0,<4)"]
+test = ["eth-hash[pycryptodome]", "hypothesis (>=4.18.2,<5.0.0)", "pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)"]
 tools = ["hypothesis (>=4.18.2,<5.0.0)"]
 
 [[package]]
 name = "eth-account"
-version = "0.6.1"
+version = "0.5.9"
 description = "eth-account: Sign Ethereum transactions and messages with local private keys"
 category = "main"
 optional = false
 python-versions = ">=3.6, <4"
 files = [
-    {file = "eth-account-0.6.1.tar.gz", hash = "sha256:54b0b7d661e73f4cd12d508c9baa5c9a6e8c194aa7bafc39277cd673683ae50e"},
-    {file = "eth_account-0.6.1-py3-none-any.whl", hash = "sha256:71898127a808d75127a68fa4193aba967489eaf6e62cee1e2e8b08582d01cba8"},
+    {file = "eth-account-0.5.9.tar.gz", hash = "sha256:ee62e121d977ca452f600043338af36f9349aa1f8409c5096d75df6576c79f1b"},
+    {file = "eth_account-0.5.9-py3-none-any.whl", hash = "sha256:42f9eefbf0e1c84a278bf27a25eccc2e0c20b18c17e2ab6f46044a534479e95a"},
 ]
 
 [package.dependencies]
-bitarray = ">=1.2.1,<1.3.0"
-eth-abi = ">=3.0.0,<4"
-eth-keyfile = ">=0.6.0,<0.7.0"
-eth-keys = ">=0.4.0,<0.5"
-eth-rlp = ">=0.3.0,<1"
-eth-utils = ">=2.0.0,<3"
+bitarray = ">=1.2.1,<3"
+eth-abi = ">=2.0.0b7,<3"
+eth-keyfile = ">=0.5.0,<0.6.0"
+eth-keys = ">=0.3.4,<0.4.0"
+eth-rlp = ">=0.1.2,<2"
+eth-utils = ">=1.3.0,<2"
 hexbytes = ">=0.1.0,<1"
-rlp = ">=1.0.0,<4"
+rlp = ">=1.0.0,<3"
 
 [package.extras]
-dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.7.9)", "hypothesis (>=4.18.0,<5)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"]
-doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"]
-lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"]
+dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.7.9)", "hypothesis (>=4.18.0,<5)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.910)", "pydocstyle (>=5.0.0,<6)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21.9.0)", "tox (==3.14.6)", "twine", "wheel"]
+doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21.9.0)"]
+lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.910)", "pydocstyle (>=5.0.0,<6)"]
 test = ["hypothesis (>=4.18.0,<5)", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox (==3.14.6)"]
 
-[[package]]
-name = "eth-bloom"
-version = "1.0.4"
-description = "Python implementation of the Ethereum Trie structure"
-category = "dev"
-optional = false
-python-versions = ">=3.6, <4"
-files = [
-    {file = "eth-bloom-1.0.4.tar.gz", hash = "sha256:688317306d87b823da63d24e1ad706defadbd865887ed4bddf7fbd0410b2093c"},
-    {file = "eth_bloom-1.0.4-py3-none-any.whl", hash = "sha256:5d6d28fa60ee1e25436c45b9593798d7e193224b364ea1a212050055dfa1942c"},
-]
-
-[package.dependencies]
-eth-hash = {version = ">=0.3.1,<0.4.0", extras = ["pycryptodome"]}
-
-[package.extras]
-deploy = ["bumpversion (>=0.5.3,<1.0.0)", "wheel (>=0.30.0,<1.0.0)"]
-dev = ["bumpversion (>=0.5.3,<1.0.0)", "flake8 (>=3.5.0,<4.0.0)", "hypothesis (==3.7.0)", "mypy (<0.600)", "pytest (==3.0.7)", "tox (==2.6.0)", "twine", "wheel (>=0.30.0,<1.0.0)"]
-lint = ["flake8 (>=3.5.0,<4.0.0)", "mypy (<0.600)"]
-test = ["hypothesis (==3.7.0)", "pytest (==3.0.7)", "tox (==2.6.0)"]
-
 [[package]]
 name = "eth-hash"
-version = "0.3.3"
+version = "0.5.1"
 description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3"
 category = "main"
 optional = false
-python-versions = ">=3.5, <4"
+python-versions = ">=3.7, <4"
 files = [
-    {file = "eth-hash-0.3.3.tar.gz", hash = "sha256:8cde211519ff1a98b46e9057cb909f12ab62e263eb30a0a94e2f7e1f46ac67a0"},
-    {file = "eth_hash-0.3.3-py3-none-any.whl", hash = "sha256:3c884e4f788b38cc92cff05c4e43bc6b82686066f04ecfae0e11cdcbe5a283bd"},
+    {file = "eth-hash-0.5.1.tar.gz", hash = "sha256:9805075f653e114a31a99678e93b257fb4082337696f4eff7b4371fe65158409"},
+    {file = "eth_hash-0.5.1-py3-none-any.whl", hash = "sha256:4d992e885f3ae3901abbe98bd776ba62d0f6335f98c6e9fc60a39b9d114dfb5a"},
 ]
 
 [package.dependencies]
 pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""}
-pysha3 = {version = ">=1.0.0,<2.0.0", optional = true, markers = "extra == \"pysha3\""}
 
 [package.extras]
-dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "pytest (==5.4.1)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"]
-doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"]
-lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"]
+dev = ["Sphinx (>=5.0.0,<6)", "black (>=22.0,<23)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "jinja2 (>=3.0.0,<3.1.0)", "mypy (==0.961)", "pydocstyle (>=5.0.0,<6)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist (>=2.4.0,<3)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21,<22)", "tox (>=3.14.6,<4)", "twine", "wheel"]
+doc = ["Sphinx (>=5.0.0,<6)", "jinja2 (>=3.0.0,<3.1.0)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21,<22)"]
+lint = ["black (>=22.0,<23)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.961)", "pydocstyle (>=5.0.0,<6)"]
 pycryptodome = ["pycryptodome (>=3.6.6,<4)"]
-pysha3 = ["pysha3 (>=1.0.0,<2.0.0)"]
-test = ["pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"]
+pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"]
+test = ["pytest (>=6.2.5,<7)", "pytest-xdist (>=2.4.0,<3)", "tox (>=3.14.6,<4)"]
 
 [[package]]
 name = "eth-keyfile"
-version = "0.6.0"
+version = "0.5.1"
 description = "A library for handling the encrypted keyfiles used to store ethereum private keys."
 category = "main"
 optional = false
 python-versions = "*"
 files = [
-    {file = "eth-keyfile-0.6.0.tar.gz", hash = "sha256:d30597cdecb8ccd3b56bb275cd86fcdc7a279f86eafa92ddc49f66512f0bff67"},
-    {file = "eth_keyfile-0.6.0-py3-none-any.whl", hash = "sha256:7a874b179771827ffc7e38403ec412b8b3ff1a8c5cc945169609e799fadc7000"},
+    {file = "eth-keyfile-0.5.1.tar.gz", hash = "sha256:939540efb503380bc30d926833e6a12b22c6750de80feef3720d79e5a79de47d"},
+    {file = "eth_keyfile-0.5.1-py3-none-any.whl", hash = "sha256:70d734af17efdf929a90bb95375f43522be4ed80c3b9e0a8bca575fb11cd1159"},
 ]
 
 [package.dependencies]
-eth-keys = ">=0.4.0,<0.5.0"
-eth-utils = ">=2,<3"
-pycryptodome = ">=3.6.6,<4"
-
-[package.extras]
-dev = ["bumpversion (>=0.5.3,<1)", "eth-keys (>=0.4.0,<0.5.0)", "eth-utils (>=2,<3)", "flake8 (==4.0.1)", "idna (==2.7)", "pluggy (>=1.0.0,<2)", "pycryptodome (>=3.6.6,<4)", "pytest (>=6.2.5,<7)", "requests (>=2.20,<3)", "setuptools (>=36.2.0)", "tox (>=2.7.0)", "twine", "wheel"]
-keyfile = ["eth-keys (>=0.4.0,<0.5.0)", "eth-utils (>=2,<3)", "pycryptodome (>=3.6.6,<4)"]
-lint = ["flake8 (==4.0.1)"]
-test = ["pytest (>=6.2.5,<7)"]
+cytoolz = ">=0.9.0,<1.0.0"
+eth-keys = ">=0.1.0-beta.4,<1.0.0"
+eth-utils = ">=1.0.0-beta.1,<2.0.0"
+pycryptodome = ">=3.4.7,<4.0.0"
 
 [[package]]
 name = "eth-keys"
-version = "0.4.0"
+version = "0.3.4"
 description = "Common API for Ethereum key operations."
 category = "main"
 optional = false
 python-versions = "*"
 files = [
-    {file = "eth-keys-0.4.0.tar.gz", hash = "sha256:7d18887483bc9b8a3fdd8e32ddcb30044b9f08fcb24a380d93b6eee3a5bb3216"},
-    {file = "eth_keys-0.4.0-py3-none-any.whl", hash = "sha256:e07915ffb91277803a28a379418bdd1fad1f390c38ad9353a0f189789a440d5d"},
+    {file = "eth-keys-0.3.4.tar.gz", hash = "sha256:e5590797f5e2930086c705a6dd1ac14397f74f19bdcd1b5f837475554f354ad8"},
+    {file = "eth_keys-0.3.4-py3-none-any.whl", hash = "sha256:565bf62179b8143bcbd302a0ec6c49882d9c7678f9e6ab0484a8a5725f5ef10e"},
 ]
 
 [package.dependencies]
-eth-typing = ">=3.0.0,<4"
-eth-utils = ">=2.0.0,<3.0.0"
+eth-typing = ">=2.2.1,<3.0.0"
+eth-utils = ">=1.8.2,<2.0.0"
 
 [package.extras]
-coincurve = ["coincurve (>=7.0.0,<16.0.0)"]
-dev = ["asn1tools (>=0.146.2,<0.147)", "bumpversion (==0.5.3)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "eth-typing (>=3.0.0,<4)", "eth-utils (>=2.0.0,<3.0.0)", "factory-boy (>=3.0.1,<3.1)", "flake8 (==3.0.4)", "hypothesis (>=5.10.3,<6.0.0)", "mypy (==0.782)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==6.2.5)", "tox (==3.20.0)", "twine"]
-eth-keys = ["eth-typing (>=3.0.0,<4)", "eth-utils (>=2.0.0,<3.0.0)"]
+coincurve = ["coincurve (>=7.0.0,<13.0.0)"]
+dev = ["asn1tools (>=0.146.2,<0.147)", "bumpversion (==0.5.3)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "eth-typing (>=2.2.1,<3.0.0)", "eth-utils (>=1.8.2,<2.0.0)", "factory-boy (>=3.0.1,<3.1)", "flake8 (==3.0.4)", "hypothesis (>=5.10.3,<6.0.0)", "mypy (==0.782)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==5.4.1)", "tox (==3.20.0)", "twine"]
+eth-keys = ["eth-typing (>=2.2.1,<3.0.0)", "eth-utils (>=1.8.2,<2.0.0)"]
 lint = ["flake8 (==3.0.4)", "mypy (==0.782)"]
-test = ["asn1tools (>=0.146.2,<0.147)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "factory-boy (>=3.0.1,<3.1)", "hypothesis (>=5.10.3,<6.0.0)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==6.2.5)"]
+test = ["asn1tools (>=0.146.2,<0.147)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "factory-boy (>=3.0.1,<3.1)", "hypothesis (>=5.10.3,<6.0.0)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==5.4.1)"]
 
 [[package]]
 name = "eth-rlp"
-version = "0.3.0"
+version = "0.2.1"
 description = "eth-rlp: RLP definitions for common Ethereum objects in Python"
 category = "main"
 optional = false
-python-versions = ">=3.7, <4"
+python-versions = ">=3.6, <4"
 files = [
-    {file = "eth-rlp-0.3.0.tar.gz", hash = "sha256:f3263b548df718855d9a8dbd754473f383c0efc82914b0b849572ce3e06e71a6"},
-    {file = "eth_rlp-0.3.0-py3-none-any.whl", hash = "sha256:e88e949a533def85c69fa94224618bbbd6de00061f4cff645c44621dab11cf33"},
+    {file = "eth-rlp-0.2.1.tar.gz", hash = "sha256:f016f980b0ed42ee7650ba6e4e4d3c4e9aa06d8b9c6825a36d3afe5aa0187a8b"},
+    {file = "eth_rlp-0.2.1-py3-none-any.whl", hash = "sha256:cc389ef8d7b6f76a98f90bcdbff1b8684b3a78f53d47e871191b50d4d6aee5a1"},
 ]
 
 [package.dependencies]
-eth-utils = ">=2.0.0,<3"
+eth-utils = ">=1.0.1,<2"
 hexbytes = ">=0.1.0,<1"
-rlp = ">=0.6.0,<4"
+rlp = ">=0.6.0,<3"
 
 [package.extras]
-dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash[pycryptodome]", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"]
+dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash[pycryptodome]", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)", "pytest (==5.4.1)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"]
 doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"]
 lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)"]
-test = ["eth-hash[pycryptodome]", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox (==3.14.6)"]
-
-[[package]]
-name = "eth-tester"
-version = "0.6.0b5"
-description = "Tools for testing Ethereum applications."
-category = "dev"
-optional = false
-python-versions = ">=3.6.8,<4"
-files = [
-    {file = "eth-tester-0.6.0b5.tar.gz", hash = "sha256:0dbc31596976dc3b012e284cd06d723e8fc1b9e8ef4c0cf7969a8134e5b29a38"},
-    {file = "eth_tester-0.6.0b5-py3-none-any.whl", hash = "sha256:27f052db24c634b76bf413a07282ee5e2421d1f601a7c7b56dd5f7335980391f"},
-]
-
-[package.dependencies]
-eth-abi = ">=3.0.0,<4.0.0"
-eth-account = ">=0.6.0,<0.7.0"
-eth-hash = [
-    {version = ">=0.1.4,<1.0.0", extras = ["pysha3"], optional = true, markers = "implementation_name == \"cpython\" and extra == \"py-evm\""},
-    {version = ">=0.1.4,<1.0.0", extras = ["pycryptodome"], optional = true, markers = "implementation_name == \"pypy\" and extra == \"py-evm\""},
-]
-eth-keys = ">=0.4.0,<0.5.0"
-eth-utils = ">=2.0.0,<3.0.0"
-py-evm = {version = "0.5.0a2", optional = true, markers = "extra == \"py-evm\""}
-rlp = ">=3.0.0,<4"
-semantic-version = ">=2.6.0,<3.0.0"
-
-[package.extras]
-dev = ["bumpversion (>=0.5.3,<1.0.0)", "eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pysha3] (>=0.1.4,<1.0.0)", "flake8 (>=3.5.0,<4.0.0)", "py-evm (==0.5.0a2)", "pytest (>=6.2.5,<7)", "pytest-xdist (>=2.0.0,<3)", "towncrier (==18.5.0)", "tox (>=2.9.1,<3.0.0)", "wheel (>=0.30.0,<1.0.0)"]
-docs = ["towncrier (==18.5.0)"]
-lint = ["flake8 (>=3.5.0,<4.0.0)"]
-py-evm = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pysha3] (>=0.1.4,<1.0.0)", "py-evm (==0.5.0a2)"]
-pyevm = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "eth-hash[pysha3] (>=0.1.4,<1.0.0)", "py-evm (==0.5.0a2)"]
-test = ["eth-hash[pycryptodome] (>=0.1.4,<1.0.0)", "pytest (>=6.2.5,<7)", "pytest-xdist (>=2.0.0,<3)"]
+test = ["eth-hash[pycryptodome]", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"]
 
 [[package]]
 name = "eth-typing"
-version = "3.2.0"
+version = "2.3.0"
 description = "eth-typing: Common type annotations for ethereum python packages"
 category = "main"
 optional = false
-python-versions = ">=3.6, <4"
+python-versions = ">=3.5, <4"
 files = [
-    {file = "eth-typing-3.2.0.tar.gz", hash = "sha256:177e2070da9bf557fe0fd46ee467a7be2d0b6476aa4dc18680603e7da1fc5690"},
-    {file = "eth_typing-3.2.0-py3-none-any.whl", hash = "sha256:2d7540c1c65c0e686c1dc357b8376a53caf4e1693724a90191ad133be568841d"},
+    {file = "eth-typing-2.3.0.tar.gz", hash = "sha256:39cce97f401f082739b19258dfa3355101c64390914c73fe2b90012f443e0dc7"},
+    {file = "eth_typing-2.3.0-py3-none-any.whl", hash = "sha256:b7fa58635c1cb0cbf538b2f5f1e66139575ea4853eac1d6000f0961a4b277422"},
 ]
 
 [package.extras]
-dev = ["bumpversion (>=0.5.3,<1)", "flake8 (==3.8.3)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx (>=4.2.0,<5)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=21,<22)", "tox (>=2.9.1,<3)", "twine", "wheel"]
-doc = ["sphinx (>=4.2.0,<5)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=21,<22)"]
+dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.8.3)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)", "pytest (>=4.4,<4.5)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"]
+doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"]
 lint = ["flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)"]
-test = ["pytest (>=6.2.5,<7)", "pytest-xdist", "tox (>=2.9.1,<3)"]
+test = ["pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)"]
 
 [[package]]
 name = "eth-utils"
-version = "2.1.0"
-description = "eth-utils: Common utility functions for python code that interacts with Ethereum"
+version = "1.9.5"
+description = "Common utility functions for ethereum codebases."
 category = "main"
 optional = false
-python-versions = ">=3.7,<4"
+python-versions = ">=3.5,!=3.5.2,<4"
 files = [
-    {file = "eth-utils-2.1.0.tar.gz", hash = "sha256:fcb4c3c1b32947ba92970963f9aaf40da73b04ea1034964ff8c0e70595127138"},
-    {file = "eth_utils-2.1.0-py3-none-any.whl", hash = "sha256:63901e54ec9e4ac16ae0a0d28e1dc48b968c20184d22f2727e5f3ca24b6250bc"},
+    {file = "eth-utils-1.9.5.tar.gz", hash = "sha256:ac168aaa241fa0665e758b04009259d1b2b35daa0615fc563aad29f9ffc64d56"},
+    {file = "eth_utils-1.9.5-py3-none-any.whl", hash = "sha256:11597842b0148c39d2638ad55897f9243479a8369be713b238b0684f8750215e"},
 ]
 
 [package.dependencies]
-cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""}
-eth-hash = ">=0.3.1"
-eth-typing = ">=3.0.0"
-toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""}
+cytoolz = {version = ">=0.10.1,<1.0.0", markers = "implementation_name == \"cpython\""}
+eth-hash = ">=0.1.0,<1.0.0"
+eth-typing = ">=2.2.1,<3.0.0"
+toolz = {version = ">0.8.2,<1", markers = "implementation_name == \"pypy\""}
 
 [package.extras]
-dev = ["Sphinx (>=1.6.5,<2)", "black (>=22)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.7.9)", "hypothesis (>=4.43.0,<5.0.0)", "ipython", "isort (>=4.2.15,<5)", "jinja2 (>=3.0.0,<3.0.1)", "mypy (==0.910)", "pydocstyle (>=5.0.0,<6)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=21,<22)", "tox (==3.14.6)", "twine (>=1.13,<2)", "types-setuptools", "wheel (>=0.30.0,<1.0.0)"]
-doc = ["Sphinx (>=1.6.5,<2)", "jinja2 (>=3.0.0,<3.0.1)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=21,<22)"]
-lint = ["black (>=22)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.910)", "pydocstyle (>=5.0.0,<6)", "pytest (>=6.2.5,<7)", "types-setuptools"]
-test = ["hypothesis (>=4.43.0,<5.0.0)", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox (==3.14.6)", "types-setuptools"]
+deploy = ["bumpversion (>=0.5.3,<1.0.0)", "tox (>=2.9.1,<3.0.0)", "wheel (>=0.30.0,<1.0.0)"]
+dev = ["Sphinx (>=1.5.5,<2)", "black (>=18.6b4,<19)", "bumpversion (>=0.5.3,<1.0.0)", "flake8 (>=3.7.0,<4.0.0)", "hypothesis (>=4.43.0,<5.0.0)", "isort (==4.3.18)", "mypy (==0.720)", "pytest (>=3.4.1,<4.0.0)", "pytest-pythonpath (>=0.3,<1.0)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)", "tox (>=2.9.1,<3.0.0)", "twine (>=1.13,<2)", "wheel (>=0.30.0,<1.0.0)"]
+doc = ["Sphinx (>=1.5.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"]
+lint = ["black (>=18.6b4,<19)", "flake8 (>=3.7.0,<4.0.0)", "isort (==4.3.18)", "mypy (==0.720)", "pytest (>=3.4.1,<4.0.0)"]
+test = ["hypothesis (>=4.43.0,<5.0.0)", "pytest (>=3.4.1,<4.0.0)", "pytest-pythonpath (>=0.3,<1.0)"]
 
 [[package]]
 name = "exceptiongroup"
@@ -1143,25 +1158,6 @@ files = [
     {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
 ]
 
-[[package]]
-name = "importlib-resources"
-version = "5.12.0"
-description = "Read resources from Python packages"
-category = "main"
-optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"},
-    {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"},
-]
-
-[package.dependencies]
-zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
-
 [[package]]
 name = "iniconfig"
 version = "2.0.0"
@@ -1252,8 +1248,6 @@ files = [
 
 [package.dependencies]
 attrs = ">=17.4.0"
-importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""}
-pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""}
 pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2"
 
 [package.extras]
@@ -1769,18 +1763,6 @@ files = [
 graphviz = ["graphviz (>=0.20.1)"]
 test = ["covdefaults (>=2.2.2)", "diff-cover (>=7.4)", "pip (>=23)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.17.1,<21)"]
 
-[[package]]
-name = "pkgutil_resolve_name"
-version = "1.3.10"
-description = "Resolve a name to an object."
-category = "main"
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"},
-    {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"},
-]
-
 [[package]]
 name = "platformdirs"
 version = "3.0.0"
@@ -1830,34 +1812,37 @@ twisted = ["twisted"]
 
 [[package]]
 name = "protobuf"
-version = "3.20.3"
+version = "3.19.5"
 description = "Protocol Buffers"
 category = "main"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.5"
 files = [
-    {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"},
-    {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"},
-    {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"},
-    {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"},
-    {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"},
-    {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"},
-    {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"},
-    {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"},
-    {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"},
-    {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"},
-    {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"},
-    {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"},
-    {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"},
-    {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"},
-    {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"},
-    {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"},
-    {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"},
-    {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"},
-    {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"},
-    {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"},
-    {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"},
-    {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"},
+    {file = "protobuf-3.19.5-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2b599a21c9a32e171ec29a2ac54e03297736c578698e11b099d031f79da114b"},
+    {file = "protobuf-3.19.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f976234e20ab2785f54224bcdafa027674e23663b132fa3ca0caa291a6cfbde7"},
+    {file = "protobuf-3.19.5-cp310-cp310-win32.whl", hash = "sha256:4ee2af7051d3b10c8a4fe6fd1a2c69f201fea36aeee7086cf202a692e1b99ee1"},
+    {file = "protobuf-3.19.5-cp310-cp310-win_amd64.whl", hash = "sha256:dca2284378a5f2a86ffed35c6ac147d14c48b525eefcd1083e5a9ce28dfa8657"},
+    {file = "protobuf-3.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0f80876a8ff0ae7064084ed094eb86497bd5a3812e6fc96a05318b92301674e"},
+    {file = "protobuf-3.19.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c4160b601220627f7e91154e572baf5e161a9c3f445a8242d536ee3d0b7b17c"},
+    {file = "protobuf-3.19.5-cp36-cp36m-win32.whl", hash = "sha256:f2bde37667b18c2b5280df83bc799204394a5d2d774e4deaf9de0eb741df6833"},
+    {file = "protobuf-3.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:1867f93b06a183f87696871bb8d1e99ee71dbb69d468ce1f0cc8bf3d30f982f3"},
+    {file = "protobuf-3.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a89aa0c042e61e11ade320b802d6db4ee5391d8d973e46d3a48172c1597789f8"},
+    {file = "protobuf-3.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f9cebda093c2f6bfed88f1c17cdade09d4d96096421b344026feee236532d4de"},
+    {file = "protobuf-3.19.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67efb5d20618020aa9596e17bfc37ca068c28ec0c1507d9507f73c93d46c9855"},
+    {file = "protobuf-3.19.5-cp37-cp37m-win32.whl", hash = "sha256:950abd6c00e7b51f87ae8b18a0ce4d69fea217f62f171426e77de5061f6d9850"},
+    {file = "protobuf-3.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d3973a2d58aefc7d1230725c2447ce7f86a71cbc094b86a77c6ee1505ac7cdb1"},
+    {file = "protobuf-3.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e1d74032f56ff25f417cfe84c8147047732e5059137ca42efad20cbbd25f5e0"},
+    {file = "protobuf-3.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d249519ba5ecf5dd6b18150c9b6bcde510b273714b696f3923ff8308fc11ae49"},
+    {file = "protobuf-3.19.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f957ef53e872d58a0afd3bf6d80d48535d28c99b40e75e6634cbc33ea42fd54"},
+    {file = "protobuf-3.19.5-cp38-cp38-win32.whl", hash = "sha256:5470f892961af464ae6eaf0f3099e2c1190ae8c7f36f174b89491281341f79ca"},
+    {file = "protobuf-3.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:c44e3282cff74ad18c7e8a0375f407f69ee50c2116364b44492a196293e08b21"},
+    {file = "protobuf-3.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:66d14b5b90090353efe75c9fb1bf65ef7267383034688d255b500822e37d5c2f"},
+    {file = "protobuf-3.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f4f909f4dde413dec435a44b0894956d55bb928ded7d6e3c726556ca4c796e84"},
+    {file = "protobuf-3.19.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5266c36cc0af3bb3dbf44f199d225b33da66a9a5c3bdc2b14865ad10eddf0e37"},
+    {file = "protobuf-3.19.5-cp39-cp39-win32.whl", hash = "sha256:6a02172b9650f819d01fb8e224fc69b0706458fc1ab4f1c669281243c71c1a5e"},
+    {file = "protobuf-3.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:696e6cfab94cc15a14946f2bf72719dced087d437adbd994fff34f38986628bc"},
+    {file = "protobuf-3.19.5-py2.py3-none-any.whl", hash = "sha256:9e42b1cf2ecd8a1bd161239e693f22035ba99905ae6d7efeac8a0546c7ec1a27"},
+    {file = "protobuf-3.19.5.tar.gz", hash = "sha256:e63b0b3c42e51c94add62b010366cd4979cb6d5f06158bcae8faac4c294f91e1"},
 ]
 
 [[package]]
@@ -1899,83 +1884,6 @@ files = [
     {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
 ]
 
-[[package]]
-name = "py-ecc"
-version = "6.0.0"
-description = "Elliptic curve crypto in python including secp256k1 and alt_bn128"
-category = "dev"
-optional = false
-python-versions = ">=3.6, <4"
-files = [
-    {file = "py_ecc-6.0.0-py3-none-any.whl", hash = "sha256:54e8aa4c30374fa62d582c599a99f352c153f2971352171318bd6910a643be0b"},
-    {file = "py_ecc-6.0.0.tar.gz", hash = "sha256:3fc8a79e38975e05dc443d25783fd69212a1ca854cc0efef071301a8f7d6ce1d"},
-]
-
-[package.dependencies]
-cached-property = ">=1.5.1,<2"
-eth-typing = ">=3.0.0,<4"
-eth-utils = ">=2.0.0,<3"
-mypy-extensions = ">=0.4.1"
-
-[package.extras]
-dev = ["bumpversion (>=0.5.3,<1)", "flake8 (==3.5.0)", "mypy (==0.641)", "mypy-extensions (>=0.4.1)", "pytest (==6.2.5)", "pytest-xdist (==1.26.0)", "twine"]
-lint = ["flake8 (==3.5.0)", "mypy (==0.641)", "mypy-extensions (>=0.4.1)"]
-test = ["pytest (==6.2.5)", "pytest-xdist (==1.26.0)"]
-
-[[package]]
-name = "py-evm"
-version = "0.5.0a2"
-description = "Python implementation of the Ethereum Virtual Machine"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "py-evm-0.5.0a2.tar.gz", hash = "sha256:24cb996fa027c0fad96d11776299c804a7b2a5affd4538e623129dc3a3ba26df"},
-    {file = "py_evm-0.5.0a2-py3-none-any.whl", hash = "sha256:f3ebb61def9386f88b9bf1788bddfa898a4507e0cd3a8f5cd2ebdd1d016eb99f"},
-]
-
-[package.dependencies]
-cached-property = ">=1.5.1,<2"
-eth-bloom = ">=1.0.3,<2.0.0"
-eth-keys = ">=0.4.0,<0.5.0"
-eth-typing = ">=3.0.0,<4.0.0"
-eth-utils = ">=2.0.0,<3.0.0"
-lru-dict = ">=1.1.6"
-mypy-extensions = ">=0.4.1,<1.0.0"
-py-ecc = ">=1.4.7,<7.0.0"
-pyethash = ">=0.1.27,<1.0.0"
-rlp = ">=3,<4"
-trie = ">=2.0.0,<3"
-
-[package.extras]
-benchmark = ["termcolor (>=1.1.0,<2.0.0)", "web3 (>=4.1.0,<5.0.0)"]
-dev = ["Sphinx (>=1.5.5,<1.8.0)", "bumpversion (>=0.5.3,<1)", "cached-property (>=1.5.1,<2)", "eth-bloom (>=1.0.3,<2.0.0)", "eth-keys (>=0.4.0,<0.5.0)", "eth-typing (>=3.0.0,<4.0.0)", "eth-utils (>=2.0.0,<3.0.0)", "factory-boy (==2.11.1)", "flake8 (==3.8.2)", "flake8-bugbear (==20.1.4)", "hypothesis (>=5,<6)", "idna (==2.7)", "lru-dict (>=1.1.6)", "mypy (==0.782)", "mypy-extensions (>=0.4.1,<1.0.0)", "pexpect (>=4.6,<5)", "py-ecc (>=1.4.7,<7.0.0)", "py-evm (>=0.2.0-alpha.14)", "pyethash (>=0.1.27,<1.0.0)", "pysha3 (>=1.0.0,<2.0.0)", "pytest (>=6.2.4,<7)", "pytest-asyncio (>=0.10.0,<0.11)", "pytest-cov (==2.5.1)", "pytest-timeout (>=1.4.2,<2)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist (==2.3.0)", "requests (>=2.20,<3)", "rlp (>=3,<4)", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "sphinxcontrib-asyncio (>=0.2.0,<0.3)", "towncrier (>=19.2.0,<20)", "tox (==2.7.0)", "trie (>=2.0.0,<3)", "twine", "wheel"]
-doc = ["Sphinx (>=1.5.5,<1.8.0)", "py-evm (>=0.2.0-alpha.14)", "pysha3 (>=1.0.0,<2.0.0)", "sphinx-rtd-theme (>=0.1.9)", "sphinxcontrib-asyncio (>=0.2.0,<0.3)", "towncrier (>=19.2.0,<20)"]
-eth = ["cached-property (>=1.5.1,<2)", "eth-bloom (>=1.0.3,<2.0.0)", "eth-keys (>=0.4.0,<0.5.0)", "eth-typing (>=3.0.0,<4.0.0)", "eth-utils (>=2.0.0,<3.0.0)", "lru-dict (>=1.1.6)", "mypy-extensions (>=0.4.1,<1.0.0)", "py-ecc (>=1.4.7,<7.0.0)", "pyethash (>=0.1.27,<1.0.0)", "rlp (>=3,<4)", "trie (>=2.0.0,<3)"]
-eth-extra = ["blake2b-py (>=0.1.4,<0.2)", "coincurve (>=13.0.0,<14.0.0)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "plyvel (>=1.2.0,<2)"]
-lint = ["flake8 (==3.8.2)", "flake8-bugbear (==20.1.4)", "mypy (==0.782)"]
-test = ["factory-boy (==2.11.1)", "hypothesis (>=5,<6)", "pexpect (>=4.6,<5)", "pytest (>=6.2.4,<7)", "pytest-asyncio (>=0.10.0,<0.11)", "pytest-cov (==2.5.1)", "pytest-timeout (>=1.4.2,<2)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist (==2.3.0)"]
-
-[[package]]
-name = "py-geth"
-version = "3.10.0"
-description = "Run Go-Ethereum as a subprocess"
-category = "dev"
-optional = false
-python-versions = ">=3"
-files = [
-    {file = "py-geth-3.10.0.tar.gz", hash = "sha256:a0c5871c50d1ff2699567e77f961ab54b43007288ddf415c950f945d28b25212"},
-    {file = "py_geth-3.10.0-py3-none-any.whl", hash = "sha256:745e3e9a153014a51889297bca96f452fe38ce41434a97d1a8cf1ecc38275619"},
-]
-
-[package.dependencies]
-semantic-version = ">=2.6.0"
-
-[package.extras]
-dev = ["bumpversion (>=0.5.3,<1)", "flake8 (>=3.9.2,<4)", "flaky (>=3.2.0,<4)", "importlib-metadata (<5)", "pluggy (>=0.7.1,<1)", "pytest (>=6.2.5,<8)", "requests (>=2.20,<3)", "setuptools (>=38.6.0)", "tox (>=2.7.0)", "twine", "wheel"]
-lint = ["flake8 (>=3.9.2,<4)", "importlib-metadata (<5)"]
-test = ["flaky (>=3.2.0,<4)", "pluggy (>=0.7.1,<1)", "pytest (>=6.2.5,<8)"]
-
 [[package]]
 name = "pycryptodome"
 version = "3.17"
@@ -2019,17 +1927,6 @@ files = [
     {file = "pycryptodome-3.17.tar.gz", hash = "sha256:bce2e2d8e82fcf972005652371a3e8731956a0c1fbb719cc897943b3695ad91b"},
 ]
 
-[[package]]
-name = "pyethash"
-version = "0.1.27"
-description = "Python wrappers for ethash, the ethereum proof of workhashing function"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "pyethash-0.1.27.tar.gz", hash = "sha256:ff66319ce26b9d77df1f610942634dac9742e216f2c27b051c0a2c2dec9c2818"},
-]
-
 [[package]]
 name = "pylint"
 version = "2.12.2"
@@ -2103,37 +2000,6 @@ files = [
     {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"},
 ]
 
-[[package]]
-name = "pysha3"
-version = "1.0.2"
-description = "SHA-3 (Keccak) for Python 2.7 - 3.5"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9"},
-    {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf"},
-    {file = "pysha3-1.0.2-cp27-cp27m-win32.whl", hash = "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b"},
-    {file = "pysha3-1.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d"},
-    {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5"},
-    {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f"},
-    {file = "pysha3-1.0.2-cp33-cp33m-win32.whl", hash = "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603"},
-    {file = "pysha3-1.0.2-cp33-cp33m-win_amd64.whl", hash = "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24"},
-    {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48"},
-    {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f"},
-    {file = "pysha3-1.0.2-cp34-cp34m-win32.whl", hash = "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608"},
-    {file = "pysha3-1.0.2-cp34-cp34m-win_amd64.whl", hash = "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07"},
-    {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d"},
-    {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9"},
-    {file = "pysha3-1.0.2-cp35-cp35m-win32.whl", hash = "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8"},
-    {file = "pysha3-1.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77"},
-    {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4"},
-    {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030"},
-    {file = "pysha3-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef"},
-    {file = "pysha3-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0"},
-    {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"},
-]
-
 [[package]]
 name = "pytest"
 version = "7.2.1"
@@ -2313,41 +2179,25 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
 
 [[package]]
 name = "rlp"
-version = "3.0.0"
+version = "2.0.1"
 description = "A package for Recursive Length Prefix encoding and decoding"
 category = "main"
 optional = false
 python-versions = "*"
 files = [
-    {file = "rlp-3.0.0-py2.py3-none-any.whl", hash = "sha256:d2a963225b3f26795c5b52310e0871df9824af56823d739511583ef459895a7d"},
-    {file = "rlp-3.0.0.tar.gz", hash = "sha256:63b0465d2948cd9f01de449d7adfb92d207c1aef3982f20310f8009be4a507e8"},
+    {file = "rlp-2.0.1-py2.py3-none-any.whl", hash = "sha256:52a57c9f53f03c88b189283734b397314288250cc4a3c4113e9e36e2ac6bdd16"},
+    {file = "rlp-2.0.1.tar.gz", hash = "sha256:665e8312750b3fc5f7002e656d05b9dcb6e93b6063df40d95c49ad90c19d1f0e"},
 ]
 
 [package.dependencies]
-eth-utils = ">=2.0.0,<3"
+eth-utils = ">=1.0.2,<2"
 
 [package.extras]
-dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"]
+dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest (==5.4.3)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"]
 doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"]
 lint = ["flake8 (==3.4.1)"]
-rust-backend = ["rusty-rlp (>=0.2.1,<0.3)"]
-test = ["hypothesis (==5.19.0)", "pytest (>=6.2.5,<7)", "tox (>=2.9.1,<3)"]
-
-[[package]]
-name = "semantic-version"
-version = "2.10.0"
-description = "A library implementing the 'SemVer' scheme."
-category = "dev"
-optional = false
-python-versions = ">=2.7"
-files = [
-    {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
-    {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
-]
-
-[package.extras]
-dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"]
-doc = ["Sphinx", "sphinx-rtd-theme"]
+rust-backend = ["rusty-rlp (>=0.1.15,<0.2)"]
+test = ["hypothesis (==5.19.0)", "pytest (==5.4.3)", "tox (>=2.9.1,<3)"]
 
 [[package]]
 name = "setuptools"
@@ -2378,18 +2228,6 @@ files = [
     {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
 ]
 
-[[package]]
-name = "sortedcontainers"
-version = "2.4.0"
-description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"},
-    {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"},
-]
-
 [[package]]
 name = "sympy"
 version = "1.11.1"
@@ -2441,30 +2279,6 @@ files = [
     {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"},
 ]
 
-[[package]]
-name = "trie"
-version = "2.1.0"
-description = "Python implementation of the Ethereum Trie structure"
-category = "dev"
-optional = false
-python-versions = ">=3.7,<4"
-files = [
-    {file = "trie-2.1.0-py3-none-any.whl", hash = "sha256:e3f3691e1d48006b466c9b4cd0ee586c32e0f54d13b2497f263688188c77b0fe"},
-    {file = "trie-2.1.0.tar.gz", hash = "sha256:0729a159ddef4bfa4c05478017b93a7a1af4e65e8a7b7628676bad13199ffe39"},
-]
-
-[package.dependencies]
-eth-hash = ">=0.1.0,<1.0.0"
-eth-utils = ">=2.0.0,<3.0.0"
-hexbytes = ">=0.2.0"
-rlp = ">=3,<4"
-sortedcontainers = ">=2.1.0,<3"
-
-[package.extras]
-dev = ["black (>=22)", "bumpversion (>=0.5.3,<1)", "eth-hash (>=0.1.0,<1.0.0)", "flake8 (==5.0.4)", "hypothesis (>=6.56.4,<7)", "isort (>=5.10.1)", "pycryptodome", "pytest (>=6.2.5)", "pytest-xdist (>=2.4.0,<3)", "tox (==3.14.6)", "twine", "wheel"]
-lint = ["black (>=22)", "flake8 (==5.0.4)", "isort (>=5.10.1)"]
-test = ["hypothesis (>=6.56.4,<7)", "pycryptodome", "pytest (>=6.2.5)", "pytest-xdist (>=2.4.0,<3)", "tox (==3.14.6)"]
-
 [[package]]
 name = "typeguard"
 version = "2.13.3"
@@ -2539,117 +2353,80 @@ files = [
 
 [[package]]
 name = "web3"
-version = "6.0.0b4"
+version = "5.31.4"
 description = "Web3.py"
 category = "main"
 optional = false
-python-versions = ">=3.7.2,<3.11"
+python-versions = ">=3.6,<4"
 files = [
-    {file = "web3-6.0.0b4-py3-none-any.whl", hash = "sha256:b310e0de9532e0f2886bf10cfc28b49509213db39ad50484af7fe0e0904c0819"},
-    {file = "web3-6.0.0b4.tar.gz", hash = "sha256:17f3885bc6466186a69e47ec9690ea6a077dea8361ea96b42c67021d1b543962"},
+    {file = "web3-5.31.4-py3-none-any.whl", hash = "sha256:75d4a2325b1e0fa69baccb4e9b5c5d701ca0bf85411d549e193db82b61e91e3d"},
+    {file = "web3-5.31.4.tar.gz", hash = "sha256:f763d339dd63f922920c8a53cb46e8ee47d9ea7efaba9b8cf006956661d874d0"},
 ]
 
 [package.dependencies]
 aiohttp = ">=3.7.4.post0,<4"
-eth-abi = ">=3.0.0,<4.0.0"
-eth-account = ">=0.6.0,<0.7.0"
+eth-abi = ">=2.2.0,<3.0.0"
+eth-account = ">=0.5.9,<0.6.0"
 eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]}
-eth-tester = {version = "v0.6.0-beta.5", extras = ["py-evm"], optional = true, markers = "extra == \"tester\""}
-eth-typing = ">=3.0.0,<4.0.0"
-eth-utils = ">=2.0.0,<3.0.0"
+eth-rlp = "<0.3"
+eth-typing = ">=2.0.0,<3.0.0"
+eth-utils = ">=1.9.5,<2.0.0"
 hexbytes = ">=0.1.0,<1.0.0"
 ipfshttpclient = "0.8.0a2"
-jsonschema = ">=4.0.0,<5"
+jsonschema = ">=3.2.0,<5"
 lru-dict = ">=1.1.6,<2.0.0"
-protobuf = ">=3.10.0,<4"
-py-geth = {version = ">=3.8.0,<4", optional = true, markers = "extra == \"tester\""}
+protobuf = "3.19.5"
 pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""}
 requests = ">=2.16.0,<3.0.0"
-websockets = ">=10.0.0,<11"
+websockets = ">=9.1,<10"
 
 [package.extras]
-dev = ["black (>=22.1.0,<23.0)", "bumpversion", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "eth-tester[py-evm] (==v0.6.0-beta.5)", "flake8 (==3.8.3)", "flaky (>=3.7.0,<4)", "hypothesis (>=3.31.2,<6)", "isort (>=4.2.15,<4.3.5)", "mock", "mypy (==0.910)", "pluggy (==0.13.1)", "py-geth (>=3.8.0,<4)", "py-solc (>=0.4.0)", "pytest (>=6.2.5,<7)", "pytest-asyncio (>=0.18.1,<0.19)", "pytest-mock (>=1.10,<2)", "pytest-pythonpath (>=0.3)", "pytest-watch (>=4.2,<5)", "pytest-xdist (>=1.29,<2)", "setuptools (>=38.6.0)", "sphinx (>=4.2.0,<5)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "tox (>=1.8.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)", "urllib3", "wheel", "when-changed (>=0.3.0,<0.4)"]
-docs = ["click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "mock", "py-geth (>=3.8.0,<4)", "py-solc (>=0.4.0)", "pytest (>=6.2.5,<7)", "sphinx (>=4.2.0,<5)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "urllib3", "wheel"]
-linter = ["black (>=22.1.0,<23.0)", "flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.910)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)"]
-tester = ["eth-tester[py-evm] (==v0.6.0-beta.5)", "py-geth (>=3.8.0,<4)"]
+dev = ["Jinja2 (<=3.0.3)", "bumpversion", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "eth-tester[py-evm] (==v0.6.0-b.7)", "flake8 (==3.8.3)", "flaky (>=3.7.0,<4)", "hypothesis (>=3.31.2,<6)", "importlib-metadata (<5.0)", "isort (>=4.2.15,<4.3.5)", "mock", "mypy (==0.910)", "pluggy (==0.13.1)", "py-geth (>=3.9.1,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "pytest-asyncio (>=0.10.0,<0.11)", "pytest-mock (>=1.10,<2)", "pytest-pythonpath (>=0.3)", "pytest-watch (>=4.2,<5)", "pytest-xdist (>=1.29,<2)", "setuptools (>=38.6.0)", "sphinx (>=3.0,<4)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "tox (>=3.18.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)", "urllib3", "wheel", "when-changed (>=0.3.0,<0.4)"]
+docs = ["Jinja2 (<=3.0.3)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "mock", "py-geth (>=3.9.1,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "urllib3", "wheel"]
+linter = ["flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.910)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)"]
+tester = ["eth-tester[py-evm] (==v0.6.0-b.7)", "py-geth (>=3.9.1,<4)"]
 
 [[package]]
 name = "websockets"
-version = "10.4"
+version = "9.1"
 description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
 category = "main"
 optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"},
-    {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"},
-    {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"},
-    {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"},
-    {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"},
-    {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"},
-    {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"},
-    {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"},
-    {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"},
-    {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"},
-    {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"},
-    {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"},
-    {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"},
-    {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"},
-    {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"},
-    {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"},
-    {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"},
-    {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"},
-    {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"},
-    {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"},
-    {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"},
-    {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"},
-    {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"},
-    {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"},
-    {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"},
-    {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"},
-    {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"},
-    {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"},
-    {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"},
-    {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"},
-    {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"},
-    {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"},
-    {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"},
-    {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"},
-    {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"},
-    {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"},
-    {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"},
-    {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"},
-    {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"},
-    {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"},
-    {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"},
-    {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"},
-    {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"},
-    {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"},
-    {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"},
-    {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"},
-    {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"},
-    {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"},
-    {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"},
-    {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"},
-    {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"},
-    {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"},
-    {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"},
-    {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"},
-    {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"},
-    {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"},
-    {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"},
-    {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"},
-    {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"},
-    {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"},
-    {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"},
-    {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"},
-    {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"},
-    {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"},
-    {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"},
-    {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"},
-    {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"},
-    {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"},
-    {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"},
+python-versions = ">=3.6.1"
+files = [
+    {file = "websockets-9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d144b350045c53c8ff09aa1cfa955012dd32f00c7e0862c199edcabb1a8b32da"},
+    {file = "websockets-9.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b4ad84b156cf50529b8ac5cc1638c2cf8680490e3fccb6121316c8c02620a2e4"},
+    {file = "websockets-9.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2cf04601633a4ec176b9cc3d3e73789c037641001dbfaf7c411f89cd3e04fcaf"},
+    {file = "websockets-9.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5c8f0d82ea2468282e08b0cf5307f3ad022290ed50c45d5cb7767957ca782880"},
+    {file = "websockets-9.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:caa68c95bc1776d3521f81eeb4d5b9438be92514ec2a79fececda814099c8314"},
+    {file = "websockets-9.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d2c2d9b24d3c65b5a02cac12cbb4e4194e590314519ed49db2f67ef561c3cf58"},
+    {file = "websockets-9.1-cp36-cp36m-win32.whl", hash = "sha256:f31722f1c033c198aa4a39a01905951c00bd1c74f922e8afc1b1c62adbcdd56a"},
+    {file = "websockets-9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:3ddff38894c7857c476feb3538dd847514379d6dc844961dc99f04b0384b1b1b"},
+    {file = "websockets-9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:51d04df04ed9d08077d10ccbe21e6805791b78eac49d16d30a1f1fe2e44ba0af"},
+    {file = "websockets-9.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f68c352a68e5fdf1e97288d5cec9296664c590c25932a8476224124aaf90dbcd"},
+    {file = "websockets-9.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b43b13e5622c5a53ab12f3272e6f42f1ce37cd5b6684b2676cb365403295cd40"},
+    {file = "websockets-9.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9147868bb0cc01e6846606cd65cbf9c58598f187b96d14dd1ca17338b08793bb"},
+    {file = "websockets-9.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:836d14eb53b500fd92bd5db2fc5894f7c72b634f9c2a28f546f75967503d8e25"},
+    {file = "websockets-9.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:48c222feb3ced18f3dc61168ca18952a22fb88e5eb8902d2bf1b50faefdc34a2"},
+    {file = "websockets-9.1-cp37-cp37m-win32.whl", hash = "sha256:900589e19200be76dd7cbaa95e9771605b5ce3f62512d039fb3bc5da9014912a"},
+    {file = "websockets-9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ab5ee15d3462198c794c49ccd31773d8a2b8c17d622aa184f669d2b98c2f0857"},
+    {file = "websockets-9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85e701a6c316b7067f1e8675c638036a796fe5116783a4c932e7eb8e305a3ffe"},
+    {file = "websockets-9.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b2e71c4670ebe1067fa8632f0d081e47254ee2d3d409de54168b43b0ba9147e0"},
+    {file = "websockets-9.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:230a3506df6b5f446fed2398e58dcaafdff12d67fe1397dff196411a9e820d02"},
+    {file = "websockets-9.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:7df3596838b2a0c07c6f6d67752c53859a54993d4f062689fdf547cb56d0f84f"},
+    {file = "websockets-9.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:826ccf85d4514609219725ba4a7abd569228c2c9f1968e8be05be366f68291ec"},
+    {file = "websockets-9.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0dd4eb8e0bbf365d6f652711ce21b8fd2b596f873d32aabb0fbb53ec604418cc"},
+    {file = "websockets-9.1-cp38-cp38-win32.whl", hash = "sha256:1d0971cc7251aeff955aa742ec541ee8aaea4bb2ebf0245748fbec62f744a37e"},
+    {file = "websockets-9.1-cp38-cp38-win_amd64.whl", hash = "sha256:7189e51955f9268b2bdd6cc537e0faa06f8fffda7fb386e5922c6391de51b077"},
+    {file = "websockets-9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9e5fd6dbdf95d99bc03732ded1fc8ef22ebbc05999ac7e0c7bf57fe6e4e5ae2"},
+    {file = "websockets-9.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9e7fdc775fe7403dbd8bc883ba59576a6232eac96dacb56512daacf7af5d618d"},
+    {file = "websockets-9.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:597c28f3aa7a09e8c070a86b03107094ee5cdafcc0d55f2f2eac92faac8dc67d"},
+    {file = "websockets-9.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:ad893d889bc700a5835e0a95a3e4f2c39e91577ab232a3dc03c262a0f8fc4b5c"},
+    {file = "websockets-9.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:1d6b4fddb12ab9adf87b843cd4316c4bd602db8d5efd2fb83147f0458fe85135"},
+    {file = "websockets-9.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ebf459a1c069f9866d8569439c06193c586e72c9330db1390af7c6a0a32c4afd"},
+    {file = "websockets-9.1-cp39-cp39-win32.whl", hash = "sha256:be5fd35e99970518547edc906efab29afd392319f020c3c58b0e1a158e16ed20"},
+    {file = "websockets-9.1-cp39-cp39-win_amd64.whl", hash = "sha256:85db8090ba94e22d964498a47fdd933b8875a1add6ebc514c7ac8703eb97bbf0"},
+    {file = "websockets-9.1.tar.gz", hash = "sha256:276d2339ebf0df4f45df453923ebd2270b87900eda5dfd4a6b0cfa15f82111c3"},
 ]
 
 [[package]]
@@ -2816,23 +2593,7 @@ files = [
 idna = ">=2.0"
 multidict = ">=4.0"
 
-[[package]]
-name = "zipp"
-version = "3.14.0"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
-optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "zipp-3.14.0-py3-none-any.whl", hash = "sha256:188834565033387710d046e3fe96acfc9b5e86cbca7f39ff69cf21a4128198b7"},
-    {file = "zipp-3.14.0.tar.gz", hash = "sha256:9e5421e176ef5ab4c0ad896624e87a7b2f07aca746c9b2aa305952800cb8eecb"},
-]
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
-
 [metadata]
 lock-version = "2.0"
-python-versions = ">=3.8,<3.10"
-content-hash = "d51781c3af05c1d43f6cd43da86c3a4911b6167d5df6935484b9830e14fd0019"
+python-versions = ">=3.9,<3.10"
+content-hash = "c0523bd4f4b5b64de3ed0ab2c0cff3b7a08bbe96ab8fdd246378facdca85bd5d"
diff --git a/pyproject.toml b/pyproject.toml
index c697f4cb4..8cfbce23e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -11,10 +11,10 @@ homepage = "https://github.com/Shard-Labs/starknet-devnet"
 keywords = ["starknet", "cairo", "testnet", "local", "server"]
 
 [tool.poetry.dependencies]
-python = ">=3.8,<3.10"
+python = ">=3.9,<3.10"
 Flask = {extras = ["async"], version = "~2.0.3"}
 flask-cors = "~3.0.10"
-cairo-lang = "0.10.3"
+cairo-lang = "0.11.0.1"
 Werkzeug = "~2.0.3"
 cloudpickle = "~2.1.0"
 crypto-cpp-py = "~1.2.0"
@@ -23,6 +23,7 @@ typing-extensions = "~4.3.0"
 gunicorn = "~20.1.0"
 marshmallow-dataclass = "~8.4"
 jsonschema = "~4.17.0"
+web3 = "~5.31.4"
 
 [tool.poetry.group.dev.dependencies]
 pylint = "~2.12.2"
@@ -32,7 +33,6 @@ pylint-quotes = "~0.2.3"
 black = "~22.6"
 requests = "~2.28"
 isort = "^5.10.1"
-web3 = {version = "6.0.0b4", extras = ["ipfs", "tester"]}
 
 [tool.poetry.group.vm.dependencies]
 cairo-rs-py = "~0.1.1"
diff --git a/scripts/compile_cairo1.sh b/scripts/compile_cairo1.sh
new file mode 100755
index 000000000..4b5d759c1
--- /dev/null
+++ b/scripts/compile_cairo1.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+set -eu
+
+ARTIFACTS_DIRECTORY="test/artifacts/contracts/cairo1"
+
+# recreate artifacts directory
+rm -rf "$ARTIFACTS_DIRECTORY"
+mkdir -p "$ARTIFACTS_DIRECTORY"
+
+compiler_version=$(
+    cargo run \
+        --manifest-path "$CAIRO_1_COMPILER_MANIFEST" \
+        --bin starknet-sierra-compile \
+        -- --version
+)
+echo "Compiling Cairo 1 contracts with $compiler_version"
+
+number_of_contracts=0
+for contract in "test/contracts/cairo1"/*.cairo; do
+    basename=$(basename "$contract")
+
+    # create contract artifact directory
+    directory="$ARTIFACTS_DIRECTORY/${basename}"
+    mkdir -p "$directory"
+
+    without_extension="${basename%.*}"
+    sierra_output="$directory/$without_extension.json"
+    casm_output="$directory/$without_extension.casm"
+    abi_output="$directory/${without_extension}_abi.json"
+
+    # compile to sierra
+    cargo run --bin starknet-compile \
+        --manifest-path "$CAIRO_1_COMPILER_MANIFEST" \
+        -- \
+        --allowed-libfuncs-list-name experimental_v0.1.0 \
+        "$contract" "$sierra_output"
+
+    jq ".abi" "$sierra_output" >"$abi_output"
+
+    # compile to casm
+    cargo run --bin starknet-sierra-compile \
+        --manifest-path "$CAIRO_1_COMPILER_MANIFEST" \
+        -- \
+        --allowed-libfuncs-list-name experimental_v0.1.0 \
+        --add-pythonic-hints \
+        "$sierra_output" "$casm_output"
+
+    number_of_contracts=$((number_of_contracts + 1))
+done
+
+echo "Compiled $number_of_contracts Cairo files successfully"
diff --git a/scripts/compile_contracts.sh b/scripts/compile_contracts.sh
index 0778605bd..a6866a77f 100755
--- a/scripts/compile_contracts.sh
+++ b/scripts/compile_contracts.sh
@@ -29,7 +29,9 @@ for contract in "$TEST_DIRECTORY"/cairo/*.cairo; do
     abi=$directory/"${basename%.*}_abi.json"
 
     poetry run starknet-compile --output "$output" --abi "$abi" "$contract"
-    number_of_contracts=$((number_of_contracts+1))
+    number_of_contracts=$((number_of_contracts + 1))
 done
 
 echo "Compiled $number_of_contracts Cairo files successfully"
+
+./scripts/compile_cairo1.sh
diff --git a/scripts/install_dev_tools.sh b/scripts/install_dev_tools.sh
index a31739305..3e69f9868 100755
--- a/scripts/install_dev_tools.sh
+++ b/scripts/install_dev_tools.sh
@@ -18,9 +18,28 @@ if rustc --version; then
     echo "rustc installed"
 else
     curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
-    source "$HOME/.cargo/env"
+    source ~/.cargo/env
 fi
 
+# setup cairo1 compiler
+if [ -z "$CAIRO_1_COMPILER_MANIFEST" ]; then
+    mkdir cairo-compiler
+    git clone git@github.com:starkware-libs/cairo.git cairo-compiler \
+        --branch v1.0.0-alpha.6 \
+        --single-branch
+    CAIRO_1_COMPILER_MANIFEST="cairo-compiler/Cargo.toml"
+    if [ -n "$CIRCLE_BRANCH" ]; then
+        echo "source ~/.cargo/env" >"$BASH_ENV"
+    fi
+fi
+
+echo "Using Cairo compiler at $CAIRO_1_COMPILER_MANIFEST"
+
+cargo run --bin starknet-compile \
+    --manifest-path "$CAIRO_1_COMPILER_MANIFEST" \
+    -- \
+    --version
+
 # install dependencies
 poetry install --no-ansi
 poetry lock --check
diff --git a/scripts/send_declare_v2.py b/scripts/send_declare_v2.py
new file mode 100644
index 000000000..ee17957d2
--- /dev/null
+++ b/scripts/send_declare_v2.py
@@ -0,0 +1,160 @@
+"""Send a declare v2 tx"""
+
+import os
+import sys
+
+import requests
+from starkware.crypto.signature.signature import sign
+from starkware.starknet.core.os.contract_class.compiled_class_hash import (
+    compute_compiled_class_hash,
+)
+from starkware.starknet.core.os.transaction_hash.transaction_hash import (
+    calculate_declare_transaction_hash,
+    compute_class_hash,
+)
+from starkware.starknet.definitions.general_config import StarknetChainId
+from starkware.starknet.services.api.contract_class.contract_class import CompiledClass
+from starkware.starknet.services.api.contract_class.contract_class_utils import (
+    load_sierra,
+)
+from starkware.starknet.services.api.gateway.transaction import Declare
+
+
+def _get_env_var(var_name: str):
+    try:
+        return os.environ[var_name]
+    except KeyError:
+        sys.exit(f"Error: Please provide env var {var_name}")
+
+
+HOST = _get_env_var("HOST")
+
+
+def get_nonce(contract_address: str) -> int:
+    """Accepts hex, returns int"""
+    resp = requests.get(
+        f"{HOST}/feeder_gateway/get_nonce?contractAddress={contract_address}"
+    )
+    hex_nonce = resp.json()
+    return int(hex_nonce, 16)
+
+
+def get_account():
+    """Extract (address, private_key)"""
+    return (
+        int(_get_env_var("ACCOUNT_ADDRESS"), 16),
+        int(_get_env_var("ACCOUNT_PRIVATE_KEY"), 16),
+    )
+
+
+def _get_class(class_hash: int):
+    class_hash = hex(class_hash)
+    print("Getting class for", class_hash)
+    resp = requests.get(
+        f"{HOST}/feeder_gateway/get_class_by_hash",
+        params={"classHash": class_hash},
+    )
+    print("Get class status_code:", resp.status_code)
+    print(
+        "Get class response:",
+        str(resp.json())[:100] if resp.status_code == 200 else resp.json(),
+    )
+
+
+def _get_compiled_class(class_hash: int):
+    class_hash = hex(class_hash)
+    print("Getting compiled class for", class_hash)
+    resp = requests.get(
+        f"{HOST}/feeder_gateway/get_compiled_class_by_class_hash",
+        params={"classHash": class_hash},
+    )
+    print("Get class status_code:", resp.status_code)
+    print(
+        "Get class response:",
+        str(resp.json())[:100] if resp.status_code == 200 else resp.json(),
+    )
+
+
+def _get_transaction(transaction_hash: str):
+    resp = requests.get(
+        f"{HOST}/feeder_gateway/get_transaction",
+        params={"transactionHash": transaction_hash},
+    )
+    print("Get transaction status_code:", resp.status_code)
+    print("Get transaction response:", resp.json())
+
+
+def _get_transaction_receipt(transaction_hash: str):
+    resp = requests.get(
+        f"{HOST}/feeder_gateway/get_transaction_receipt",
+        params={"transactionHash": transaction_hash},
+    )
+    print("Get transaction receipt status_code:", resp.status_code)
+    print("Get transaction receipt response:", resp.json())
+
+
+def main():  # pylint: disable=too-many-locals
+    """Main method"""
+
+    print("Sending request to:", HOST)
+
+    sender_address, private_key = get_account()
+
+    artifacts_path = "test/artifacts/contracts/cairo1/contract.cairo"
+    contract_class = load_sierra(f"{artifacts_path}/contract.json")
+    with open(f"{artifacts_path}/contract.casm", encoding="utf-8") as casm_file:
+        compiled_class = CompiledClass.loads(casm_file.read())
+
+    class_hash = compute_class_hash(contract_class)
+    print("Class hash:", hex(class_hash))
+    compiled_class_hash = compute_compiled_class_hash(compiled_class)
+    print("Compiled class hash:", hex(compiled_class_hash))
+
+    max_fee = int(1e18)  # should be enough
+    version = 2
+    nonce = get_nonce(hex(sender_address))
+    chain_id = StarknetChainId.TESTNET.value
+    hash_value = calculate_declare_transaction_hash(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=sender_address,
+        max_fee=max_fee,
+        version=version,
+        nonce=nonce,
+        chain_id=chain_id,
+    )
+
+    declaration_body = Declare(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=sender_address,
+        version=version,
+        max_fee=max_fee,
+        signature=list(sign(msg_hash=hash_value, priv_key=private_key)),
+        nonce=nonce,
+    ).dump()
+
+    declaration_body["type"] = "DECLARE"
+
+    declare_resp = requests.post(
+        f"{HOST}/gateway/add_transaction", json=declaration_body
+    )
+    assert declare_resp.status_code == 200, declare_resp.json()
+    print("Declare response:", declare_resp.json())
+    tx_hash = declare_resp.json()["transaction_hash"]
+
+    print("\nGetting class")
+    _get_class(class_hash)
+    _get_class(compiled_class_hash)
+
+    print("\nGetting compiled class")
+    _get_compiled_class(class_hash)
+    _get_compiled_class(compiled_class_hash)
+
+    print("\nGetting tx info")
+    _get_transaction(tx_hash)
+    _get_transaction_receipt(tx_hash)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/starknet_devnet/__init__.py b/starknet_devnet/__init__.py
index 51ffd514d..5069718b2 100644
--- a/starknet_devnet/__init__.py
+++ b/starknet_devnet/__init__.py
@@ -53,15 +53,19 @@ def _patch_copy():
 
     from copy import copy
 
-    from starkware.starknet.services.api.contract_class import ContractClass
+    from starkware.starknet.services.api.contract_class.contract_class import (
+        CompiledClassBase,
+        ContractClass,
+    )
 
     def simpler_copy(self, memo):  # pylint: disable=unused-argument
         """
-        A dummy implementation of ContractClass.__deepcopy__
+        A dummy implementation of __deepcopy__
         """
         return copy(self)
 
     setattr(ContractClass, "__deepcopy__", simpler_copy)
+    setattr(CompiledClassBase, "__deepcopy__", simpler_copy)
 
 
 _patch_copy()
@@ -69,13 +73,16 @@ def simpler_copy(self, memo):  # pylint: disable=unused-argument
 
 def _patch_cairo_vm():
     """Apply cairo-rs-py monkey patch"""
-    from starknet_devnet.cairo_rs_py_patch import cairo_rs_py_monkeypatch
+    # TMP: rust vm
+    # from starknet_devnet.cairo_rs_py_patch import cairo_rs_py_monkeypatch
+
+    # cairo_rs_py_monkeypatch()
 
-    cairo_rs_py_monkeypatch()
+    # from .util import warn
 
-    from .util import warn
+    # warn("Using Cairo VM: Rust")
 
-    warn("Using Cairo VM: Rust")
+    sys.exit("Rust Cairo VM is temporarily not available")
 
 
 _VM_VAR = "STARKNET_DEVNET_CAIRO_VM"
diff --git a/starknet_devnet/account.py b/starknet_devnet/account.py
index 05758dd8b..df7bb246b 100644
--- a/starknet_devnet/account.py
+++ b/starknet_devnet/account.py
@@ -9,7 +9,7 @@
 from starkware.starknet.testing.starknet import Starknet
 
 from starknet_devnet.account_util import set_balance
-from starknet_devnet.contract_class_wrapper import ContractClassWrapper
+from starknet_devnet.contract_class_wrapper import CompiledClassWrapper
 from starknet_devnet.predeployed_contract_wrapper import PredeployedContractWrapper
 
 
@@ -23,13 +23,13 @@ def __init__(
         private_key: int,
         public_key: int,
         initial_balance: int,
-        account_class_wrapper: ContractClassWrapper,
+        account_class_wrapper: CompiledClassWrapper,
     ):
         self.starknet_wrapper = starknet_wrapper
         self.private_key = private_key
         self.public_key = public_key
         self.contract_class = account_class_wrapper.contract_class
-        self.class_hash_bytes = account_class_wrapper.hash_bytes
+        self.class_hash = account_class_wrapper.hash
 
         # salt and class_hash have frozen values that make the constructor_calldata
         # the only thing that affects the account address
diff --git a/starknet_devnet/accounts.py b/starknet_devnet/accounts.py
index b3236110e..898d65cae 100644
--- a/starknet_devnet/accounts.py
+++ b/starknet_devnet/accounts.py
@@ -36,7 +36,7 @@ def __init__(self, starknet_wrapper):
         ):
             self.__print()
 
-    def __getitem__(self, index):
+    def __getitem__(self, index) -> Account:
         return self.list[index]
 
     async def deploy(self):
diff --git a/starknet_devnet/blueprints/feeder_gateway.py b/starknet_devnet/blueprints/feeder_gateway.py
index f18e2271a..eab1b0924 100644
--- a/starknet_devnet/blueprints/feeder_gateway.py
+++ b/starknet_devnet/blueprints/feeder_gateway.py
@@ -38,7 +38,7 @@ def validate_request(data: bytes, cls, many=False):
     """Ensure `data` is valid Starknet function call. Returns an object of type specified with `cls`."""
     try:
         return cls.Schema().loads(data, many=many)
-    except (TypeError, ValidationError) as err:
+    except (AttributeError, KeyError, TypeError, ValidationError) as err:
         raise StarknetDevnetException(
             code=StarkErrorCode.MALFORMED_REQUEST,
             message=f"Invalid {cls.__name__}: {err}",
@@ -117,6 +117,25 @@ def _get_block_id(args: MultiDict) -> BlockId:
     return {"block_number": block_number}
 
 
+def _get_skip_validate(args: MultiDict) -> bool:
+    skip_validate = args.get("skipValidate")
+
+    if skip_validate == "true":
+        return True
+
+    if skip_validate == "false":
+        return False
+
+    # default case (user did not specify)
+    if skip_validate is None:
+        return False
+
+    raise StarknetDevnetException(
+        code=StarkErrorCode.MALFORMED_REQUEST,
+        message=f"Invalid value for skipValidate: {skip_validate}. Should be true or false.",
+    )
+
+
 @feeder_gateway.route("/get_contract_addresses", methods=["GET"])
 def get_contract_addresses():
     """Endpoint that returns an object containing the addresses of key system components."""
@@ -132,11 +151,11 @@ async def call_contract():
     block_id = _get_block_id(request.args)
 
     try:
-        call_specifications = validate_request(request.data, CallFunction)  # version 1
+        # version 1
+        call_specifications = validate_request(request.data, CallFunction)
     except StarknetDevnetException:
-        call_specifications = validate_request(
-            request.data, InvokeFunction
-        )  # version 0
+        # version 0
+        call_specifications = validate_request(request.data, InvokeFunction)
 
     result_dict = await state.starknet_wrapper.call(call_specifications, block_id)
     return jsonify(result_dict)
@@ -201,8 +220,21 @@ async def get_class_by_hash():
     """Get contract class by class hash"""
 
     class_hash = request.args.get("classHash", type=parse_hex_string)
-    contract_class = await state.starknet_wrapper.get_class_by_hash(class_hash)
-    return jsonify(contract_class.remove_debug_info().dump())
+    class_dict = await state.starknet_wrapper.get_class_by_hash(class_hash)
+    # if isinstance(contract_class, DeprecatedCompiledClass):
+    #     contract_class = contract_class.remove_debug_info()
+
+    return jsonify(class_dict)
+
+
+@feeder_gateway.route("/get_compiled_class_by_class_hash", methods=["GET"])
+async def get_compiled_class_by_hash():
+    """Get compiled class by class hash (sierra hash)"""
+    class_hash = request.args.get("classHash", type=parse_hex_string)
+    compiled_class = await state.starknet_wrapper.get_compiled_class_by_class_hash(
+        class_hash
+    )
+    return jsonify(compiled_class.dump())
 
 
 @feeder_gateway.route("/get_storage_at", methods=["GET"])
@@ -305,9 +337,10 @@ async def estimate_fee():
         transaction = validate_request(request.data, InvokeFunction)  # version 0
 
     block_id = _get_block_id(request.args)
+    skip_validate = _get_skip_validate(request.args)
 
     _, fee_response = await state.starknet_wrapper.calculate_trace_and_fee(
-        transaction, block_id
+        transaction, skip_validate=skip_validate, block_id=block_id
     )
     return jsonify(fee_response)
 
@@ -324,9 +357,12 @@ async def estimate_fee_bulk():
         transactions = validate_request(request.data, InvokeFunction, many=True)
 
     block_id = _get_block_id(request.args)
+    skip_validate = _get_skip_validate(request.args)
 
     _, fee_responses = await state.starknet_wrapper.calculate_traces_and_fees(
-        transactions, block_id
+        transactions,
+        block_id=block_id,
+        skip_validate=skip_validate,
     )
     return jsonify(fee_responses)
 
@@ -336,9 +372,12 @@ async def simulate_transaction():
     """Returns the estimated fee for a transaction."""
     transaction = validate_request(request.data, AccountTransaction)
     block_id = _get_block_id(request.args)
+    skip_validate = _get_skip_validate(request.args)
 
     trace, fee_response = await state.starknet_wrapper.calculate_trace_and_fee(
-        transaction, block_id
+        transaction,
+        block_id=block_id,
+        skip_validate=skip_validate,
     )
 
     simulation_info = TransactionSimulationInfo(
diff --git a/starknet_devnet/blueprints/postman.py b/starknet_devnet/blueprints/postman.py
index 99f39090d..585f4c92f 100644
--- a/starknet_devnet/blueprints/postman.py
+++ b/starknet_devnet/blueprints/postman.py
@@ -76,6 +76,7 @@ async def send_message_to_l2():
         ],
         nonce=hex_converter(request_json, "nonce"),
         chain_id=state.starknet_wrapper.get_state().general_config.chain_id.value,
+        paid_fee_on_l1=hex_converter(request_json, "paid_fee_on_l1"),
     )
 
     result = await state.starknet_wrapper.mock_message_to_l2(transaction)
diff --git a/starknet_devnet/blueprints/rpc/classes.py b/starknet_devnet/blueprints/rpc/classes.py
index 6dcc0f914..c60c936a7 100644
--- a/starknet_devnet/blueprints/rpc/classes.py
+++ b/starknet_devnet/blueprints/rpc/classes.py
@@ -2,6 +2,9 @@
 RPC classes endpoints
 """
 
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 from starkware.starkware_utils.error_handling import StarkException
 
 from starknet_devnet.blueprints.rpc.schema import validate_schema
@@ -25,13 +28,15 @@ async def get_class(block_id: BlockId, class_hash: Felt) -> dict:
     await assert_block_id_is_valid(block_id)  # T O D O   unused
 
     try:
-        result = await state.starknet_wrapper.get_class_by_hash(
+        result_dict = await state.starknet_wrapper.get_class_by_hash(
             class_hash=int(class_hash, 16)
         )
     except StarknetDevnetException as ex:
         raise RpcError.from_spec_name("CLASS_HASH_NOT_FOUND") from ex
 
-    return rpc_contract_class(result)
+    # only works with cairo 0 classes
+    loaded_class = DeprecatedCompiledClass.load(result_dict)
+    return rpc_contract_class(loaded_class)
 
 
 @validate_schema("getClassHashAt")
diff --git a/starknet_devnet/blueprints/rpc/structures/payloads.py b/starknet_devnet/blueprints/rpc/structures/payloads.py
index 28f24dfc0..abb8986e7 100644
--- a/starknet_devnet/blueprints/rpc/structures/payloads.py
+++ b/starknet_devnet/blueprints/rpc/structures/payloads.py
@@ -9,7 +9,9 @@
 from marshmallow.exceptions import MarshmallowError
 from starkware.starknet.definitions.general_config import StarknetGeneralConfig
 from starkware.starknet.public.abi import AbiEntryType
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.feeder_gateway.request_objects import CallFunction
 from starkware.starknet.services.api.feeder_gateway.response_objects import (
     BlockStateUpdate,
@@ -24,9 +26,9 @@
     TransactionType,
 )
 from starkware.starknet.services.api.gateway.transaction import (
-    Declare,
     Deploy,
     DeployAccount,
+    DeprecatedDeclare,
     InvokeFunction,
 )
 from starkware.starknet.services.api.gateway.transaction_utils import (
@@ -290,13 +292,13 @@ def rpc_invoke_transaction(
 
     if transaction.version == LEGACY_RPC_TX_VERSION:
         txn: RpcInvokeTransactionV0 = {
-            "contract_address": rpc_felt(transaction.contract_address),
+            "contract_address": rpc_felt(transaction.sender_address),
             "entry_point_selector": rpc_felt(transaction.entry_point_selector),
             **common_data,
         }
     else:
         txn: RpcInvokeTransactionV1 = {
-            "sender_address": rpc_felt(transaction.contract_address),
+            "sender_address": rpc_felt(transaction.sender_address),
             **common_data,
         }
     return txn
@@ -414,14 +416,14 @@ def make_invoke_function(invoke_transaction: RpcBroadcastedInvokeTxn) -> InvokeF
 
     if version == LEGACY_RPC_TX_VERSION:
         invoke_function = InvokeFunction(
-            contract_address=int(invoke_transaction["contract_address"], 16),
+            sender_address=int(invoke_transaction["contract_address"], 16),
             entry_point_selector=int(invoke_transaction["entry_point_selector"], 16),
             calldata=[int(data, 16) for data in invoke_transaction.get("calldata", [])],
             **common_data,
         )
     else:
         invoke_function = InvokeFunction(
-            contract_address=int(invoke_transaction["sender_address"], 16),
+            sender_address=int(invoke_transaction["sender_address"], 16),
             calldata=[int(data, 16) for data in invoke_transaction.get("calldata", [])],
             **common_data,
         )
@@ -429,24 +431,22 @@ def make_invoke_function(invoke_transaction: RpcBroadcastedInvokeTxn) -> InvokeF
     return invoke_function
 
 
-def make_declare(declare_transaction: RpcBroadcastedDeclareTxn) -> Declare:
+def make_declare(declare_transaction: RpcBroadcastedDeclareTxn) -> DeprecatedDeclare:
     """
-    Convert RpcBroadcastedDeclareTxn to Declare
+    Convert RpcBroadcastedDeclareTxn to DeprecatedDeclare
     """
     contract_class = declare_transaction["contract_class"]
     if "abi" not in contract_class:
         contract_class["abi"] = []
 
     try:
-        contract_class = decompress_program(declare_transaction, False)[
-            "contract_class"
-        ]
-        contract_class = ContractClass.load(contract_class)
+        contract_class["program"] = decompress_program(contract_class["program"])
+        contract_class = DeprecatedCompiledClass.load(contract_class)
     except (StarkException, TypeError, MarshmallowError) as ex:
         raise RpcError(code=50, message="Invalid contract class") from ex
 
     nonce = declare_transaction.get("nonce")
-    declare_tx = Declare(
+    declare_tx = DeprecatedDeclare(
         contract_class=contract_class,
         sender_address=int(declare_transaction["sender_address"], 16),
         nonce=int(nonce, 16) if nonce is not None else 0,
@@ -466,8 +466,8 @@ def make_deploy(deploy_transaction: RpcBroadcastedDeployTxn) -> Deploy:
         contract_class["abi"] = []
 
     try:
-        contract_class = decompress_program(deploy_transaction, False)["contract_class"]
-        contract_class = ContractClass.load(contract_class)
+        contract_class["program"] = decompress_program(contract_class["program"])
+        contract_class = DeprecatedCompiledClass.load(contract_class)
     except (StarkException, TypeError, MarshmallowError) as ex:
         raise RpcError(code=50, message="Invalid contract class") from ex
 
@@ -631,7 +631,7 @@ class RpcContractClass(TypedDict):
     abi: Optional[List[AbiEntry]]
 
 
-def rpc_contract_class(contract_class: ContractClass) -> RpcContractClass:
+def rpc_contract_class(contract_class: DeprecatedCompiledClass) -> RpcContractClass:
     """
     Convert gateway contract class to rpc contract class
     """
@@ -738,7 +738,10 @@ def storage_diffs() -> List[RpcStorageDiff]:
     def declared_contract_hashes() -> List[Felt]:
         return [
             rpc_felt(contract)
-            for contract in state_update.state_diff.declared_contracts
+            for contract in state_update.state_diff.old_declared_contracts
+        ] + [
+            rpc_felt(class_hash_pair.compiled_class_hash)
+            for class_hash_pair in state_update.state_diff.declared_classes
         ]
 
     def deployed_contracts() -> List[RpcDeployedContractDiff]:
diff --git a/starknet_devnet/blueprints/rpc/transactions.py b/starknet_devnet/blueprints/rpc/transactions.py
index a593c4f20..1e220364f 100644
--- a/starknet_devnet/blueprints/rpc/transactions.py
+++ b/starknet_devnet/blueprints/rpc/transactions.py
@@ -204,7 +204,9 @@ async def estimate_fee(request: RpcBroadcastedTxn, block_id: BlockId) -> dict:
     transaction = make_transaction(request)
     try:
         _, fee_response = await state.starknet_wrapper.calculate_trace_and_fee(
-            transaction, block_id
+            transaction,
+            skip_validate=False,
+            block_id=block_id,
         )
     except StarkException as ex:
         if "entry_point_selector" in request and (
diff --git a/starknet_devnet/blueprints/shared.py b/starknet_devnet/blueprints/shared.py
index 7727eaea0..95f305a96 100644
--- a/starknet_devnet/blueprints/shared.py
+++ b/starknet_devnet/blueprints/shared.py
@@ -14,7 +14,7 @@ def validate_transaction(data: bytes) -> Transaction:
     """Ensure `transaction_dict` is a valid Starknet transaction. Returns the parsed Transaction."""
     try:
         return Transaction.loads(data)
-    except (TypeError, ValidationError) as err:
+    except (TypeError, ValidationError, KeyError) as err:
         msg = f"""Invalid tx: {err}
 Be sure to use the correct compilation (json) artifact. Devnet-compatible cairo-lang version: {CAIRO_LANG_VERSION}"""
         raise StarknetDevnetException(
diff --git a/starknet_devnet/cairo_rs_py_patch.py b/starknet_devnet/cairo_rs_py_patch.py
index 8a00a5b75..cfd669b39 100644
--- a/starknet_devnet/cairo_rs_py_patch.py
+++ b/starknet_devnet/cairo_rs_py_patch.py
@@ -5,425 +5,425 @@
 # pylint: disable=protected-access
 # pylint: disable=too-many-locals
 
-
-import logging
-import sys
-from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union, cast
-
-import cairo_rs_py
-from cairo_rs_py import RelocatableValue  # pylint: disable = no-name-in-module
-from starkware.cairo.common.cairo_function_runner import CairoFunctionRunner
-from starkware.cairo.common.structs import CairoStructFactory
-from starkware.cairo.lang.compiler.ast.cairo_types import (
-    CairoType,
-    TypeFelt,
-    TypePointer,
-)
-from starkware.cairo.lang.compiler.program import Program
-from starkware.cairo.lang.compiler.scoped_name import ScopedName
-from starkware.cairo.lang.vm.memory_segments import MemorySegmentManager
-from starkware.cairo.lang.vm.relocatable import MaybeRelocatable
-from starkware.cairo.lang.vm.utils import ResourcesError
-from starkware.cairo.lang.vm.vm_exceptions import (
-    SecurityError,
-    VmException,
-    VmExceptionBase,
-)
-from starkware.python.utils import safe_zip
-from starkware.starknet.business_logic.execution.execute_entry_point import (
-    FAULTY_CLASS_HASH,
-    ExecuteEntryPoint,
-)
-from starkware.starknet.business_logic.execution.objects import (
-    TransactionExecutionContext,
-)
-from starkware.starknet.business_logic.fact_state.state import ExecutionResourcesManager
-from starkware.starknet.business_logic.state.state_api import SyncState
-from starkware.starknet.business_logic.utils import validate_contract_deployed
-from starkware.starknet.core.os import os_utils, segment_utils, syscall_utils
-from starkware.starknet.core.os.class_hash import (
-    get_contract_class_struct,
-    load_program,
-)
-from starkware.starknet.definitions.error_codes import StarknetErrorCode
-from starkware.starknet.definitions.general_config import StarknetGeneralConfig
-from starkware.starknet.public import abi as starknet_abi
-from starkware.starknet.public.abi import SYSCALL_PTR_OFFSET
-from starkware.starknet.services.api.contract_class import ContractClass
-from starkware.starkware_utils.error_handling import (
-    ErrorCode,
-    StarkException,
-    stark_assert,
-    wrap_with_stark_exception,
-)
-
-logger = logging.getLogger(__name__)
-
-
-def cairo_rs_py_run(
-    self,
-    state: SyncState,
-    resources_manager: ExecutionResourcesManager,
-    general_config: StarknetGeneralConfig,
-    tx_execution_context: TransactionExecutionContext,
-) -> Tuple[CairoFunctionRunner, syscall_utils.BusinessLogicSysCallHandler]:
-    """
-    Runs the selected entry point with the given calldata in the code of the contract deployed
-    at self.code_address.
-    The execution is done in the context (e.g., storage) of the contract at
-    self.contract_address.
-    Returns the corresponding CairoFunctionRunner and BusinessLogicSysCallHandler in order to
-    retrieve the execution information.
-    """
-    # Prepare input for Cairo function runner.
-    class_hash = self._get_code_class_hash(state=state)
-
-    # Hack to prevent version 0 attack on argent accounts.
-    if (tx_execution_context.version == 0) and (class_hash == FAULTY_CLASS_HASH):
-        raise StarkException(
-            code=StarknetErrorCode.TRANSACTION_FAILED, message="Fraud attempt blocked."
-        )
-
-    contract_class = state.get_contract_class(class_hash=class_hash)
-    contract_class.validate()
-
-    entry_point = self._get_selected_entry_point(
-        contract_class=contract_class, class_hash=class_hash
-    )
-
-    # Run the specified contract entry point with given calldata.
-    with wrap_with_stark_exception(code=StarknetErrorCode.SECURITY_ERROR):
-        runner = cairo_rs_py.CairoRunner(  # pylint: disable=no-member
-            program=contract_class.program.dumps(),
-            entrypoint=None,
-            layout="all",
-            proof_mode=False,
-        )
-        runner.initialize_function_runner()
-    os_context = os_utils.prepare_os_context(runner=runner)
-
-    validate_contract_deployed(state=state, contract_address=self.contract_address)
-
-    initial_syscall_ptr = cast(
-        RelocatableValue, os_context[starknet_abi.SYSCALL_PTR_OFFSET]
-    )
-    syscall_handler = syscall_utils.BusinessLogicSysCallHandler(
-        execute_entry_point_cls=ExecuteEntryPoint,
-        tx_execution_context=tx_execution_context,
-        state=state,
-        resources_manager=resources_manager,
-        caller_address=self.caller_address,
-        contract_address=self.contract_address,
-        general_config=general_config,
-        initial_syscall_ptr=initial_syscall_ptr,
-    )
-
-    # Positional arguments are passed to *args in the 'run_from_entrypoint' function.
-    entry_points_args = [
-        self.entry_point_selector,
-        os_context,
-        len(self.calldata),
-        # Allocate and mark the segment as read-only (to mark every input array as read-only).
-        syscall_handler._allocate_segment(segments=runner.segments, data=self.calldata),
-    ]
-
-    try:
-        runner.run_from_entrypoint(
-            entry_point.offset,
-            entry_points_args,
-            hint_locals={
-                "syscall_handler": syscall_handler,
-            },
-            static_locals={
-                "__find_element_max_size": 2**20,
-                "__squash_dict_max_size": 2**20,
-                "__keccak_max_size": 2**20,
-                "__usort_max_size": 2**20,
-                "__chained_ec_op_max_len": 1000,
-            },
-            run_resources=tx_execution_context.run_resources,
-            verify_secure=True,
-        )
-    except VmException as exception:
-        code: ErrorCode = StarknetErrorCode.TRANSACTION_FAILED
-
-        if isinstance(exception.inner_exc, syscall_utils.HandlerException):
-            stark_exception = exception.inner_exc.stark_exception
-            code = stark_exception.code
-            called_contract_address = exception.inner_exc.called_contract_address
-            message_prefix = (
-                f"Error in the called contract ({hex(called_contract_address)}):\n"
-            )
-            # Override python's traceback and keep the Cairo one of the inner exception.
-            exception.notes = [message_prefix + str(stark_exception.message)]
-        if isinstance(exception.inner_exc, ResourcesError):
-            code = StarknetErrorCode.OUT_OF_RESOURCES
-        raise StarkException(code=code, message=str(exception)) from exception
-    except VmExceptionBase as exception:
-        raise StarkException(
-            code=StarknetErrorCode.TRANSACTION_FAILED, message=str(exception)
-        ) from exception
-    except SecurityError as exception:
-        raise StarkException(
-            code=StarknetErrorCode.SECURITY_ERROR, message=str(exception)
-        ) from exception
-    except Exception as exception:
-        logger.error("Got an unexpected exception.", exc_info=True)
-        raise StarkException(
-            code=StarknetErrorCode.UNEXPECTED_FAILURE,
-            message="Got an unexpected exception during the execution of the transaction.",
-        ) from exception
-
-    # Complete handler validations.
-    os_utils.validate_and_process_os_context(
-        runner=runner,
-        syscall_handler=syscall_handler,
-        initial_os_context=os_context,
-    )
-
-    # When execution starts the stack holds entry_points_args + [ret_fp, ret_pc].
-    args_ptr = runner.initial_fp - (len(entry_points_args) + 2)
-
-    # The arguments are touched by the OS and should not be counted as holes, mark them
-    # as accessed.
-    assert isinstance(args_ptr, RelocatableValue)  # Downcast.
-    runner.mark_as_accessed(address=args_ptr, size=len(entry_points_args))
-
-    return runner, syscall_handler
-
-
-def cairo_rs_py_compute_class_hash_inner(
-    contract_class: ContractClass,
-    hash_func: Callable[[int, int], int],  # pylint: disable=unused-argument
-) -> int:
-    program = load_program()
-    contract_class_struct = get_contract_class_struct(
-        identifiers=program.identifiers, contract_class=contract_class
-    )
-
-    runner = cairo_rs_py.CairoRunner(  # pylint: disable=no-member
-        program=program.dumps(), entrypoint=None, layout="all", proof_mode=False
-    )
-    runner.initialize_function_runner()
-    hash_ptr = runner.add_additional_hash_builtin()
-
-    run_function_runner(
-        runner,
-        program,
-        "starkware.starknet.core.os.contracts.class_hash",
-        hash_ptr=hash_ptr,
-        contract_class=contract_class_struct,
-        use_full_name=True,
-        verify_secure=False,
-    )
-    _, class_hash = runner.get_return_values(2)
-    return class_hash
-
-
-def run_function_runner(
-    runner,
-    program,
-    func_name: str,
-    *args,
-    hint_locals: Optional[Dict[str, Any]] = None,
-    static_locals: Optional[Dict[str, Any]] = None,
-    verify_secure: Optional[bool] = None,
-    trace_on_failure: bool = False,
-    apply_modulo_to_args: Optional[bool] = None,
-    use_full_name: bool = False,
-    verify_implicit_args_segment: bool = False,
-    **kwargs,
-) -> Tuple[Tuple[MaybeRelocatable, ...], Tuple[MaybeRelocatable, ...]]:
-    """
-    Runs func_name(*args).
-    args are converted to Cairo-friendly ones using gen_arg.
-
-    Returns the return values of the function, splitted into 2 tuples of implicit values and
-    explicit values. Structs will be flattened to a sequence of felts as part of the returned
-    tuple.
-
-    Additional params:
-    verify_secure - Run verify_secure_runner to do extra verifications.
-    trace_on_failure - Run the tracer in case of failure to help debugging.
-    apply_modulo_to_args - Apply modulo operation on integer arguments.
-    use_full_name - Treat 'func_name' as a fully qualified identifier name, rather than a
-      relative one.
-    verify_implicit_args_segment - For each implicit argument, verify that the argument and the
-      return value are in the same segment.
-    """
-    assert isinstance(program, Program)
-    entrypoint = program.get_label(func_name, full_name_lookup=use_full_name)
-
-    structs_factory = CairoStructFactory.from_program(program=program)
-    func = ScopedName.from_string(scope=func_name)
-
-    full_args_struct = structs_factory.build_func_args(func=func)
-    all_args = full_args_struct(*args, **kwargs)  # pylint: disable=not-callable
-
-    try:
-        runner.run_from_entrypoint(
-            entrypoint,
-            all_args,
-            typed_args=True,
-            hint_locals=hint_locals,
-            static_locals=static_locals,
-            verify_secure=verify_secure,
-            apply_modulo_to_args=apply_modulo_to_args,
-        )
-    except (VmException, SecurityError, AssertionError) as ex:
-        if trace_on_failure:  # Unreachable code
-            print(
-                f"""\
-Got {type(ex).__name__} exception during the execution of {func_name}:
-{str(ex)}
-"""
-            )
-            # trace_runner(runner=runner)
-        raise
-
-    # The number of implicit arguments is identical to the number of implicit return values.
-    n_implicit_ret_vals = structs_factory.get_implicit_args_length(func=func)
-    n_explicit_ret_vals = structs_factory.get_explicit_return_values_length(func=func)
-    n_ret_vals = n_explicit_ret_vals + n_implicit_ret_vals
-    implicit_retvals = tuple(
-        runner.get_range(runner.get_ap() - n_ret_vals, n_implicit_ret_vals)
-    )
-
-    explicit_retvals = tuple(
-        runner.get_range(runner.get_ap() - n_explicit_ret_vals, n_explicit_ret_vals)
-    )
-
-    # Verify the memory segments of the implicit arguments.
-    if verify_implicit_args_segment:
-        implicit_args = all_args[:n_implicit_ret_vals]
-        for implicit_arg, implicit_retval in safe_zip(implicit_args, implicit_retvals):
-            assert isinstance(
-                implicit_arg, RelocatableValue
-            ), f"Implicit arguments must be RelocatableValues, {implicit_arg} is not."
-            assert isinstance(implicit_retval, RelocatableValue), (
-                f"Argument {implicit_arg} is a RelocatableValue, but the returned value "
-                f"{implicit_retval} is not."
-            )
-            assert implicit_arg.segment_index == implicit_retval.segment_index, (
-                f"Implicit argument {implicit_arg} is not on the same segment as the returned "
-                f"{implicit_retval}."
-            )
-            assert implicit_retval.offset >= implicit_arg.offset, (
-                f"The offset of the returned implicit argument {implicit_retval} is less than "
-                f"the offset of the input {implicit_arg}."
-            )
-
-    return implicit_retvals, explicit_retvals
-
-
-def cairo_rs_py_prepare_os_context(
-    runner: CairoFunctionRunner,
-) -> List[MaybeRelocatable]:
-    syscall_segment = runner.add_segment()
-    os_context: List[MaybeRelocatable] = [syscall_segment]
-    os_context.extend(runner.get_program_builtins_initial_stack())
-
-    return os_context
-
-
-def cairo_rs_py_validate_and_process_os_context(
-    runner: CairoFunctionRunner,
-    syscall_handler: syscall_utils.BusinessLogicSysCallHandler,
-    initial_os_context: List[MaybeRelocatable],
-):
-    """
-    Validates and processes an OS context that was returned by a transaction.
-    Returns the syscall processor object containing the accumulated syscall information.
-    """
-    os_context_end = runner.get_ap() - 2
-    stack_ptr = os_context_end
-    # The returned values are os_context, retdata_size, retdata_ptr.
-    stack_ptr = runner.get_builtins_final_stack(stack_ptr)
-
-    final_os_context_ptr = stack_ptr - 1
-    assert final_os_context_ptr + len(initial_os_context) == os_context_end
-
-    # Validate system calls.
-    syscall_base_ptr, syscall_stop_ptr = segment_utils.get_os_segment_ptr_range(
-        runner=runner, ptr_offset=SYSCALL_PTR_OFFSET, os_context=initial_os_context
-    )
-
-    segment_utils.validate_segment_pointers(
-        segments=runner.segments,
-        segment_base_ptr=syscall_base_ptr,
-        segment_stop_ptr=syscall_stop_ptr,
-    )
-    syscall_handler.post_run(runner=runner, syscall_stop_ptr=syscall_stop_ptr)
-
-
-def cairo_rs_py_get_runtime_type(
-    cairo_type: CairoType,
-) -> Union[Type[int], Type[RelocatableValue]]:
-    """
-    Given a CairoType returns the expected runtime type.
-    """
-
-    if isinstance(cairo_type, TypeFelt):
-        return int
-    if isinstance(cairo_type, TypePointer) and isinstance(cairo_type.pointee, TypeFelt):
-        return RelocatableValue
-
-    raise NotImplementedError(f"Unexpected type: {cairo_type.format()}.")
-
-
-def handler_exception__str__(self) -> str:
-    return self.stark_exception.message
-
-
-def cairo_rs_py_validate_segment_pointers(
-    segments: MemorySegmentManager,
-    segment_base_ptr: MaybeRelocatable,
-    segment_stop_ptr: MaybeRelocatable,
-):
-    assert isinstance(segment_base_ptr, RelocatableValue)
-    assert (
-        segment_base_ptr.offset == 0
-    ), f"Segment base pointer must be zero; got {segment_base_ptr.offset}."
-
-    expected_stop_ptr = segment_base_ptr + segments.get_segment_used_size(
-        segment_base_ptr.segment_index
-    )
-
-    stark_assert(
-        expected_stop_ptr == segment_stop_ptr,
-        code=StarknetErrorCode.SECURITY_ERROR,
-        message=(
-            f"Invalid stop pointer for segment. "
-            f"Expected: {expected_stop_ptr}, found: {segment_stop_ptr}."
-        ),
-    )
-
-
-def cairo_rs_py_monkeypatch():
-    setattr(ExecuteEntryPoint, "_run", cairo_rs_py_run)
-    setattr(
-        sys.modules["starkware.starknet.core.os.class_hash"],
-        "class_hash_inner",
-        cairo_rs_py_compute_class_hash_inner,
-    )
-    setattr(
-        sys.modules["starkware.starknet.core.os.os_utils"],
-        "prepare_os_context",
-        cairo_rs_py_prepare_os_context,
-    )
-    setattr(
-        sys.modules["starkware.starknet.core.os.os_utils"],
-        "validate_and_process_os_context",
-        cairo_rs_py_validate_and_process_os_context,
-    )
-    setattr(
-        sys.modules["starkware.starknet.core.os.segment_utils"],
-        "validate_segment_pointers",
-        cairo_rs_py_validate_segment_pointers,
-    )
-    setattr(
-        sys.modules["starkware.starknet.core.os.syscall_utils"],
-        "get_runtime_type",
-        cairo_rs_py_get_runtime_type,
-    )
-    setattr(syscall_utils.HandlerException, "__str__", handler_exception__str__)
+# TMP: rust vm
+# import logging
+# import sys
+# from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union, cast
+
+# import cairo_rs_py
+# from cairo_rs_py import RelocatableValue  # pylint: disable = no-name-in-module
+# from starkware.cairo.common.cairo_function_runner import CairoFunctionRunner
+# from starkware.cairo.common.structs import CairoStructFactory
+# from starkware.cairo.lang.compiler.ast.cairo_types import (
+#     CairoType,
+#     TypeFelt,
+#     TypePointer,
+# )
+# from starkware.cairo.lang.compiler.program import Program
+# from starkware.cairo.lang.compiler.scoped_name import ScopedName
+# from starkware.cairo.lang.vm.memory_segments import MemorySegmentManager
+# from starkware.cairo.lang.vm.relocatable import MaybeRelocatable
+# from starkware.cairo.lang.vm.utils import ResourcesError
+# from starkware.cairo.lang.vm.vm_exceptions import (
+#     SecurityError,
+#     VmException,
+#     VmExceptionBase,
+# )
+# from starkware.python.utils import safe_zip
+# from starkware.starknet.business_logic.execution.execute_entry_point import (
+#     FAULTY_CLASS_HASH,
+#     ExecuteEntryPoint,
+# )
+# from starkware.starknet.business_logic.execution.objects import (
+#     TransactionExecutionContext,
+# )
+# from starkware.starknet.business_logic.fact_state.state import ExecutionResourcesManager
+# from starkware.starknet.business_logic.state.state_api import SyncState
+# from starkware.starknet.business_logic.utils import validate_contract_deployed
+# from starkware.starknet.core.os import os_utils, segment_utils, syscall_utils
+# from starkware.starknet.core.os.contract_class.class_hash import (
+#     get_contract_class_struct,
+#     load_program,
+# )
+# from starkware.starknet.definitions.error_codes import StarknetErrorCode
+# from starkware.starknet.definitions.general_config import StarknetGeneralConfig
+# from starkware.starknet.public import abi as starknet_abi
+# from starkware.starknet.public.abi import SYSCALL_PTR_OFFSET
+# from starkware.starknet.services.api.contract_class.contract_class import ContractClass
+# from starkware.starkware_utils.error_handling import (
+#     ErrorCode,
+#     StarkException,
+#     stark_assert,
+#     wrap_with_stark_exception,
+# )
+
+# logger = logging.getLogger(__name__)
+
+
+# def cairo_rs_py_run(
+#     self,
+#     state: SyncState,
+#     resources_manager: ExecutionResourcesManager,
+#     general_config: StarknetGeneralConfig,
+#     tx_execution_context: TransactionExecutionContext,
+# ) -> Tuple[CairoFunctionRunner, syscall_utils.BusinessLogicSysCallHandler]:
+#     """
+#     Runs the selected entry point with the given calldata in the code of the contract deployed
+#     at self.code_address.
+#     The execution is done in the context (e.g., storage) of the contract at
+#     self.contract_address.
+#     Returns the corresponding CairoFunctionRunner and BusinessLogicSysCallHandler in order to
+#     retrieve the execution information.
+#     """
+#     # Prepare input for Cairo function runner.
+#     class_hash = self._get_code_class_hash(state=state)
+
+#     # Hack to prevent version 0 attack on argent accounts.
+#     if (tx_execution_context.version == 0) and (class_hash == FAULTY_CLASS_HASH):
+#         raise StarkException(
+#             code=StarknetErrorCode.TRANSACTION_FAILED, message="Fraud attempt blocked."
+#         )
+
+#     contract_class = state.get_contract_class(class_hash=class_hash)
+#     contract_class.validate()
+
+#     entry_point = self._get_selected_entry_point(
+#         contract_class=contract_class, class_hash=class_hash
+#     )
+
+#     # Run the specified contract entry point with given calldata.
+#     with wrap_with_stark_exception(code=StarknetErrorCode.SECURITY_ERROR):
+#         runner = cairo_rs_py.CairoRunner(  # pylint: disable=no-member
+#             program=contract_class.program.dumps(),
+#             entrypoint=None,
+#             layout="all",
+#             proof_mode=False,
+#         )
+#         runner.initialize_function_runner()
+#     os_context = os_utils.prepare_os_context(runner=runner)
+
+#     validate_contract_deployed(state=state, contract_address=self.contract_address)
+
+#     initial_syscall_ptr = cast(
+#         RelocatableValue, os_context[starknet_abi.SYSCALL_PTR_OFFSET]
+#     )
+#     syscall_handler = syscall_utils.BusinessLogicSysCallHandler(
+#         execute_entry_point_cls=ExecuteEntryPoint,
+#         tx_execution_context=tx_execution_context,
+#         state=state,
+#         resources_manager=resources_manager,
+#         caller_address=self.caller_address,
+#         contract_address=self.contract_address,
+#         general_config=general_config,
+#         initial_syscall_ptr=initial_syscall_ptr,
+#     )
+
+#     # Positional arguments are passed to *args in the 'run_from_entrypoint' function.
+#     entry_points_args = [
+#         self.entry_point_selector,
+#         os_context,
+#         len(self.calldata),
+#         # Allocate and mark the segment as read-only (to mark every input array as read-only).
+#         syscall_handler._allocate_segment(segments=runner.segments, data=self.calldata),
+#     ]
+
+#     try:
+#         runner.run_from_entrypoint(
+#             entry_point.offset,
+#             entry_points_args,
+#             hint_locals={
+#                 "syscall_handler": syscall_handler,
+#             },
+#             static_locals={
+#                 "__find_element_max_size": 2**20,
+#                 "__squash_dict_max_size": 2**20,
+#                 "__keccak_max_size": 2**20,
+#                 "__usort_max_size": 2**20,
+#                 "__chained_ec_op_max_len": 1000,
+#             },
+#             run_resources=tx_execution_context.run_resources,
+#             verify_secure=True,
+#         )
+#     except VmException as exception:
+#         code: ErrorCode = StarknetErrorCode.TRANSACTION_FAILED
+
+#         if isinstance(exception.inner_exc, syscall_utils.HandlerException):
+#             stark_exception = exception.inner_exc.stark_exception
+#             code = stark_exception.code
+#             called_contract_address = exception.inner_exc.called_contract_address
+#             message_prefix = (
+#                 f"Error in the called contract ({hex(called_contract_address)}):\n"
+#             )
+#             # Override python's traceback and keep the Cairo one of the inner exception.
+#             exception.notes = [message_prefix + str(stark_exception.message)]
+#         if isinstance(exception.inner_exc, ResourcesError):
+#             code = StarknetErrorCode.OUT_OF_RESOURCES
+#         raise StarkException(code=code, message=str(exception)) from exception
+#     except VmExceptionBase as exception:
+#         raise StarkException(
+#             code=StarknetErrorCode.TRANSACTION_FAILED, message=str(exception)
+#         ) from exception
+#     except SecurityError as exception:
+#         raise StarkException(
+#             code=StarknetErrorCode.SECURITY_ERROR, message=str(exception)
+#         ) from exception
+#     except Exception as exception:
+#         logger.error("Got an unexpected exception.", exc_info=True)
+#         raise StarkException(
+#             code=StarknetErrorCode.UNEXPECTED_FAILURE,
+#             message="Got an unexpected exception during the execution of the transaction.",
+#         ) from exception
+
+#     # Complete handler validations.
+#     os_utils.validate_and_process_os_context(
+#         runner=runner,
+#         syscall_handler=syscall_handler,
+#         initial_os_context=os_context,
+#     )
+
+#     # When execution starts the stack holds entry_points_args + [ret_fp, ret_pc].
+#     args_ptr = runner.initial_fp - (len(entry_points_args) + 2)
+
+#     # The arguments are touched by the OS and should not be counted as holes, mark them
+#     # as accessed.
+#     assert isinstance(args_ptr, RelocatableValue)  # Downcast.
+#     runner.mark_as_accessed(address=args_ptr, size=len(entry_points_args))
+
+#     return runner, syscall_handler
+
+
+# def cairo_rs_py_compute_class_hash_inner(
+#     contract_class: ContractClass,
+#     hash_func: Callable[[int, int], int],  # pylint: disable=unused-argument
+# ) -> int:
+#     program = load_program()
+#     contract_class_struct = get_contract_class_struct(
+#         identifiers=program.identifiers, contract_class=contract_class
+#     )
+
+#     runner = cairo_rs_py.CairoRunner(  # pylint: disable=no-member
+#         program=program.dumps(), entrypoint=None, layout="all", proof_mode=False
+#     )
+#     runner.initialize_function_runner()
+#     hash_ptr = runner.add_additional_hash_builtin()
+
+#     run_function_runner(
+#         runner,
+#         program,
+#         "starkware.starknet.core.os.contracts.class_hash",
+#         hash_ptr=hash_ptr,
+#         contract_class=contract_class_struct,
+#         use_full_name=True,
+#         verify_secure=False,
+#     )
+#     _, class_hash = runner.get_return_values(2)
+#     return class_hash
+
+
+# def run_function_runner(
+#     runner,
+#     program,
+#     func_name: str,
+#     *args,
+#     hint_locals: Optional[Dict[str, Any]] = None,
+#     static_locals: Optional[Dict[str, Any]] = None,
+#     verify_secure: Optional[bool] = None,
+#     trace_on_failure: bool = False,
+#     apply_modulo_to_args: Optional[bool] = None,
+#     use_full_name: bool = False,
+#     verify_implicit_args_segment: bool = False,
+#     **kwargs,
+# ) -> Tuple[Tuple[MaybeRelocatable, ...], Tuple[MaybeRelocatable, ...]]:
+#     """
+#     Runs func_name(*args).
+#     args are converted to Cairo-friendly ones using gen_arg.
+
+#     Returns the return values of the function, splitted into 2 tuples of implicit values and
+#     explicit values. Structs will be flattened to a sequence of felts as part of the returned
+#     tuple.
+
+#     Additional params:
+#     verify_secure - Run verify_secure_runner to do extra verifications.
+#     trace_on_failure - Run the tracer in case of failure to help debugging.
+#     apply_modulo_to_args - Apply modulo operation on integer arguments.
+#     use_full_name - Treat 'func_name' as a fully qualified identifier name, rather than a
+#       relative one.
+#     verify_implicit_args_segment - For each implicit argument, verify that the argument and the
+#       return value are in the same segment.
+#     """
+#     assert isinstance(program, Program)
+#     entrypoint = program.get_label(func_name, full_name_lookup=use_full_name)
+
+#     structs_factory = CairoStructFactory.from_program(program=program)
+#     func = ScopedName.from_string(scope=func_name)
+
+#     full_args_struct = structs_factory.build_func_args(func=func)
+#     all_args = full_args_struct(*args, **kwargs)  # pylint: disable=not-callable
+
+#     try:
+#         runner.run_from_entrypoint(
+#             entrypoint,
+#             all_args,
+#             typed_args=True,
+#             hint_locals=hint_locals,
+#             static_locals=static_locals,
+#             verify_secure=verify_secure,
+#             apply_modulo_to_args=apply_modulo_to_args,
+#         )
+#     except (VmException, SecurityError, AssertionError) as ex:
+#         if trace_on_failure:  # Unreachable code
+#             print(
+#                 f"""\
+# Got {type(ex).__name__} exception during the execution of {func_name}:
+# {str(ex)}
+# """
+#             )
+#             # trace_runner(runner=runner)
+#         raise
+
+#     # The number of implicit arguments is identical to the number of implicit return values.
+#     n_implicit_ret_vals = structs_factory.get_implicit_args_length(func=func)
+#     n_explicit_ret_vals = structs_factory.get_explicit_return_values_length(func=func)
+#     n_ret_vals = n_explicit_ret_vals + n_implicit_ret_vals
+#     implicit_retvals = tuple(
+#         runner.get_range(runner.get_ap() - n_ret_vals, n_implicit_ret_vals)
+#     )
+
+#     explicit_retvals = tuple(
+#         runner.get_range(runner.get_ap() - n_explicit_ret_vals, n_explicit_ret_vals)
+#     )
+
+#     # Verify the memory segments of the implicit arguments.
+#     if verify_implicit_args_segment:
+#         implicit_args = all_args[:n_implicit_ret_vals]
+#         for implicit_arg, implicit_retval in safe_zip(implicit_args, implicit_retvals):
+#             assert isinstance(
+#                 implicit_arg, RelocatableValue
+#             ), f"Implicit arguments must be RelocatableValues, {implicit_arg} is not."
+#             assert isinstance(implicit_retval, RelocatableValue), (
+#                 f"Argument {implicit_arg} is a RelocatableValue, but the returned value "
+#                 f"{implicit_retval} is not."
+#             )
+#             assert implicit_arg.segment_index == implicit_retval.segment_index, (
+#                 f"Implicit argument {implicit_arg} is not on the same segment as the returned "
+#                 f"{implicit_retval}."
+#             )
+#             assert implicit_retval.offset >= implicit_arg.offset, (
+#                 f"The offset of the returned implicit argument {implicit_retval} is less than "
+#                 f"the offset of the input {implicit_arg}."
+#             )
+
+#     return implicit_retvals, explicit_retvals
+
+
+# def cairo_rs_py_prepare_os_context(
+#     runner: CairoFunctionRunner,
+# ) -> List[MaybeRelocatable]:
+#     syscall_segment = runner.add_segment()
+#     os_context: List[MaybeRelocatable] = [syscall_segment]
+#     os_context.extend(runner.get_program_builtins_initial_stack())
+
+#     return os_context
+
+
+# def cairo_rs_py_validate_and_process_os_context(
+#     runner: CairoFunctionRunner,
+#     syscall_handler: syscall_utils.BusinessLogicSysCallHandler,
+#     initial_os_context: List[MaybeRelocatable],
+# ):
+#     """
+#     Validates and processes an OS context that was returned by a transaction.
+#     Returns the syscall processor object containing the accumulated syscall information.
+#     """
+#     os_context_end = runner.get_ap() - 2
+#     stack_ptr = os_context_end
+#     # The returned values are os_context, retdata_size, retdata_ptr.
+#     stack_ptr = runner.get_builtins_final_stack(stack_ptr)
+
+#     final_os_context_ptr = stack_ptr - 1
+#     assert final_os_context_ptr + len(initial_os_context) == os_context_end
+
+#     # Validate system calls.
+#     syscall_base_ptr, syscall_stop_ptr = segment_utils.get_os_segment_ptr_range(
+#         runner=runner, ptr_offset=SYSCALL_PTR_OFFSET, os_context=initial_os_context
+#     )
+
+#     segment_utils.validate_segment_pointers(
+#         segments=runner.segments,
+#         segment_base_ptr=syscall_base_ptr,
+#         segment_stop_ptr=syscall_stop_ptr,
+#     )
+#     syscall_handler.post_run(runner=runner, syscall_stop_ptr=syscall_stop_ptr)
+
+
+# def cairo_rs_py_get_runtime_type(
+#     cairo_type: CairoType,
+# ) -> Union[Type[int], Type[RelocatableValue]]:
+#     """
+#     Given a CairoType returns the expected runtime type.
+#     """
+
+#     if isinstance(cairo_type, TypeFelt):
+#         return int
+#     if isinstance(cairo_type, TypePointer) and isinstance(cairo_type.pointee, TypeFelt):
+#         return RelocatableValue
+
+#     raise NotImplementedError(f"Unexpected type: {cairo_type.format()}.")
+
+
+# def handler_exception__str__(self) -> str:
+#     return self.stark_exception.message
+
+
+# def cairo_rs_py_validate_segment_pointers(
+#     segments: MemorySegmentManager,
+#     segment_base_ptr: MaybeRelocatable,
+#     segment_stop_ptr: MaybeRelocatable,
+# ):
+#     assert isinstance(segment_base_ptr, RelocatableValue)
+#     assert (
+#         segment_base_ptr.offset == 0
+#     ), f"Segment base pointer must be zero; got {segment_base_ptr.offset}."
+
+#     expected_stop_ptr = segment_base_ptr + segments.get_segment_used_size(
+#         segment_base_ptr.segment_index
+#     )
+
+#     stark_assert(
+#         expected_stop_ptr == segment_stop_ptr,
+#         code=StarknetErrorCode.SECURITY_ERROR,
+#         message=(
+#             f"Invalid stop pointer for segment. "
+#             f"Expected: {expected_stop_ptr}, found: {segment_stop_ptr}."
+#         ),
+#     )
+
+
+# def cairo_rs_py_monkeypatch():
+#     setattr(ExecuteEntryPoint, "_run", cairo_rs_py_run)
+#     setattr(
+#         sys.modules["starkware.starknet.core.os.class_hash"],
+#         "class_hash_inner",
+#         cairo_rs_py_compute_class_hash_inner,
+#     )
+#     setattr(
+#         sys.modules["starkware.starknet.core.os.os_utils"],
+#         "prepare_os_context",
+#         cairo_rs_py_prepare_os_context,
+#     )
+#     setattr(
+#         sys.modules["starkware.starknet.core.os.os_utils"],
+#         "validate_and_process_os_context",
+#         cairo_rs_py_validate_and_process_os_context,
+#     )
+#     setattr(
+#         sys.modules["starkware.starknet.core.os.segment_utils"],
+#         "validate_segment_pointers",
+#         cairo_rs_py_validate_segment_pointers,
+#     )
+#     setattr(
+#         sys.modules["starkware.starknet.core.os.syscall_utils"],
+#         "get_runtime_type",
+#         cairo_rs_py_get_runtime_type,
+#     )
+#     setattr(syscall_utils.HandlerException, "__str__", handler_exception__str__)
diff --git a/starknet_devnet/constants.py b/starknet_devnet/constants.py
index 50f1bc75a..fa6789006 100644
--- a/starknet_devnet/constants.py
+++ b/starknet_devnet/constants.py
@@ -1,10 +1,6 @@
 """Constants used across the project."""
 
-try:
-    from importlib_metadata import version
-except ImportError:
-    # >= py 3.8
-    from importlib.metadata import version
+from importlib.metadata import version
 
 CAIRO_LANG_VERSION = version("cairo-lang")
 TIMEOUT_FOR_WEB3_REQUESTS = 120  # seconds
@@ -30,7 +26,12 @@
 
 # account used by Starknet CLI
 STARKNET_CLI_ACCOUNT_CLASS_HASH = (
-    0x6F500F527355DFDB8093C7FE46E6F73C96A867392B49FA4157A757538928539
+    0x6F3EC04229F8F9663EE7D5BB9D2E06F213BA8C20EB34C58C25A54EF8FC591CB
+)
+
+# starkware.starknet.public.abi.get_selector_from_name("replace_class")
+REPLACE_CLASS_SELECTOR = (
+    0x217DF192877EED2921E241046523F8D8DA7981F0A3DDAFE0E7517F6523276D2
 )
 
 LEGACY_RPC_TX_VERSION = 0
diff --git a/starknet_devnet/contract_class_wrapper.py b/starknet_devnet/contract_class_wrapper.py
index 7eb1fae90..61216ce3a 100644
--- a/starknet_devnet/contract_class_wrapper.py
+++ b/starknet_devnet/contract_class_wrapper.py
@@ -1,18 +1,19 @@
-"""Starknet ContractClass wrapper utilities"""
+"""Starknet CompiledClassBase wrapper utilities"""
 
 import os
 from dataclasses import dataclass
 
-from starkware.python.utils import to_bytes
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClassBase,
+)
 
 
 @dataclass
-class ContractClassWrapper:
-    """Wrapper of ContractClass"""
+class CompiledClassWrapper:
+    """Wrapper of CompiledClassBase"""
 
-    contract_class: ContractClass
-    hash_bytes: bytes
+    contract_class: CompiledClassBase
+    hash: int
 
 
 DEFAULT_ACCOUNT_PATH = os.path.abspath(
@@ -26,6 +27,5 @@ class ContractClassWrapper:
         "Account.json",
     )
 )
-DEFAULT_ACCOUNT_HASH_BYTES = to_bytes(
-    2177626953842241688342849477958144159584215338353441986251810208376165874783
-)
+
+DEFAULT_ACCOUNT_HASH = 0x4D07E40E93398ED3C76981E72DD1FD22557A78CE36C0515F679E27F0BB5BC5F
diff --git a/starknet_devnet/devnet_config.py b/starknet_devnet/devnet_config.py
index fdf017171..0de932c14 100644
--- a/starknet_devnet/devnet_config.py
+++ b/starknet_devnet/devnet_config.py
@@ -12,10 +12,13 @@
 from aiohttp.client_exceptions import ClientConnectorError, InvalidURL
 from marshmallow.exceptions import ValidationError
 from services.external_api.client import BadRequest, RetryConfig
-from starkware.python.utils import to_bytes
-from starkware.starknet.core.os.class_hash import compute_class_hash
+from starkware.starknet.core.os.contract_class.deprecated_class_hash import (
+    compute_deprecated_class_hash,
+)
 from starkware.starknet.definitions.general_config import StarknetChainId
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.feeder_gateway.feeder_gateway_client import (
     FeederGatewayClient,
 )
@@ -30,9 +33,9 @@
     DEFAULT_TIMEOUT,
 )
 from .contract_class_wrapper import (
-    DEFAULT_ACCOUNT_HASH_BYTES,
+    DEFAULT_ACCOUNT_HASH,
     DEFAULT_ACCOUNT_PATH,
-    ContractClassWrapper,
+    CompiledClassWrapper,
 )
 
 NETWORK_TO_URL = {
@@ -103,7 +106,7 @@ def _parse_dump_on(option: str):
 EXPECTED_ACCOUNT_METHODS = ["__execute__", "__validate__", "__validate_declare__"]
 
 
-def _parse_account_class(class_path: str) -> ContractClassWrapper:
+def _parse_account_class(class_path: str) -> CompiledClassWrapper:
     """Parse account class"""
     class_path = os.path.abspath(class_path)
 
@@ -117,12 +120,12 @@ def _parse_account_class(class_path: str) -> ContractClassWrapper:
             sys.exit(f"Error: {class_path} is not a valid JSON file")
 
     try:
-        contract_class = ContractClass.load(loaded_dict)
+        contract_class = DeprecatedCompiledClass.load(loaded_dict)
     except ValidationError:
         sys.exit(f"Error: {class_path} is not a valid contract class artifact")
 
     if class_path == DEFAULT_ACCOUNT_PATH:
-        class_hash_bytes = DEFAULT_ACCOUNT_HASH_BYTES
+        class_hash = DEFAULT_ACCOUNT_HASH
     else:
         contract_methods = [entry["name"] for entry in contract_class.abi]
         missing_methods = [
@@ -132,9 +135,9 @@ def _parse_account_class(class_path: str) -> ContractClassWrapper:
             sys.exit(
                 f"Error: {class_path} is missing account methods: {', '.join(missing_methods)}"
             )
-        class_hash_bytes = to_bytes(compute_class_hash(contract_class))
+        class_hash = compute_deprecated_class_hash(contract_class)
 
-    return ContractClassWrapper(contract_class, class_hash_bytes)
+    return CompiledClassWrapper(contract_class, class_hash)
 
 
 def _get_feeder_gateway_client(url: str, block_id: str, n_retries: int = 1):
diff --git a/starknet_devnet/fee_token.py b/starknet_devnet/fee_token.py
index ae913fbdb..216ba79bf 100644
--- a/starknet_devnet/fee_token.py
+++ b/starknet_devnet/fee_token.py
@@ -2,10 +2,13 @@
 Fee token and its predefined constants.
 """
 
-from starkware.python.utils import to_bytes
 from starkware.solidity.utils import load_nearby_contract
+from starkware.starknet.business_logic.transaction.objects import InternalInvokeFunction
 from starkware.starknet.compiler.compile import get_selector_from_name
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClassBase,
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.gateway.transaction import InvokeFunction
 from starkware.starknet.testing.starknet import Starknet
 
@@ -13,19 +16,17 @@
 from starknet_devnet.chargeable_account import ChargeableAccount
 from starknet_devnet.constants import SUPPORTED_TX_VERSION
 from starknet_devnet.predeployed_contract_wrapper import PredeployedContractWrapper
-from starknet_devnet.sequencer_api_utils import InternalInvokeFunction
 from starknet_devnet.util import Uint256, str_to_felt
 
 
 class FeeToken(PredeployedContractWrapper):
     """Wrapper of token for charging fees."""
 
-    CONTRACT_CLASS: ContractClass = None  # loaded lazily
+    CONTRACT_CLASS: CompiledClassBase = None  # loaded lazily
 
     # Precalculated
-    # HASH = to_bytes(compute_class_hash(contract_class=FeeToken.get_contract_class()))
+    # HASH = compute_deprecated_class_hash(contract_class=FeeToken.get_contract_class())
     HASH = 0x6A22BF63C7BC07EFFA39A25DFBD21523D211DB0100A0AFD054D172B81840EAF
-    HASH_BYTES = to_bytes(HASH)
 
     # Taken from
     # https://github.com/starknet-community-libs/starknet-addresses/blob/df19b17d2c83f11c30e65e2373e8a0c65446f17c/bridged_tokens/goerli.json
@@ -36,19 +37,19 @@ class FeeToken(PredeployedContractWrapper):
     def __init__(self, starknet_wrapper):
         self.starknet_wrapper = starknet_wrapper
         self.address = self.ADDRESS
-        self.class_hash_bytes = self.HASH_BYTES
+        self.class_hash = self.HASH
 
     @classmethod
-    def get_contract_class(cls):
+    def get_contract_class(cls) -> CompiledClassBase:
         """Returns contract class via lazy loading."""
         if not cls.CONTRACT_CLASS:
-            cls.CONTRACT_CLASS = ContractClass.load(
+            cls.CONTRACT_CLASS = DeprecatedCompiledClass.load(
                 load_nearby_contract("ERC20_Mintable_OZ_0.2.0")
             )
         return cls.CONTRACT_CLASS
 
     @property
-    def contract_class(self) -> ContractClass:
+    def contract_class(self) -> DeprecatedCompiledClass:
         """Same as `get_contract_class`, used by `PredeployedContractWrapper` parent"""
         return self.get_contract_class()
 
diff --git a/starknet_devnet/forked_state.py b/starknet_devnet/forked_state.py
index 419e4ab1e..8ace0cd4f 100644
--- a/starknet_devnet/forked_state.py
+++ b/starknet_devnet/forked_state.py
@@ -4,12 +4,19 @@
 import json
 
 from services.external_api.client import BadRequest
-from starkware.python.utils import to_bytes
 from starkware.starknet.business_logic.state.state import BlockInfo, CachedState
 from starkware.starknet.business_logic.state.state_api import StateReader
+from starkware.starknet.core.os.contract_class.compiled_class_hash import (
+    compute_compiled_class_hash,
+)
 from starkware.starknet.definitions.constants import UNINITIALIZED_CLASS_HASH
+from starkware.starknet.definitions.error_codes import StarknetErrorCode
 from starkware.starknet.definitions.general_config import StarknetChainId
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClass,
+    CompiledClassBase,
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.feeder_gateway.feeder_gateway_client import (
     FeederGatewayClient,
 )
@@ -19,6 +26,7 @@
 
 from .block_info_generator import now
 from .general_config import build_devnet_general_config
+from .util import StarknetDevnetException
 
 
 def is_originally_starknet_exception(exc: BadRequest):
@@ -35,6 +43,18 @@ def is_originally_starknet_exception(exc: BadRequest):
         return False
 
 
+def _extract_original_stark_exception(exc: BadRequest):
+    exc_dict = json.loads(exc.text)
+    return StarkException(code=exc_dict["code"], message=exc_dict["message"])
+
+
+def _load_compiled_class(class_dict: dict) -> CompiledClassBase:
+    try:
+        return CompiledClass.load(class_dict)
+    except StarkException:
+        return DeprecatedCompiledClass.load(class_dict)
+
+
 class ForkedStateReader(StateReader):
     """State with a fallback to a forked origin"""
 
@@ -46,32 +66,74 @@ def __init__(
         self.__feeder_gateway_client = feeder_gateway_client
         self.__block_number = block_number
 
-    async def get_contract_class(self, class_hash: bytes) -> ContractClass:
+    async def _get_class_by_hash(self, class_hash: int) -> CompiledClassBase:
         try:
             with contextlib.redirect_stderr(None):
-                class_hash_hex = "0x" + class_hash.hex()
-                contract_class_dict = (
-                    await self.__feeder_gateway_client.get_class_by_hash(class_hash_hex)
+                class_dict = await self.__feeder_gateway_client.get_class_by_hash(
+                    class_hash=hex(class_hash), block_number=self.__block_number
                 )
-                return ContractClass.load(contract_class_dict)
+            return _load_compiled_class(class_dict)
         except BadRequest as bad_request:
-            original_error = StarkException(**json.loads(bad_request.text))
-            raise original_error from bad_request
+            if is_originally_starknet_exception(bad_request):
+                original_error = _extract_original_stark_exception(bad_request)
+                raise original_error from bad_request
+            raise
 
-    async def _get_raw_contract_class(self, class_hash: bytes) -> bytes:
-        raise NotImplementedError
+    async def get_compiled_class(self, compiled_class_hash: int) -> CompiledClassBase:
+        try:
+            with contextlib.redirect_stderr(None):
+                compiled_class_dict = (
+                    await self.__feeder_gateway_client.get_compiled_class_by_class_hash(
+                        hex(compiled_class_hash),
+                        block_number=self.__block_number,
+                    )
+                )
+            return CompiledClass.load(compiled_class_dict)
+        except BadRequest as bad_request:
+            if is_originally_starknet_exception(bad_request):
+                original_error = _extract_original_stark_exception(bad_request)
+                if original_error.code == str(StarknetErrorCode.UNDECLARED_CLASS):
+                    return await self._get_class_by_hash(compiled_class_hash)
+                raise original_error from bad_request
+            raise
+
+    async def get_compiled_class_hash(self, class_hash: int) -> int:
+        try:
+            with contextlib.redirect_stderr(None):
+                compiled_class_dict = (
+                    await self.__feeder_gateway_client.get_compiled_class_by_class_hash(
+                        hex(class_hash),
+                        block_number=self.__block_number,
+                    )
+                )
+            compiled_class = CompiledClassBase.load(compiled_class_dict)
+        except BadRequest as bad_request:
+            if is_originally_starknet_exception(bad_request):
+                original_error = _extract_original_stark_exception(bad_request)
+                if original_error.code == str(StarknetErrorCode.UNDECLARED_CLASS):
+                    return 0
+                raise original_error from bad_request
+            raise
+
+        if isinstance(compiled_class, CompiledClass):
+            return compute_compiled_class_hash(compiled_class)
+
+        raise StarknetDevnetException(
+            code=StarknetErrorCode.INVALID_CONTRACT_CLASS,
+            message=f"Cannot get compiled class hash for class of type {type(compiled_class)}",
+        )
 
-    async def get_class_hash_at(self, contract_address: int) -> bytes:
+    async def get_class_hash_at(self, contract_address: int) -> int:
         try:
             with contextlib.redirect_stderr(None):
                 class_hash_hex = await self.__feeder_gateway_client.get_class_hash_at(
                     contract_address=contract_address,
                     block_number=self.__block_number,
                 )
-            return to_bytes(int(class_hash_hex, 16))
+            return int(class_hash_hex, 16)
         except BadRequest as bad_request:
             if is_originally_starknet_exception(bad_request):
-                return UNINITIALIZED_CLASS_HASH
+                return int.from_bytes(UNINITIALIZED_CLASS_HASH, "big")
             raise
 
     async def get_nonce_at(self, contract_address: int) -> int:
diff --git a/starknet_devnet/general_config.py b/starknet_devnet/general_config.py
index 2a3d03641..034d90c0e 100644
--- a/starknet_devnet/general_config.py
+++ b/starknet_devnet/general_config.py
@@ -22,14 +22,16 @@ def build_devnet_general_config(chain_id: StarknetChainId):
             "cairo_resource_fee_weights": {
                 "n_steps": constants.N_STEPS_FEE_WEIGHT,
             },
+            "compiled_class_hash_commitment_tree_height": constants.COMPILED_CLASS_HASH_COMMITMENT_TREE_HEIGHT,
             "contract_storage_commitment_tree_height": constants.CONTRACT_STATES_COMMITMENT_TREE_HEIGHT,
+            "enforce_l1_handler_fee": True,
             "event_commitment_tree_height": constants.EVENT_COMMITMENT_TREE_HEIGHT,
             "global_state_commitment_tree_height": constants.CONTRACT_ADDRESS_BITS,
             "invoke_tx_max_n_steps": DEFAULT_MAX_STEPS,
             "min_gas_price": DEFAULT_GAS_PRICE,
             "sequencer_address": hex(DEFAULT_SEQUENCER_ADDRESS),
             "starknet_os_config": {
-                "chain_id": chain_id.name,
+                "chain_id": chain_id.value,
                 "fee_token_address": hex(FeeToken.ADDRESS),
             },
             "tx_version": SUPPORTED_TX_VERSION,
diff --git a/starknet_devnet/origin.py b/starknet_devnet/origin.py
index 63cfafefc..7bd392680 100644
--- a/starknet_devnet/origin.py
+++ b/starknet_devnet/origin.py
@@ -16,7 +16,7 @@
 )
 
 from starknet_devnet.forked_state import is_originally_starknet_exception
-from starknet_devnet.util import StarknetDevnetException
+from starknet_devnet.util import StarknetDevnetException, UndeclaredClassDevnetException
 
 
 class Origin:
@@ -56,13 +56,19 @@ def get_number_of_blocks(self):
 
     async def get_state_update(
         self, block_hash: str = None, block_number: int = None
-    ) -> dict or None:
+    ) -> dict:
         """
         Returns the state update for provided block hash or block number.
         If none are provided return the last state update
         """
         raise NotImplementedError
 
+    async def get_class_by_hash(
+        self, class_hash: int, block_number: int = None
+    ) -> dict:
+        """Return DeprecatedCompiledClass for cairo0 contracts and ContractClass for cairo1 contracts"""
+        raise NotImplementedError
+
 
 class NullOrigin(Origin):
     """
@@ -118,7 +124,7 @@ def get_number_of_blocks(self):
 
     async def get_state_update(
         self, block_hash: str = None, block_number: int = None
-    ) -> dict or None:
+    ) -> dict:
         if block_hash:
             error_message = (
                 f"No state updates saved for the provided block hash {block_hash}"
@@ -135,6 +141,11 @@ async def get_state_update(
                 code=StarknetErrorCode.BLOCK_NOT_FOUND, message=error_message
             )
 
+    async def get_class_by_hash(
+        self, class_hash: int, block_number: int = None
+    ) -> dict:
+        raise UndeclaredClassDevnetException(class_hash)
+
 
 class ForkedOrigin(Origin):
     """
@@ -198,7 +209,7 @@ def get_number_of_blocks(self):
 
     async def get_state_update(
         self, block_hash: str = None, block_number: int = None
-    ) -> dict or None:
+    ) -> dict:
         try:
             return await self.__feeder_gateway_client.get_state_update(
                 block_hash=block_hash,
@@ -210,3 +221,16 @@ async def get_state_update(
                     code=StarknetErrorCode.BLOCK_NOT_FOUND,
                     message=f"Block hash {block_hash} does not exist.",
                 ) from bad_request
+            raise
+
+    async def get_class_by_hash(
+        self, class_hash: int, block_number: int = None
+    ) -> dict:
+        try:
+            return await self.__feeder_gateway_client.get_class_by_hash(
+                hex(class_hash), block_number=block_number
+            )
+        except BadRequest as bad_request:
+            if is_originally_starknet_exception(bad_request):
+                raise UndeclaredClassDevnetException(class_hash) from bad_request
+            raise
diff --git a/starknet_devnet/postman_wrapper.py b/starknet_devnet/postman_wrapper.py
index 65a28df1e..876d420b2 100644
--- a/starknet_devnet/postman_wrapper.py
+++ b/starknet_devnet/postman_wrapper.py
@@ -3,6 +3,7 @@
 """
 import json
 from abc import ABC, abstractmethod
+from typing import Tuple
 
 from starkware.eth.eth_test_utils import EthAccount, EthContract
 from starkware.solidity.utils import load_nearby_contract
@@ -98,7 +99,7 @@ def load_l1_messaging_contract(
             "address": self.__postman_wrapper.mock_starknet_messaging_contract.address,
         }
 
-    async def flush(self, state) -> dict:
+    async def flush(self, state) -> Tuple[dict, list]:
         """Handles all pending L1 <> L2 messages and sends them to the other layer."""
 
         if self.__postman_wrapper is None:
@@ -207,6 +208,7 @@ async def _handle_l1_to_l2_messages(self):
                 calldata=[int(args["fromAddress"], 16), *args["payload"]],
                 nonce=args["nonce"],
                 chain_id=self.starknet.state.general_config.chain_id.value,
+                paid_fee_on_l1=args["fee"],
             )
             transactions_to_execute.append(transaction)
             self.mock_starknet_messaging_contract.mockConsumeMessageToL2.transact(
diff --git a/starknet_devnet/predeployed_contract_wrapper.py b/starknet_devnet/predeployed_contract_wrapper.py
index 190bb06f9..1343c3c19 100644
--- a/starknet_devnet/predeployed_contract_wrapper.py
+++ b/starknet_devnet/predeployed_contract_wrapper.py
@@ -1,7 +1,9 @@
 """Parent for predeployed contract wrapper classes"""
 from abc import ABC
 
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.testing.contract import StarknetContract
 from starkware.starknet.testing.starknet import Starknet
 
@@ -14,8 +16,8 @@ class PredeployedContractWrapper(ABC):
 
     starknet_wrapper: "StarknetWrapper"
     address: int
-    class_hash_bytes: bytes
-    contract_class: ContractClass
+    contract_class: DeprecatedCompiledClass
+    class_hash: int
 
     # Value will be set by deploy
     contract: StarknetContract
@@ -27,17 +29,15 @@ async def deploy(self):
         """Deploy the contract wrapper to devnet"""
         starknet: Starknet = self.starknet_wrapper.starknet
 
-        await starknet.state.state.set_contract_class(
-            self.class_hash_bytes, self.contract_class
-        )
+        # declare
+        starknet.state.state.contract_classes[self.class_hash] = self.contract_class
 
         # pylint: disable=protected-access
-        starknet: Starknet = self.starknet_wrapper.starknet
-        starknet.state.state.cache._class_hash_writes[
-            self.address
-        ] = self.class_hash_bytes
+        self.starknet_wrapper._contract_classes[self.class_hash] = self.contract_class
+
+        starknet.state.state.cache._class_hash_writes[self.address] = self.class_hash
         # replace with await starknet.state.state.deploy_contract
-        # await starknet.state.state.deploy_contract(self.address, self.class_hash_bytes)
+        # await starknet.state.state.deploy_contract(self.address, self.class_hash)
         # For now, it fails for fee token since the address is the same as the
         # ETH Token, see:
         # https://starkscan.co/token/0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7:
diff --git a/starknet_devnet/sequencer_api_utils.py b/starknet_devnet/sequencer_api_utils.py
deleted file mode 100644
index 4e6261f6f..000000000
--- a/starknet_devnet/sequencer_api_utils.py
+++ /dev/null
@@ -1,126 +0,0 @@
-"""
-Copied from https://github.com/starkware-libs/cairo-lang/blob/v0.10.0-pre/src/starkware/starknet/services/utils/sequencer_api_utils.py
-"""
-
-# pylint: disable=too-many-ancestors
-
-from typing import Optional, Tuple, Type
-
-from services.everest.api.gateway.transaction import EverestTransaction
-from starkware.starknet.business_logic.execution.objects import (
-    CallInfo,
-    ResourcesMapping,
-)
-from starkware.starknet.business_logic.state.state_api import SyncState
-from starkware.starknet.business_logic.transaction.fee import calculate_tx_fee
-from starkware.starknet.business_logic.transaction.objects import (
-    InternalAccountTransaction,
-    InternalDeclare,
-    InternalDeployAccount,
-    InternalInvokeFunction,
-    InternalTransaction,
-)
-from starkware.starknet.business_logic.utils import verify_version
-from starkware.starknet.definitions.general_config import StarknetGeneralConfig
-from starkware.starknet.services.api.feeder_gateway.response_objects import (
-    FeeEstimationInfo,
-)
-from starkware.starknet.services.api.gateway.transaction import (
-    AccountTransaction,
-    Declare,
-    DeployAccount,
-    InvokeFunction,
-)
-from starkware.starkware_utils.config_base import Config
-
-from starknet_devnet.constants import OLD_SUPPORTED_VERSIONS
-
-
-def format_fee_info(gas_price: int, overall_fee: int) -> FeeEstimationInfo:
-    """Construct a FeeEstimationInfo object"""
-    return FeeEstimationInfo(
-        overall_fee=overall_fee, gas_price=gas_price, gas_usage=overall_fee // gas_price
-    )
-
-
-class InternalAccountTransactionForSimulate(InternalAccountTransaction):
-    """
-    Represents an internal transaction in the Starknet network for the simulate transaction API.
-    """
-
-    @classmethod
-    def from_external(
-        cls, external_tx: EverestTransaction, general_config: Config
-    ) -> InternalTransaction:
-        """
-        Returns an internal transaction for simulation, generated based on an external one.
-        """
-        # Downcast arguments to application-specific types.
-        assert isinstance(external_tx, AccountTransaction)
-        assert isinstance(general_config, StarknetGeneralConfig)
-
-        internal_cls: Type[InternalAccountTransactionForSimulate]
-        if isinstance(external_tx, InvokeFunction):
-            internal_cls = InternalInvokeFunctionForSimulate
-        elif isinstance(external_tx, Declare):
-            internal_cls = InternalDeclareForSimulate
-        elif isinstance(external_tx, DeployAccount):
-            internal_cls = InternalDeployAccountForSimulate
-        else:
-            raise NotImplementedError(f"Unexpected type {type(external_tx).__name__}.")
-
-        # pylint: disable=protected-access
-        return internal_cls._specific_from_external(
-            external_tx=external_tx, general_config=general_config
-        )
-
-    def verify_version(self):
-        verify_version(
-            version=self.version,
-            only_query=True,
-            old_supported_versions=OLD_SUPPORTED_VERSIONS,
-        )
-
-    def charge_fee(
-        self,
-        state: SyncState,
-        resources: ResourcesMapping,
-        general_config: StarknetGeneralConfig,
-    ) -> Tuple[Optional[CallInfo], int]:
-        """
-        Overrides the charge fee method. Only calculates the actual fee and does not charge any fee.
-        """
-        actual_fee = calculate_tx_fee(
-            gas_price=state.block_info.gas_price,
-            resources=resources,
-            general_config=general_config,
-        )
-
-        return None, actual_fee
-
-
-class InternalInvokeFunctionForSimulate(
-    InternalAccountTransactionForSimulate, InternalInvokeFunction
-):
-    """
-    Represents an internal invoke function in the Starknet network for the simulate transaction API.
-    """
-
-
-class InternalDeclareForSimulate(
-    InternalAccountTransactionForSimulate, InternalDeclare
-):
-    """
-    Represents an internal declare in the Starknet network for the simulate transaction API.
-    """
-
-
-class InternalDeployAccountForSimulate(
-    InternalAccountTransactionForSimulate, InternalDeployAccount
-):
-    """
-    Represents an internal deploy account in the Starknet network for the simulate transaction API.
-    """
-
-    def verify_version(self):
-        verify_version(version=self.version, only_query=True, old_supported_versions=[])
diff --git a/starknet_devnet/starknet_wrapper.py b/starknet_devnet/starknet_wrapper.py
index dd4401599..2577cc263 100644
--- a/starknet_devnet/starknet_wrapper.py
+++ b/starknet_devnet/starknet_wrapper.py
@@ -22,12 +22,24 @@
 from starkware.starknet.core.os.contract_address.contract_address import (
     calculate_contract_address_from_hash,
 )
+from starkware.starknet.core.os.contract_class.compiled_class_hash import (
+    compute_compiled_class_hash,
+)
 from starkware.starknet.core.os.transaction_hash.transaction_hash import (
     calculate_deploy_transaction_hash,
 )
 from starkware.starknet.definitions.error_codes import StarknetErrorCode
 from starkware.starknet.definitions.transaction_type import TransactionType
-from starkware.starknet.services.api.contract_class import ContractClass, EntryPointType
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClass,
+    CompiledClassBase,
+    ContractClass,
+    DeprecatedCompiledClass,
+    EntryPointType,
+)
+from starkware.starknet.services.api.contract_class.contract_class_utils import (
+    compile_contract_class,
+)
 from starkware.starknet.services.api.feeder_gateway.request_objects import (
     CallFunction,
     CallL1Handler,
@@ -36,7 +48,8 @@
     LATEST_BLOCK_ID,
     PENDING_BLOCK_ID,
     BlockStateUpdate,
-    DeployedContract,
+    ClassHashPair,
+    ContractAddressHashPair,
     StarknetBlock,
     StateDiff,
     StorageEntry,
@@ -47,9 +60,13 @@
     Declare,
     Deploy,
     DeployAccount,
+    DeprecatedDeclare,
     InvokeFunction,
 )
 from starkware.starknet.services.api.messages import StarknetMessageToL1
+from starkware.starknet.services.utils.sequencer_api_utils import (
+    InternalInvokeFunctionForSimulate,
+)
 from starkware.starknet.testing.objects import FunctionInvocation
 from starkware.starknet.testing.starknet import Starknet
 from starkware.starknet.third_party.open_zeppelin.starknet_contracts import (
@@ -73,7 +90,6 @@
 from .general_config import build_devnet_general_config
 from .origin import ForkedOrigin, NullOrigin
 from .postman_wrapper import DevnetL1L2
-from .sequencer_api_utils import InternalInvokeFunctionForSimulate
 from .transactions import (
     DevnetTransaction,
     DevnetTransactions,
@@ -84,11 +100,16 @@
 from .udc import UDC
 from .util import (
     StarknetDevnetException,
+    UndeclaredClassDevnetException,
+    assert_not_declared,
+    assert_recompiled_class_hash,
     enable_pickling,
-    get_all_declared_contracts,
+    get_all_declared_cairo0_classes,
+    get_all_declared_cairo1_classes,
     get_fee_estimation_info,
+    get_replaced_classes,
     get_storage_diffs,
-    to_bytes,
+    group_classes_by_version,
     warn,
 )
 
@@ -126,6 +147,8 @@ def __init__(self, config: DevnetConfig):
         self.__udc = UDC(self)
         self.pending_txs: List[DevnetTransaction] = []
         self.__latest_state = None
+        self._contract_classes: Dict[int, Union[DeprecatedCompiledClass, ContractClass]]
+        """If v2 - store sierra, otherwise store old class; needed for get_class_by_hash"""
 
         if config.start_time is not None:
             self.set_block_time(config.start_time)
@@ -146,6 +169,7 @@ async def initialize(self):
             # ok that it's here so that e.g. reset includes reset of blocks
             self.blocks = DevnetBlocks(self.origin, lite=self.config.lite_mode)
 
+            self._contract_classes = {}
             await self.fee_token.deploy()
             await self.accounts.deploy()
             await self.__deploy_chargeable_account()
@@ -163,10 +187,10 @@ async def __create_genesis_block(self):
 
         # Declare transactions
         declare_hashes = [
-            to_bytes(FeeToken.HASH),
-            to_bytes(UDC.HASH),
-            self.config.account_class.hash_bytes,
-            to_bytes(STARKNET_CLI_ACCOUNT_CLASS_HASH),
+            FeeToken.HASH,
+            UDC.HASH,
+            self.config.account_class.hash,
+            STARKNET_CLI_ACCOUNT_CLASS_HASH,
         ]
         for class_hash in declare_hashes:
             internal_declare = create_empty_internal_declare(
@@ -180,12 +204,12 @@ async def __create_genesis_block(self):
 
         # Deploy transactions
         deploy_data = [
-            (to_bytes(FeeToken.HASH), FeeToken.ADDRESS),
-            (to_bytes(UDC.HASH), UDC.ADDRESS),
-            (self.config.account_class.hash_bytes, ChargeableAccount.ADDRESS),
+            (FeeToken.HASH, FeeToken.ADDRESS),
+            (UDC.HASH, UDC.ADDRESS),
+            (self.config.account_class.hash, ChargeableAccount.ADDRESS),
         ]
         for account in self.accounts:
-            deploy_data.append((account.class_hash_bytes, account.address))
+            deploy_data.append((account.class_hash, account.address))
 
         for class_hash, contract_address in deploy_data:
             internal_deploy = create_empty_internal_deploy(
@@ -249,10 +273,11 @@ def get_state(self):
         """
         return self.starknet.state
 
-    async def update_pending_state(
+    async def update_pending_state(  # pylint: disable=too-many-arguments
         self,
-        deployed_contracts: List[DeployedContract] = None,
-        explicitly_declared_contracts: List[int] = None,
+        deployed_contracts: List[ContractAddressHashPair] = None,
+        explicitly_declared_old: List[int] = None,
+        explicitly_declared: List[ClassHashPair] = None,
         visited_storage_entries: Set[StorageEntry] = None,
         nonces: Dict[int, int] = None,
     ):
@@ -261,7 +286,8 @@ async def update_pending_state(
         """
         # defaulting
         deployed_contracts = deployed_contracts or []
-        explicitly_declared_contracts = explicitly_declared_contracts or []
+        explicitly_declared_old = explicitly_declared_old or []
+        explicitly_declared = explicitly_declared or []
         visited_storage_entries = visited_storage_entries or set()
 
         # state update and preservation
@@ -274,16 +300,27 @@ async def update_pending_state(
         )
         await self.__preserve_current_state(current_state)
 
+        (
+            deployed_cairo0_contracts,
+            deployed_cairo1_contracts,
+        ) = await group_classes_by_version(deployed_contracts, current_state)
+
         # calculating diffs
-        declared_contracts = await get_all_declared_contracts(
-            previous_state, explicitly_declared_contracts, deployed_contracts
+        old_declared_contracts = await get_all_declared_cairo0_classes(
+            previous_state, explicitly_declared_old, deployed_cairo0_contracts
+        )
+        declared_classes = await get_all_declared_cairo1_classes(
+            previous_state, explicitly_declared, deployed_cairo1_contracts
         )
+        replaced = await get_replaced_classes(previous_state, current_state)
         storage_diffs = await get_storage_diffs(
             previous_state, current_state, visited_storage_entries
         )
         state_diff = StateDiff(
             deployed_contracts=deployed_contracts,
-            declared_contracts=declared_contracts,
+            old_declared_contracts=old_declared_contracts,
+            declared_classes=declared_classes,
+            replaced_classes=replaced,
             storage_diffs=storage_diffs,
             nonces=nonces or {},
         )
@@ -309,34 +346,61 @@ def _store_transaction(
 
         self.transactions.store(transaction.transaction_hash, transaction)
 
-    async def declare(self, external_tx: Declare) -> Tuple[int, int]:
+    async def declare(
+        self, external_tx: Union[Declare, DeprecatedDeclare]
+    ) -> Tuple[int, int]:
         """
         Declares the class specified with `declare_transaction`
         Returns (class_hash, transaction_hash)
         """
 
         state = self.get_state()
-        async with self.__get_transaction_handler(
-            external_tx=external_tx
-        ) as tx_handler:
+        async with self.__get_transaction_handler(external_tx) as tx_handler:
             tx_handler.internal_tx = InternalDeclare.from_external(
                 external_tx, state.general_config
             )
-            # calculate class hash here if execution fails
-            class_hash_int = int.from_bytes(tx_handler.internal_tx.class_hash, "big")
+            # extract class hash here if execution later fails
+            class_hash = tx_handler.internal_tx.class_hash
+
+            # this is done now (before excute_tx) so that later we can assert it hasn't been deployed
+            compiled_class_hash = await state.state.get_compiled_class_hash(class_hash)
+
+            # check if Declare v2
+            if isinstance(external_tx, Declare):
+                await assert_not_declared(class_hash, compiled_class_hash)
+                compiled_class_hash = tx_handler.internal_tx.compiled_class_hash
+                compiled_class = compile_contract_class(external_tx.contract_class)
+                compiled_class_hash_computed = compute_compiled_class_hash(
+                    compiled_class
+                )
+                assert_recompiled_class_hash(
+                    compiled_class_hash_computed, compiled_class_hash
+                )
 
-            tx_handler.execution_info = await state.execute_tx(tx_handler.internal_tx)
+                # Even though execute_tx is performed, class needs to be set explicitly
+                tx_handler.execution_info = await state.execute_tx(
+                    tx_handler.internal_tx
+                )
 
-            tx_handler.explicitly_declared.append(class_hash_int)
+                await state.state.set_compiled_class_hash(
+                    class_hash=class_hash, compiled_class_hash=compiled_class_hash
+                )
+                tx_handler.explicitly_declared.append(
+                    ClassHashPair(class_hash, compiled_class_hash)
+                )
 
-            # alpha-goerli allows multiple declarations of the same class.
-            # Even though execute_tx is performed, class needs to be set explicitly
-            await state.state.set_contract_class(
-                class_hash=tx_handler.internal_tx.class_hash,
-                contract_class=external_tx.contract_class,
-            )
+            else:  # Cairo 0.x class
+                tx_handler.execution_info = await state.execute_tx(
+                    tx_handler.internal_tx
+                )
+                compiled_class_hash = class_hash
+                compiled_class = external_tx.contract_class
+                tx_handler.explicitly_declared_old.append(class_hash)
 
-        return class_hash_int, tx_handler.internal_tx.hash_value
+            state.state.contract_classes[compiled_class_hash] = compiled_class
+            self._contract_classes[class_hash] = external_tx.contract_class
+
+        return class_hash, tx_handler.internal_tx.hash_value
 
     def _update_block_number(self):
         """Updates just the block number. Returns the old block info to allow reverting"""
@@ -358,8 +422,9 @@ class TransactionHandler:
             internal_tx: InternalTransaction
             execution_info: TransactionExecutionInfo = TransactionExecutionInfo.empty()
             internal_calls: List[CallInfo] = []
-            deployed_contracts: List[DeployedContract] = []
-            explicitly_declared: List[int] = []
+            deployed_contracts: List[ContractAddressHashPair] = []
+            explicitly_declared_old: List[int] = []
+            explicitly_declared: List[ClassHashPair] = []
             visited_storage_entries: Set[StorageEntry] = set()
 
             def __init__(self, starknet_wrapper: StarknetWrapper):
@@ -393,7 +458,10 @@ async def __aexit__(
                 tx_hash = self.internal_tx.hash_value
 
                 if exc_type:
-                    assert isinstance(exc, StarkException)
+                    if not isinstance(exc, StarkException):
+                        raise StarknetDevnetException(
+                            code=StarknetErrorCode.UNEXPECTED_FAILURE, message=str(exc)
+                        ) from exc
                     status = TransactionStatus.REJECTED
 
                     # restore block info
@@ -404,7 +472,7 @@ async def __aexit__(
                     transaction = DevnetTransaction(
                         internal_tx=self.internal_tx,
                         status=status,
-                        execution_info=self.execution_info,
+                        execution_info=TransactionExecutionInfo.empty(),
                         transaction_hash=tx_hash,
                     )
                     self.starknet_wrapper._store_transaction(
@@ -423,8 +491,9 @@ async def __aexit__(
 
                     state_update = await self.starknet_wrapper.update_pending_state(
                         deployed_contracts=self.deployed_contracts,
+                        explicitly_declared=self.explicitly_declared,
+                        explicitly_declared_old=self.explicitly_declared_old,
                         visited_storage_entries=self.visited_storage_entries,
-                        explicitly_declared_contracts=self.explicitly_declared,
                     )
 
                     transaction = DevnetTransaction(
@@ -502,18 +571,19 @@ async def deploy(self, deploy_transaction: Deploy) -> Tuple[int, int]:
             external_tx=deploy_transaction
         ) as tx_handler:
             tx_handler.internal_tx = internal_tx
-            await self.get_state().state.set_contract_class(
-                class_hash=internal_tx.class_hash, contract_class=contract_class
-            )
+            state = self.get_state().state
+            state.contract_classes[internal_tx.class_hash] = contract_class
+            self._contract_classes[internal_tx.class_hash] = contract_class
+
             tx_handler.execution_info = await self.__deploy(internal_tx)
             tx_handler.internal_calls = (
                 tx_handler.execution_info.call_info.internal_calls
             )
 
             tx_handler.deployed_contracts.append(
-                DeployedContract(
+                ContractAddressHashPair(
                     address=contract_address,
-                    class_hash=int.from_bytes(internal_tx.class_hash, "big"),
+                    class_hash=internal_tx.class_hash,
                 )
             )
 
@@ -536,7 +606,7 @@ async def invoke(self, external_tx: InvokeFunction):
                 tx_handler.execution_info.get_visited_storage_entries()
             )
 
-        return external_tx.contract_address, tx_handler.internal_tx.hash_value
+        return external_tx.sender_address, tx_handler.internal_tx.hash_value
 
     async def __get_query_state(self, block_id: BlockId = DEFAULT_BLOCK_ID):
         if block_id == PENDING_BLOCK_ID:
@@ -591,54 +661,69 @@ async def _register_new_contracts(
         self,
         internal_calls: List[Union[FunctionInvocation, CallInfo]],
         tx_hash: int,
-        deployed_contracts: List[DeployedContract],
+        deployed_contracts: List[ContractAddressHashPair],
     ):
         for internal_call in internal_calls:
             if internal_call.entry_point_type == EntryPointType.CONSTRUCTOR:
-                class_hash_bytes = to_bytes(internal_call.class_hash)
-                class_hash_int = int.from_bytes(class_hash_bytes, "big")
-
                 deployed_contracts.append(
-                    DeployedContract(
+                    ContractAddressHashPair(
                         address=internal_call.contract_address,
-                        class_hash=class_hash_int,
+                        class_hash=internal_call.class_hash,
                     )
                 )
             await self._register_new_contracts(
                 internal_call.internal_calls, tx_hash, deployed_contracts
             )
 
-    async def get_class_by_hash(self, class_hash: int) -> ContractClass:
+    async def get_class_by_hash(self, class_hash: int) -> dict:
         """Return contract class given class hash"""
-        cached_state = self.get_state().state
-        class_hash_bytes = to_bytes(class_hash)
-        return await cached_state.get_contract_class(class_hash_bytes)
+        if class_hash in self._contract_classes:
+            # check if locally present
+            return self._contract_classes[class_hash].dump()
+
+        return await self.origin.get_class_by_hash(class_hash)
+
+    async def get_compiled_class_by_class_hash(self, class_hash: int) -> CompiledClass:
+        """
+        Return compiled class given the class hash (sierra hash).
+        Should report an undeclared class if given the hash of a deprecated class
+        """
+
+        state = self.get_state().state
+
+        try:
+            compiled_class = await state.get_compiled_class_by_class_hash(class_hash)
+            if isinstance(compiled_class, CompiledClass):
+                return compiled_class
+        except AssertionError:
+            # the received hash is compiled_class_hash of a cairo1 class
+            pass
+
+        raise UndeclaredClassDevnetException(class_hash)
 
     async def get_class_hash_at(
         self, contract_address: int, block_id: BlockId = DEFAULT_BLOCK_ID
     ) -> int:
-        """Return class hash give the contract address"""
+        """Return class hash given the contract address"""
         state = await self.__get_query_state(block_id)
         cached_state = state.state
-        class_hash_bytes = await cached_state.get_class_hash_at(contract_address)
-        class_hash_int = int.from_bytes(class_hash_bytes, "big")
+        class_hash = await cached_state.get_class_hash_at(contract_address)
 
-        if not class_hash_int:
+        if not class_hash:
             raise StarknetDevnetException(
                 code=StarknetErrorCode.UNINITIALIZED_CONTRACT,
                 message=f"Contract with address {contract_address} is not deployed.",
             )
-        return class_hash_int
+        return class_hash
 
     async def get_class_by_address(
         self, contract_address: int, block_id: BlockId = DEFAULT_BLOCK_ID
-    ) -> ContractClass:
+    ) -> CompiledClassBase:
         """Return contract class given the contract address"""
         state = await self.__get_query_state(block_id)
         cached_state = state.state
-        class_hash_int = await self.get_class_hash_at(contract_address)
-        class_hash_bytes = to_bytes(class_hash_int)
-        return await cached_state.get_contract_class(class_hash_bytes)
+        class_hash = await self.get_class_hash_at(contract_address)
+        return cached_state.contract_classes[class_hash]
 
     async def get_code(
         self, contract_address: int, block_id: BlockId = DEFAULT_BLOCK_ID
@@ -699,7 +784,6 @@ async def mock_message_to_l2(self, transaction: InternalL1Handler) -> dict:
         """Handles L1 to L2 message mock endpoint"""
 
         state = self.get_state()
-
         # Execute transactions inside StarknetWrapper
         async with self.__get_transaction_handler() as tx_handler:
             tx_handler.internal_tx = transaction
@@ -718,7 +802,9 @@ async def postman_flush(self) -> dict:
         parsed_l1_l2_messages, transactions_to_execute = await self.l1l2.flush(state)
 
         # Execute transactions inside StarknetWrapper
+        tx_hashes = []
         for transaction in transactions_to_execute:
+            tx_hashes.append(hex(transaction.hash_value))
             async with self.__get_transaction_handler() as tx_handler:
                 tx_handler.internal_tx = transaction
                 tx_handler.execution_info = await state.execute_tx(
@@ -728,6 +814,7 @@ async def postman_flush(self) -> dict:
                     tx_handler.execution_info.call_info.internal_calls
                 )
 
+        parsed_l1_l2_messages["generated_l2_transactions"] = tx_hashes
         return parsed_l1_l2_messages
 
     async def update_pending_block(self, state_update: BlockStateUpdate = None):
@@ -765,16 +852,22 @@ async def generate_latest_block(self, block_hash=None) -> StarknetBlock:
         return block
 
     async def calculate_trace_and_fee(
-        self, external_tx: InvokeFunction, block_id: BlockId = DEFAULT_BLOCK_ID
+        self,
+        external_tx: InvokeFunction,
+        skip_validate: bool,
+        block_id: BlockId = DEFAULT_BLOCK_ID,
     ):
         """Calculates trace and fee by simulating tx on state copy."""
-        traces, fees = await self.calculate_traces_and_fees([external_tx], block_id)
+        traces, fees = await self.calculate_traces_and_fees(
+            [external_tx], skip_validate=skip_validate, block_id=block_id
+        )
         assert len(traces) == len(fees) == 1
         return traces[0], fees[0]
 
     async def calculate_traces_and_fees(
         self,
         external_txs: List[InvokeFunction],
+        skip_validate: bool,
         block_id: BlockId = DEFAULT_BLOCK_ID,
     ):
         """Calculates traces and fees by simulating tx on state copy.
@@ -789,8 +882,10 @@ async def calculate_traces_and_fees(
             # pylint: disable=protected-access
             cached_state_copy = cached_state_copy._copy()
             try:
-                internal_tx = InternalInvokeFunctionForSimulate.from_external(
-                    external_tx, state.general_config
+                internal_tx = InternalInvokeFunctionForSimulate.create_for_simulate(
+                    external_tx,
+                    state.general_config,
+                    skip_validate=skip_validate,
                 )
             except AssertionError as error:
                 raise StarknetDevnetException(
@@ -873,9 +968,8 @@ async def get_nonce(
 
     async def __predeclare_starknet_cli_account(self):
         """Predeclares the account class used by Starknet CLI"""
-        await self.get_state().state.set_contract_class(
-            to_bytes(STARKNET_CLI_ACCOUNT_CLASS_HASH), oz_account_class
-        )
+        state = self.get_state().state
+        state.contract_classes[STARKNET_CLI_ACCOUNT_CLASS_HASH] = oz_account_class
 
     async def __deploy_chargeable_account(self):
         if await self.is_deployed(ChargeableAccount.ADDRESS):
@@ -889,6 +983,5 @@ async def is_deployed(self, address: int) -> bool:
         """
         assert isinstance(address, int)
         cached_state = self.get_state().state
-        class_hash_bytes = await cached_state.get_class_hash_at(address)
-        class_hash_int = int.from_bytes(class_hash_bytes, "big")
-        return bool(class_hash_int)
+        class_hash = await cached_state.get_class_hash_at(address)
+        return bool(class_hash)
diff --git a/starknet_devnet/transactions.py b/starknet_devnet/transactions.py
index c4f299749..b12bbf977 100644
--- a/starknet_devnet/transactions.py
+++ b/starknet_devnet/transactions.py
@@ -7,6 +7,8 @@
 from services.everest.business_logic.transaction_execution_objects import (
     TransactionFailureReason,
 )
+from starkware.python.utils import to_bytes
+from starkware.starknet.business_logic.execution.objects import TransactionExecutionInfo
 from starkware.starknet.business_logic.transaction.objects import (
     InternalDeclare,
     InternalDeploy,
@@ -24,10 +26,7 @@
     TransactionStatus,
     TransactionTrace,
 )
-from starkware.starknet.testing.starknet import (
-    StarknetCallInfo,
-    TransactionExecutionInfo,
-)
+from starkware.starknet.testing.objects import StarknetCallInfo
 from starkware.starkware_utils.error_handling import StarkErrorCode
 from web3 import Web3
 
@@ -286,7 +285,7 @@ async def get_transaction_status(self, tx_hash: str):
         return status_response
 
 
-def create_empty_internal_declare(tx_hash, class_hash) -> InternalDeclare:
+def create_empty_internal_declare(tx_hash: int, class_hash: int) -> InternalDeclare:
     "Create InternalDeclare used in the genesis block"
     return InternalDeclare(
         hash_value=tx_hash,
@@ -295,6 +294,7 @@ def create_empty_internal_declare(tx_hash, class_hash) -> InternalDeclare:
         signature=[],
         nonce=0,
         class_hash=class_hash,
+        compiled_class_hash=None,
         sender_address=1,
     )
 
@@ -305,7 +305,7 @@ def create_empty_internal_deploy(
     "Create InternalDeploy used in the genesis block"
     return InternalDeploy(
         contract_address=contract_address,
-        contract_hash=class_hash,
+        contract_hash=to_bytes(class_hash),
         contract_address_salt=0,
         hash_value=tx_hash,
         version=0,
diff --git a/starknet_devnet/udc.py b/starknet_devnet/udc.py
index 7f08eef5c..296ea1691 100644
--- a/starknet_devnet/udc.py
+++ b/starknet_devnet/udc.py
@@ -1,8 +1,10 @@
 """UDC and its constants"""
 
-from starkware.python.utils import to_bytes
 from starkware.solidity.utils import load_nearby_contract
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClassBase,
+    DeprecatedCompiledClass,
+)
 
 from starknet_devnet.predeployed_contract_wrapper import PredeployedContractWrapper
 
@@ -10,12 +12,11 @@
 class UDC(PredeployedContractWrapper):
     """Universal deployer contract wrapper class"""
 
-    CONTRACT_CLASS: ContractClass = None  # loaded lazily
+    CONTRACT_CLASS: CompiledClassBase = None  # loaded lazily
 
     # Precalculated
-    # HASH = to_bytes(compute_class_hash(contract_class=UDC.get_contract_class()))
-    HASH = 3484004124736344420122298338254154090450773688458934993781007232228755339881
-    HASH_BYTES = to_bytes(HASH)
+    # HASH = compute_deprecated_class_hash(contract_class=UDC.get_contract_class())
+    HASH = 0x7B3E05F48F0C69E4A65CE5E076A66271A527AFF2C34CE1083EC6E1526997A69
 
     # Precalculated to fixed address
     # ADDRESS = calculate_contract_address_from_hash(salt=0, class_hash=HASH,
@@ -25,19 +26,19 @@ class UDC(PredeployedContractWrapper):
     def __init__(self, starknet_wrapper):
         self.starknet_wrapper = starknet_wrapper
         self.address = self.ADDRESS
-        self.class_hash_bytes = self.HASH_BYTES
+        self.class_hash = self.HASH
 
     @classmethod
-    def get_contract_class(cls):
+    def get_contract_class(cls) -> CompiledClassBase:
         """Returns contract class via lazy loading."""
         if not cls.CONTRACT_CLASS:
-            cls.CONTRACT_CLASS = ContractClass.load(
+            cls.CONTRACT_CLASS = DeprecatedCompiledClass.load(
                 load_nearby_contract("UDC_OZ_0.5.0")
             )
         return cls.CONTRACT_CLASS
 
     @property
-    def contract_class(self) -> ContractClass:
+    def contract_class(self) -> CompiledClassBase:
         """Same as `get_contract_class`, used by `PredeployedContractWrapper` parent"""
         return self.get_contract_class()
 
diff --git a/starknet_devnet/util.py b/starknet_devnet/util.py
index 799e52fc9..c1ecf1aa0 100644
--- a/starknet_devnet/util.py
+++ b/starknet_devnet/util.py
@@ -5,12 +5,13 @@
 import os
 import sys
 from dataclasses import dataclass
-from typing import Dict, List, Set, Union
+from typing import Dict, List, Set, Tuple
 
 from starkware.starknet.business_logic.state.state import CachedState
 from starkware.starknet.definitions.error_codes import StarknetErrorCode
 from starkware.starknet.services.api.feeder_gateway.response_objects import (
-    DeployedContract,
+    ClassHashPair,
+    ContractAddressHashPair,
     FeeEstimationInfo,
     StorageEntry,
 )
@@ -22,7 +23,7 @@ def parse_hex_string(arg: str) -> int:
     """
     Converts the argument to an integer only if it starts with `0x`.
     """
-    if arg.startswith("0x"):
+    if isinstance(arg, str) and arg.startswith("0x"):
         try:
             return int(arg, 16)
         except ValueError:
@@ -74,6 +75,16 @@ def __init__(self, code: StarknetErrorCode, status_code=500, message=None):
         self.status_code = status_code
 
 
+class UndeclaredClassDevnetException(StarknetDevnetException):
+    """Exception raised when Devnet has to return an undeclared class"""
+
+    def __init__(self, class_hash: int):
+        super().__init__(
+            code=StarknetErrorCode.UNDECLARED_CLASS,
+            message=f"Class with hash {class_hash:#x} is not declared.",
+        )
+
+
 def enable_pickling():
     """
     Extends the `StarknetContract` class to enable pickling.
@@ -89,14 +100,6 @@ def contract_setstate(self, state):
     StarknetContract.__setstate__ = contract_setstate
 
 
-def to_bytes(value: Union[int, bytes]) -> bytes:
-    """
-    If int, convert to 32-byte big-endian bytes instance
-    If bytes, return the received value
-    """
-    return value if isinstance(value, bytes) else value.to_bytes(32, "big")
-
-
 def check_valid_dump_path(dump_path: str):
     """Checks if dump path is a directory. Raises ValueError if not."""
 
@@ -115,22 +118,69 @@ def str_to_felt(text: str) -> int:
     return int.from_bytes(bytes(text, "ascii"), "big")
 
 
-async def get_all_declared_contracts(
+async def group_classes_by_version(
+    contracts: List[ContractAddressHashPair], state: CachedState
+) -> Tuple[List[int], List[ContractAddressHashPair]]:
+    """Group into two lists: cairo0 contracts and  cairo1 contracts"""
+    cairo0_classes: List[int] = []
+    cairo1_classes: List[ContractAddressHashPair] = []
+    for contract in contracts:
+        compiled_class_hash = await state.get_compiled_class_hash(contract.class_hash)
+        if compiled_class_hash == 0:
+            cairo0_classes.append(contract.class_hash)
+        else:
+            class_hash_pair = ClassHashPair(contract.class_hash, compiled_class_hash)
+            cairo1_classes.append(class_hash_pair)
+    return cairo0_classes, cairo1_classes
+
+
+async def get_all_declared_cairo0_classes(
     previous_state: CachedState,
     explicitly_declared_contracts: List[int],
-    deployed_contracts: List[DeployedContract],
-):
-    """Returns a tuple of explicitly and implicitly declared classes"""
+    deployed_cairo0_classes: List[int],
+) -> Tuple[int]:
+    """Returns a tuple of explicitly and implicitly declared cairo0 classes"""
     declared_contracts_set = set(explicitly_declared_contracts)
-    for deployed_contract in deployed_contracts:
-        class_hash_bytes = to_bytes(deployed_contract.class_hash)
+    for deployed_contract in deployed_cairo0_classes:
         try:
-            await previous_state.get_contract_class(class_hash_bytes)
+            await previous_state.get_compiled_class_by_class_hash(deployed_contract)
         except StarkException:
-            declared_contracts_set.add(deployed_contract.class_hash)
+            declared_contracts_set.add(deployed_contract)
     return tuple(declared_contracts_set)
 
 
+async def get_all_declared_cairo1_classes(
+    previous_state: CachedState,
+    explicitly_declared_classes: List[ClassHashPair],
+    deployed_cairo1_contracts: List[ContractAddressHashPair],
+) -> List[ClassHashPair]:
+    """Returns a list of explicitly and implicitly declared cairo1 classes"""
+    declared_classes_set = set(explicitly_declared_classes)
+    for deployed_contract in deployed_cairo1_contracts:
+        try:
+            await previous_state.get_compiled_class_by_class_hash(
+                deployed_contract.class_hash
+            )
+        except StarkException:
+            declared_classes_set.add(deployed_contract.class_hash)
+    return list(declared_classes_set)
+
+
+async def get_replaced_classes(
+    previous_state: CachedState,
+    current_state: CachedState,
+) -> List[ContractAddressHashPair]:
+    """Find contracts whose class has been replaced"""
+    replaced: List[ContractAddressHashPair] = []
+    for address, class_hash in current_state.cache.address_to_class_hash.items():
+        previous_class_hash = await previous_state.get_class_hash_at(address)
+        if previous_class_hash and previous_class_hash != class_hash:
+            replaced.append(
+                ContractAddressHashPair(address=address, class_hash=class_hash)
+            )
+    return replaced
+
+
 async def get_storage_diffs(
     previous_state: CachedState,
     current_state: CachedState,
@@ -157,6 +207,24 @@ async def get_storage_diffs(
     return storage_diffs
 
 
+async def assert_not_declared(class_hash: int, compiled_class_hash: int):
+    """Assert class is not declared"""
+    if compiled_class_hash != 0:
+        raise StarknetDevnetException(
+            code=StarknetErrorCode.CLASS_ALREADY_DECLARED,
+            message=f"Class with hash {hex(class_hash)} is already declared.\n {hex(compiled_class_hash)} != 0",
+        )
+
+
+def assert_recompiled_class_hash(recompiled: int, expected: int):
+    """Assert the class hashes match"""
+    if recompiled != expected:
+        raise StarknetDevnetException(
+            code=StarknetErrorCode.INVALID_COMPILED_CLASS_HASH,
+            message=f"Compiled class hash not matching; received: {hex(expected)}, computed: {hex(recompiled)}",
+        )
+
+
 def get_fee_estimation_info(tx_fee: int, gas_price: int):
     """Construct fee estimation response"""
 


Test patch:
diff --git a/test/account.py b/test/account.py
index 181d822c2..dbbb79912 100644
--- a/test/account.py
+++ b/test/account.py
@@ -7,18 +7,24 @@
 
 import requests
 from starkware.crypto.signature.signature import private_to_stark_key, sign
+from starkware.starknet.cli.starknet_cli import get_salt
+from starkware.starknet.core.os.contract_address.contract_address import (
+    calculate_contract_address_from_hash,
+)
 from starkware.starknet.core.os.transaction_hash.transaction_hash import (
     calculate_declare_transaction_hash,
+    calculate_deprecated_declare_transaction_hash,
 )
 from starkware.starknet.definitions.constants import QUERY_VERSION
 from starkware.starknet.definitions.general_config import StarknetChainId
+from starkware.starknet.services.api.gateway.transaction import ContractClass, Declare
 
 from starknet_devnet.account_util import AccountCall, get_execute_args
 
 from .settings import APP_URL
-from .shared import SUPPORTED_TX_VERSION
+from .shared import EXPECTED_UDC_ADDRESS, SUPPORTED_TX_VERSION
+from .util import deploy as deploy_contract
 from .util import (
-    deploy,
     estimate_fee,
     extract_class_hash,
     extract_tx_hash,
@@ -39,7 +45,7 @@
 
 def deploy_account_contract(salt=None):
     """Deploy account contract."""
-    return deploy(ACCOUNT_PATH, inputs=[str(PUBLIC_KEY)], salt=salt)
+    return deploy_contract(ACCOUNT_PATH, inputs=[str(PUBLIC_KEY)], salt=salt)
 
 
 def get_nonce(account_address: str, feeder_gateway_url=APP_URL) -> int:
@@ -126,6 +132,7 @@ def get_estimated_fee(
         nonce=nonce,
         block_number=block_number,
         feeder_gateway_url=feeder_gateway_url,
+        chain_id=chain_id,
     )
 
 
@@ -179,6 +186,8 @@ def invoke(
             *signature,
             "--max_fee",
             str(max_fee),
+            "--chain_id",
+            hex(chain_id.value),
         ],
         gateway_url=gateway_url,
     )
@@ -193,13 +202,14 @@ def declare(
     private_key: str,
     nonce: int = None,
     max_fee: int = 0,
+    chain_id=StarknetChainId.TESTNET,
 ):
     """Wrapper around starknet declare"""
 
     if nonce is None:
         nonce = get_nonce(account_address)
 
-    tx_hash = calculate_declare_transaction_hash(
+    tx_hash = calculate_deprecated_declare_transaction_hash(
         contract_class=load_contract_class(contract_path),
         chain_id=StarknetChainId.TESTNET.value,
         sender_address=int(account_address, 16),
@@ -212,6 +222,7 @@ def declare(
     output = run_starknet(
         [
             "declare",
+            "--deprecated",
             "--contract",
             contract_path,
             "--signature",
@@ -220,9 +231,95 @@ def declare(
             account_address,
             "--max_fee",
             str(max_fee),
+            "--chain_id",
+            hex(chain_id.value),
         ]
     )
     return {
         "tx_hash": extract_tx_hash(output.stdout),
         "class_hash": extract_class_hash(output.stdout),
     }
+
+
+def deploy(
+    class_hash: str,
+    account_address: str,
+    private_key: int,
+    inputs=None,
+    salt=None,
+    unique=False,
+    max_fee=None,
+    gateway_url=APP_URL,
+):
+    """Wrapper around starknet deploy"""
+
+    ctor_args = [int(val, 0) for val in inputs or []]
+    salt = get_salt(salt)
+
+    invoke_tx_hash = invoke(
+        calls=[
+            (
+                EXPECTED_UDC_ADDRESS,
+                "deployContract",
+                [
+                    int(class_hash, 16),
+                    salt,
+                    int(unique),
+                    len(ctor_args),
+                    *ctor_args,
+                ],
+            )
+        ],
+        account_address=account_address,
+        private_key=private_key,
+        max_fee=max_fee,
+        gateway_url=gateway_url,
+    )
+
+    contract_address = calculate_contract_address_from_hash(
+        salt=salt,
+        class_hash=int(class_hash, 16),
+        constructor_calldata=ctor_args,
+        deployer_address=0 if not unique else int(account_address, 16),
+    )
+    contract_address = hex(contract_address)
+
+    return {
+        "tx_hash": invoke_tx_hash,
+        "address": contract_address,
+    }
+
+
+def send_declare_v2(
+    contract_class: ContractClass,
+    compiled_class_hash: int,
+    sender_address: str,
+    sender_key: int,
+):
+    """Send a declare v2 transaction"""
+    max_fee = int(1e18)  # should be enough
+    version = 2
+    nonce = get_nonce(sender_address)
+    chain_id = StarknetChainId.TESTNET.value
+    hash_value = calculate_declare_transaction_hash(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=int(sender_address, 16),
+        max_fee=max_fee,
+        version=version,
+        nonce=nonce,
+        chain_id=chain_id,
+    )
+
+    declaration_body = Declare(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=int(sender_address, 16),
+        version=version,
+        max_fee=max_fee,
+        signature=list(sign(msg_hash=hash_value, priv_key=sender_key)),
+        nonce=nonce,
+    ).dump()
+    declaration_body["type"] = "DECLARE"
+
+    return requests.post(f"{APP_URL}/gateway/add_transaction", json=declaration_body)
diff --git a/test/contracts/cairo/replaceable.cairo b/test/contracts/cairo/replaceable.cairo
new file mode 100644
index 000000000..13504f552
--- /dev/null
+++ b/test/contracts/cairo/replaceable.cairo
@@ -0,0 +1,18 @@
+%lang starknet
+
+from starkware.cairo.common.cairo_builtins import HashBuiltin
+from starkware.starknet.common.syscalls import replace_class
+
+@view
+func foo{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) {
+    return (42,);
+}
+
+
+@external
+func replace{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(
+    new_class_hash: felt
+) {
+    replace_class(new_class_hash);
+    return ();
+}
diff --git a/test/contracts/cairo/replacing.cairo b/test/contracts/cairo/replacing.cairo
new file mode 100644
index 000000000..34e53a03b
--- /dev/null
+++ b/test/contracts/cairo/replacing.cairo
@@ -0,0 +1,8 @@
+%lang starknet
+
+from starkware.cairo.common.cairo_builtins import HashBuiltin
+
+@view
+func foo{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) {
+    return (43,);
+}
diff --git a/test/contracts/cairo1/contract.cairo b/test/contracts/cairo1/contract.cairo
new file mode 100644
index 000000000..096e5ee07
--- /dev/null
+++ b/test/contracts/cairo1/contract.cairo
@@ -0,0 +1,21 @@
+#[contract]
+mod Contract {
+    struct Storage {
+        balance: felt252,
+    }
+
+    #[constructor]
+    fn constructor(initial_balance: felt252) {
+        balance::write(initial_balance);
+    }
+
+    #[external]
+    fn increase_balance(amount1: felt252, amount2: felt252) {
+        balance::write(balance::read() + amount1 + amount2);
+    }
+
+    #[view]
+    fn get_balance() -> felt252 {
+        balance::read()
+    }
+}
\ No newline at end of file
diff --git a/test/contracts/solidity/L1L2.sol b/test/contracts/solidity/L1L2.sol
index 81f69c67e..8ed3cbfd2 100644
--- a/test/contracts/solidity/L1L2.sol
+++ b/test/contracts/solidity/L1L2.sol
@@ -49,7 +49,7 @@ contract L1L2Example {
         uint256 l2ContractAddress,
         uint256 user,
         uint256 amount
-    ) external {
+    ) external payable {
         require(amount < 2**64, "Invalid amount.");
         require(amount <= userBalances[user], "The user's balance is not large enough.");
 
@@ -62,6 +62,6 @@ contract L1L2Example {
         payload[1] = amount;
 
         // Send the message to the StarkNet core contract.
-        starknetCore.sendMessageToL2(l2ContractAddress, DEPOSIT_SELECTOR, payload);
+        starknetCore.sendMessageToL2{value: msg.value}(l2ContractAddress, DEPOSIT_SELECTOR, payload);
     }
 }
diff --git a/test/declare.json b/test/declare.json
deleted file mode 100644
index b0f608da2..000000000
--- a/test/declare.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-    "sender_address": "0x1",
-    "max_fee": "0x0",
-    "signature": [],
-    "nonce": "0x0",
-    "type": "DECLARE",
-    "contract_class": {
-        "program": "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",
-        "abi": [
-            {
-                "inputs": [
-                    {
-                        "name": "amount",
-                        "type": "felt"
-                    }
-                ],
-                "name": "increase_balance",
-                "outputs": [],
-                "type": "function"
-            },
-            {
-                "inputs": [],
-                "name": "get_balance",
-                "outputs": [
-                    {
-                        "name": "res",
-                        "type": "felt"
-                    }
-                ],
-                "stateMutability": "view",
-                "type": "function"
-            }
-        ],
-        "entry_points_by_type": {
-            "CONSTRUCTOR": [],
-            "EXTERNAL": [
-                {
-                    "offset": "0x3a",
-                    "selector": "0x362398bec32bc0ebb411203221a35a0301193a96f317ebe5e40be9f60d15320"
-                },
-                {
-                    "offset": "0x5b",
-                    "selector": "0x39e11d48192e4333233c7eb19d10ad67c362bb28580c604d67884c85da39695"
-                }
-            ],
-            "L1_HANDLER": []
-        }
-    }
-}
diff --git a/test/declare_rpc.json b/test/declare_rpc.json
index e596a5850..0d6739b78 100644
--- a/test/declare_rpc.json
+++ b/test/declare_rpc.json
@@ -3,6 +3,7 @@
     "max_fee": "0x0",
     "signature": [],
     "nonce": "0x0",
+    "version": "0x0",
     "type": "DECLARE",
     "contract_class": {
         "program": "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",
diff --git a/test/deploy.json b/test/deploy.json
index d2c7616b5..1ab66c7ab 100644
--- a/test/deploy.json
+++ b/test/deploy.json
@@ -43,5 +43,6 @@
         }
     },
     "contract_address_salt": "0x1",
+    "version": "0x0",
     "type": "DEPLOY"
 }
diff --git a/test/expected/deploy_function_invocation.json b/test/expected/deploy_function_invocation.json
index 78a36673d..39bf5b897 100644
--- a/test/expected/deploy_function_invocation.json
+++ b/test/expected/deploy_function_invocation.json
@@ -2,8 +2,8 @@
     "call_type": "CALL",
     "calldata": ["0x0"],
     "caller_address": "0x0",
-    "class_hash": "0x71df7c871d389943e24aaaf85d41594266d12f2f9b580a9f92ba4a0bf763d67",
-    "contract_address": "0x6f47c70cfad7e0865af23e60e596e4926d557bc3fc26ce96a234d55bfb04857",
+    "class_hash": "0x5188a855a7ee2940b80d15b882358fb209d5b7d0b1558a6163858071a55148b",
+    "contract_address": "0x3adceba3a8bbad19c2e1bb81d14d426ee7fea2a0152169a19643cb35daafcb2",
     "entry_point_type": "CONSTRUCTOR",
     "events": [],
     "execution_resources": {
diff --git a/test/expected/invoke_function_invocation.json b/test/expected/invoke_function_invocation.json
index 06aaae047..628f9431b 100644
--- a/test/expected/invoke_function_invocation.json
+++ b/test/expected/invoke_function_invocation.json
@@ -13,7 +13,7 @@
     "events": [],
     "calldata": [
         "0x1",
-        "0x6f47c70cfad7e0865af23e60e596e4926d557bc3fc26ce96a234d55bfb04857",
+        "0x3adceba3a8bbad19c2e1bb81d14d426ee7fea2a0152169a19643cb35daafcb2",
         "0x362398bec32bc0ebb411203221a35a0301193a96f317ebe5e40be9f60d15320",
         "0x0",
         "0x2",
@@ -34,7 +34,7 @@
             },
             "messages": [],
             "call_type": "CALL",
-            "class_hash": "0x71df7c871d389943e24aaaf85d41594266d12f2f9b580a9f92ba4a0bf763d67",
+            "class_hash": "0x5188a855a7ee2940b80d15b882358fb209d5b7d0b1558a6163858071a55148b",
             "result": [],
             "events": [],
             "calldata": [
@@ -44,7 +44,7 @@
             "caller_address": "0x347be35996a21f6bf0623e75dbce52baba918ad5ae8d83b6f416045ab22961a",
             "entry_point_type": "EXTERNAL",
             "selector": "0x362398bec32bc0ebb411203221a35a0301193a96f317ebe5e40be9f60d15320",
-            "contract_address": "0x6f47c70cfad7e0865af23e60e596e4926d557bc3fc26ce96a234d55bfb04857",
+            "contract_address": "0x3adceba3a8bbad19c2e1bb81d14d426ee7fea2a0152169a19643cb35daafcb2",
             "internal_calls": []
         }
     ]
diff --git a/test/expected/invoke_receipt.json b/test/expected/invoke_receipt.json
index 001e41375..ee185ee46 100644
--- a/test/expected/invoke_receipt.json
+++ b/test/expected/invoke_receipt.json
@@ -1,13 +1,13 @@
 {
-    "actual_fee": "0x16010bdfe1800",
+    "actual_fee": "0x152266eed7000",
     "block_hash": "0x2",
     "block_number": 2,
     "events": [
         {
             "data": [
                 "0x347be35996a21f6bf0623e75dbce52baba918ad5ae8d83b6f416045ab22961a",
-                "0x3711666a3506c99c9d78c4d4013409a87a962b7a0880a1c24af9fe193dafc01",
-                "0x16010bdfe1800",
+                "0x5ce143edbf39a5e450d0bdf68f4e6b515405d1e9ab89329efa75fd8a31d9487",
+                "0x152266eed7000",
                 "0x0"
             ],
             "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
diff --git a/test/expected/invoke_receipt_account_event.json b/test/expected/invoke_receipt_account_event.json
index e1acfd957..f52f315b5 100644
--- a/test/expected/invoke_receipt_account_event.json
+++ b/test/expected/invoke_receipt_account_event.json
@@ -5,7 +5,7 @@
                 "0x0",
                 "0xa"
             ],
-            "from_address": "0x5b5c8722ce893e19fc813996e610f0699fbe9b6c685ce175e60d7cbdbb87fa1",
+            "from_address": "0x2fa79baaf35f083c85518ab60ef037bad5c731dc39818522798b61ab3b5f57",
             "keys": [
                 "0x3db3da4221c078e78bd987e54e1cc24570d89a7002cefa33e548d6c72c73f9d"
             ]
@@ -13,8 +13,8 @@
         {
             "data": [
                 "0x347be35996a21f6bf0623e75dbce52baba918ad5ae8d83b6f416045ab22961a",
-                "0x3711666a3506c99c9d78c4d4013409a87a962b7a0880a1c24af9fe193dafc01",
-                "0x5a5c900900",
+                "0x5ce143edbf39a5e450d0bdf68f4e6b515405d1e9ab89329efa75fd8a31d9487",
+                "0x569ced8800",
                 "0x0"
             ],
             "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
diff --git a/test/expected/invoke_receipt_event.json b/test/expected/invoke_receipt_event.json
index 6e1d6e17c..d8756c147 100644
--- a/test/expected/invoke_receipt_event.json
+++ b/test/expected/invoke_receipt_event.json
@@ -5,7 +5,7 @@
                 "0x0",
                 "0xa"
             ],
-            "from_address": "0x5b5c8722ce893e19fc813996e610f0699fbe9b6c685ce175e60d7cbdbb87fa1",
+            "from_address": "0x2fa79baaf35f083c85518ab60ef037bad5c731dc39818522798b61ab3b5f57",
             "keys": [
                 "0x3db3da4221c078e78bd987e54e1cc24570d89a7002cefa33e548d6c72c73f9d"
             ]
@@ -13,8 +13,8 @@
         {
             "data": [
                 "0x347be35996a21f6bf0623e75dbce52baba918ad5ae8d83b6f416045ab22961a",
-                "0x3711666a3506c99c9d78c4d4013409a87a962b7a0880a1c24af9fe193dafc01",
-                "0x160f992a32800",
+                "0x5ce143edbf39a5e450d0bdf68f4e6b515405d1e9ab89329efa75fd8a31d9487",
+                "0x15254ffdb4000",
                 "0x0"
             ],
             "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
diff --git a/test/invoke.json b/test/invoke.json
index 5657a039e..e2714d39b 100644
--- a/test/invoke.json
+++ b/test/invoke.json
@@ -5,5 +5,6 @@
     ],
     "signature": [],
     "contract_address": "0x256e835bb26d9acae43b747cb0e04124907608311137185aef65559ee5f61b9",
+    "version": "0x0",
     "type": "INVOKE_FUNCTION"
 }
diff --git a/test/rpc/conftest.py b/test/rpc/conftest.py
index 345be4855..60dce5e19 100644
--- a/test/rpc/conftest.py
+++ b/test/rpc/conftest.py
@@ -18,9 +18,13 @@
 
 import pytest
 from starkware.starknet.business_logic.transaction.objects import InternalDeployAccount
-from starkware.starknet.core.os.class_hash import compute_class_hash
+from starkware.starknet.core.os.contract_class.deprecated_class_hash import (
+    compute_deprecated_class_hash,
+)
 from starkware.starknet.definitions.general_config import DEFAULT_CHAIN_ID
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClassBase,
+)
 from starkware.starknet.services.api.feeder_gateway.response_objects import (
     DeployAccountSpecificInfo,
 )
@@ -53,7 +57,7 @@
 
 
 @pytest.fixture(name="contract_class")
-def fixture_contract_class() -> ContractClass:
+def fixture_contract_class() -> CompiledClassBase:
     """
     Make ContractDefinition from deployment transaction used in tests
     """
@@ -197,17 +201,20 @@ def fixture_deploy_account_details() -> dict:
 
 
 def prepare_deploy_account_tx(
-    private_key: int, public_key: int, account_salt: int, contract_class: ContractClass
+    private_key: int,
+    public_key: int,
+    account_salt: int,
+    contract_class: CompiledClassBase,
 ) -> Tuple[DeployAccount, int]:
     """Return (signed deploy account tx, address)"""
     account_address, deploy_account_tx = sign_deploy_account_tx(
         private_key=private_key,
         public_key=public_key,
-        class_hash=compute_class_hash(contract_class),
+        class_hash=compute_deprecated_class_hash(contract_class),
         salt=account_salt,
         max_fee=int(1e18),
         version=SUPPORTED_RPC_TX_VERSION,
-        chain_id=DEFAULT_CHAIN_ID.value,
+        chain_id=DEFAULT_CHAIN_ID,
         nonce=0,
     )
 
diff --git a/test/rpc/test_data/get_events.py b/test/rpc/test_data/get_events.py
index a924c9242..92bb78207 100644
--- a/test/rpc/test_data/get_events.py
+++ b/test/rpc/test_data/get_events.py
@@ -124,18 +124,18 @@
 }
 
 EVENT_FEE_ADDRESS = rpc_felt(
-    1556746869602934183907209817909870193193832701883543897870108478262537288705
+    0x05CE143EDBF39A5E450D0BDF68F4E6B515405D1E9AB89329EFA75FD8A31D9487
 )
 FEE_CHARGING_IN_BLOCK_2_EVENT = [
     rpc_felt(int(PREDEPLOYED_ACCOUNT_ADDRESS, 16)),
     EVENT_FEE_ADDRESS,
-    rpc_felt(143300000000000),  # WEI
+    rpc_felt(0x73B00ED0C000),  # WEI
     rpc_felt(0),
 ]
 FEE_CHARGING_IN_BLOCK_3_EVENT = [
     rpc_felt(int(PREDEPLOYED_ACCOUNT_ADDRESS, 16)),
     EVENT_FEE_ADDRESS,
-    rpc_felt(388100000000000),  # WEI
+    rpc_felt(0x015254FFDB4000),  # WEI
     rpc_felt(0),
 ]
 
diff --git a/test/rpc/test_rpc_class.py b/test/rpc/test_rpc_class.py
index 69ed65b59..65677f8ef 100644
--- a/test/rpc/test_rpc_class.py
+++ b/test/rpc/test_rpc_class.py
@@ -88,7 +88,7 @@ def test_get_class(class_hash):
 
     assert contract_class["entry_points_by_type"] == EXPECTED_ENTRY_POINTS
     assert isinstance(contract_class["program"], str)
-    decompress_program({"contract_class": contract_class}, False)
+    decompress_program(contract_class["program"])
     assert contract_class["abi"] == EXPECTED_ABI
 
 
@@ -125,5 +125,5 @@ def test_get_class_at(deploy_info):
 
     assert contract_class["entry_points_by_type"] == EXPECTED_ENTRY_POINTS
     assert isinstance(contract_class["program"], str)
-    decompress_program({"contract_class": contract_class}, False)
+    decompress_program(contract_class["program"])
     assert contract_class["abi"] == EXPECTED_ABI
diff --git a/test/rpc/test_rpc_estimate_fee.py b/test/rpc/test_rpc_estimate_fee.py
index 040ad7107..552bcc4a9 100644
--- a/test/rpc/test_rpc_estimate_fee.py
+++ b/test/rpc/test_rpc_estimate_fee.py
@@ -17,11 +17,13 @@
 
 import pytest
 from starkware.starknet.core.os.transaction_hash.transaction_hash import (
-    calculate_declare_transaction_hash,
+    calculate_deprecated_declare_transaction_hash,
 )
 from starkware.starknet.definitions.general_config import StarknetChainId
 from starkware.starknet.public.abi import get_selector_from_name
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.gateway.transaction import (
     DEFAULT_DECLARE_SENDER_ADDRESS,
 )
@@ -164,13 +166,11 @@ def test_estimate_fee_declare(declare_content):
         abi=contract_class["abi"],
     )
 
-    contract_class = decompress_program({"contract_class": contract_class}, False)[
-        "contract_class"
-    ]
-    contract_class = ContractClass.load(contract_class)
+    contract_class["program"] = decompress_program(contract_class["program"])
+    contract_class = DeprecatedCompiledClass.load(contract_class)
 
     nonce = get_nonce(PREDEPLOYED_ACCOUNT_ADDRESS)
-    tx_hash = calculate_declare_transaction_hash(
+    tx_hash = calculate_deprecated_declare_transaction_hash(
         contract_class=contract_class,
         chain_id=StarknetChainId.TESTNET.value,
         sender_address=int(PREDEPLOYED_ACCOUNT_ADDRESS, 16),
diff --git a/test/rpc/test_rpc_misc.py b/test/rpc/test_rpc_misc.py
index b790cd40b..c99697c13 100644
--- a/test/rpc/test_rpc_misc.py
+++ b/test/rpc/test_rpc_misc.py
@@ -220,7 +220,7 @@ def test_get_events(input_data, expected_data):
     resp = rpc_call("starknet_getEvents", params=input_data["params"])
     assert len(expected_data) == len(resp["result"]["events"])
     for i, data in enumerate(expected_data):
-        assert str(resp["result"]["events"][i]["data"]) == str(data)
+        assert resp["result"]["events"][i]["data"] == data
 
     if "continuation_token" in input_data["params"]["filter"]:
         expected_continuation_token = int(
diff --git a/test/rpc/test_rpc_transactions.py b/test/rpc/test_rpc_transactions.py
index ef54b66bb..77ae7e321 100644
--- a/test/rpc/test_rpc_transactions.py
+++ b/test/rpc/test_rpc_transactions.py
@@ -27,7 +27,7 @@
 
 import pytest
 from starkware.starknet.core.os.transaction_hash.transaction_hash import (
-    calculate_declare_transaction_hash,
+    calculate_deprecated_declare_transaction_hash,
 )
 from starkware.starknet.definitions.general_config import (
     DEFAULT_CHAIN_ID,
@@ -549,7 +549,7 @@ def test_add_declare_transaction(declare_content):
     )
 
     nonce = get_nonce(PREDEPLOYED_ACCOUNT_ADDRESS)
-    tx_hash = calculate_declare_transaction_hash(
+    tx_hash = calculate_deprecated_declare_transaction_hash(
         contract_class=load_contract_class(CONTRACT_PATH),
         chain_id=StarknetChainId.TESTNET.value,
         sender_address=int(PREDEPLOYED_ACCOUNT_ADDRESS, 16),
@@ -754,7 +754,7 @@ def test_add_deploy_account_transaction(deploy_account_details):
         contract_address=int(contract_address, 16),
         selector=get_selector_from_name("increase_balance"),
         calldata=[10, 20],
-        chain_id=DEFAULT_CHAIN_ID.value,
+        chain_id=DEFAULT_CHAIN_ID,
         max_fee=int(1e18),
         version=SUPPORTED_RPC_TX_VERSION,
         nonce=1,
diff --git a/test/shared.py b/test/shared.py
index 20127a68e..c394fb39b 100644
--- a/test/shared.py
+++ b/test/shared.py
@@ -16,6 +16,16 @@
 FAILING_CONTRACT_PATH = f"{ARTIFACTS_PATH}/always_fail.cairo/always_fail.json"
 DEPLOYER_CONTRACT_PATH = f"{ARTIFACTS_PATH}/deployer.cairo/deployer.json"
 DEPLOYER_ABI_PATH = f"{ARTIFACTS_PATH}/deployer.cairo/deployer_abi.json"
+REPLACEABLE_CONTRACT_PATH = f"{ARTIFACTS_PATH}/replaceable.cairo/replaceable.json"
+REPLACEABLE_ABI_PATH = f"{ARTIFACTS_PATH}/replaceable.cairo/replaceable_abi.json"
+REPLACING_CONTRACT_PATH = f"{ARTIFACTS_PATH}/replacing.cairo/replacing.json"
+REPLACING_ABI_PATH = f"{ARTIFACTS_PATH}/replacing.cairo/replacing_abi.json"
+
+# cairo 1.0
+ARTIFACTS_1_PATH = "test/artifacts/contracts/cairo1"
+CONTRACT_1_PATH = f"{ARTIFACTS_1_PATH}/contract.cairo/contract.json"
+CONTRACT_1_CASM_PATH = f"{ARTIFACTS_1_PATH}/contract.cairo/contract.casm"
+ABI_1_PATH = f"{ARTIFACTS_1_PATH}/contract.cairo/contract_abi.json"
 
 STARKNET_CLI_ACCOUNT_ABI_PATH = f"{ARTIFACTS_PATH}/starknet_cli_oz_account_abi.json"
 with open(STARKNET_CLI_ACCOUNT_ABI_PATH, "w", encoding="utf-8") as oz_account_abi_file:
@@ -29,14 +39,19 @@
 )
 
 EXPECTED_SALTY_DEPLOY_ADDRESS = (
-    "0x05b5c8722ce893e19fc813996e610f0699fbe9b6c685ce175e60d7cbdbb87fa1"
+    "0x002fa79baaf35f083c85518ab60ef037bad5c731dc39818522798b61ab3b5f57"
 )
 EXPECTED_SALTY_DEPLOY_HASH = (
-    "0x2e750343e63dc7ddf543c196c54018b4e5989acd413e6acafdae62ef2c3146d"
+    "0x697aaff4bc1e2ae682e20b5f4c4775bdc09b689d3f427c28d676e0ab60514ce"
 )
 
+# hash of contract at CONTRACT_PATH
 EXPECTED_CLASS_HASH = (
-    "0x71df7c871d389943e24aaaf85d41594266d12f2f9b580a9f92ba4a0bf763d67"
+    "0x5188a855a7ee2940b80d15b882358fb209d5b7d0b1558a6163858071a55148b"
+)
+# hash of contract at CONTRACT_1_PATH
+EXPECTED_CLASS_1_HASH = (
+    "0x7c93b555d40b18537ae7107aaa26dce3f8658337f5be3f563955fd24b623fec"
 )
 
 NONEXISTENT_TX_HASH = "0x99"
diff --git a/test/test_account.py b/test/test_account.py
index 62c4a5ff4..fec47114d 100644
--- a/test/test_account.py
+++ b/test/test_account.py
@@ -66,7 +66,7 @@ def deploy_events_contract():
 def get_account_balance(address: str, server_url=APP_URL) -> int:
     """Get balance (wei) of account with `address` (hex)."""
     resp = requests.get(f"{server_url}/account_balance?address={address}")
-    assert resp.status_code == 200
+    assert resp.status_code == 200, resp.json()
     return int(resp.json()["amount"])
 
 
diff --git a/test/test_account_custom.py b/test/test_account_custom.py
index 8cc62923d..fc40dfc2f 100644
--- a/test/test_account_custom.py
+++ b/test/test_account_custom.py
@@ -4,8 +4,12 @@
 import subprocess
 
 import pytest
-from starkware.starknet.core.os.class_hash import compute_class_hash
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.core.os.contract_class.deprecated_class_hash import (
+    compute_deprecated_class_hash,
+)
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 
 from .account import invoke
 from .shared import (
@@ -67,10 +71,10 @@ def test_providing_correct_account_class():
     """Test behavior if correct custom account provided"""
     fetched_class_hash = int(get_class_hash_at(PREDEPLOYED_ACCOUNT_ADDRESS), 16)
 
-    expected_contract_class = ContractClass.loads(
+    expected_contract_class = DeprecatedCompiledClass.loads(
         load_file_content("custom_account.json")
     )
-    assert fetched_class_hash == compute_class_hash(expected_contract_class)
+    assert fetched_class_hash == compute_deprecated_class_hash(expected_contract_class)
 
     deploy_info = deploy(CONTRACT_PATH, inputs=["0"])
     invoke(
diff --git a/test/test_account_predeployed.py b/test/test_account_predeployed.py
index a85fd78b2..6179e4214 100644
--- a/test/test_account_predeployed.py
+++ b/test/test_account_predeployed.py
@@ -2,11 +2,13 @@
 
 import pytest
 import requests
-from starkware.starknet.core.os.class_hash import compute_class_hash
+from starkware.starknet.core.os.contract_class.deprecated_class_hash import (
+    compute_deprecated_class_hash,
+)
 
 from starknet_devnet.chargeable_account import ChargeableAccount
 from starknet_devnet.contract_class_wrapper import (
-    DEFAULT_ACCOUNT_HASH_BYTES,
+    DEFAULT_ACCOUNT_HASH,
     DEFAULT_ACCOUNT_PATH,
 )
 
@@ -31,8 +33,8 @@ def test_precomputed_account_hash():
     """Test if the precomputed hash of the account contract is correct."""
 
     contract_class = load_contract_class(DEFAULT_ACCOUNT_PATH)
-    recalculated_hash = compute_class_hash(contract_class=contract_class)
-    assert_equal(recalculated_hash, int.from_bytes(DEFAULT_ACCOUNT_HASH_BYTES, "big"))
+    recalculated_hash = compute_deprecated_class_hash(contract_class=contract_class)
+    assert_equal(recalculated_hash, DEFAULT_ACCOUNT_HASH)
 
 
 @pytest.mark.account_predeployed
diff --git a/test/test_block_genesis.py b/test/test_block_genesis.py
index e1d10315b..90b8ab272 100644
--- a/test/test_block_genesis.py
+++ b/test/test_block_genesis.py
@@ -4,6 +4,8 @@
 
 import pytest
 
+from starknet_devnet.constants import STARKNET_CLI_ACCOUNT_CLASS_HASH
+
 from .util import get_block
 
 FEE_TOKEN_CLASS_HASH = (
@@ -13,9 +15,6 @@
 CHARGEABLE_ACCOUNT_CLASS_HASH = (
     "0x4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f"
 )
-STARKNET_CLI_ACCOUNT_CLASS_HASH = (
-    "0x6f500f527355dfdb8093c7fe46e6f73c96a867392b49fa4157a757538928539"
-)
 
 
 @pytest.fixture(name="last_tx_hash")
@@ -59,7 +58,7 @@ def test_genesis_block_transactions(last_tx_hash):
             FEE_TOKEN_CLASS_HASH,
             UDC_CLASS_HASH,
             CHARGEABLE_ACCOUNT_CLASS_HASH,
-            STARKNET_CLI_ACCOUNT_CLASS_HASH,
+            hex(STARKNET_CLI_ACCOUNT_CLASS_HASH),
         ]
     )
     assert declared == expected_declared
diff --git a/test/test_block_number.py b/test/test_block_number.py
index e54182207..47d417e4e 100644
--- a/test/test_block_number.py
+++ b/test/test_block_number.py
@@ -26,7 +26,7 @@ def my_get_block_number(address: str):
     )
 
 
-EXPECTED_TX_HASH = "0x2a80a6c3878fb0b68b2da38b4a488276c014d955d1bf17933aefab6cb722121"
+EXPECTED_TX_HASH = "0x1065005302ad4b72f6e8afdfe0face5e371b81d137e89318b6f0f5e924430b5"
 
 
 @pytest.mark.usefixtures("run_devnet_in_background")
diff --git a/test/test_cairo_vm.py b/test/test_cairo_vm.py
index f427f37b5..6154e0d16 100644
--- a/test/test_cairo_vm.py
+++ b/test/test_cairo_vm.py
@@ -18,11 +18,11 @@
     [
         ("", False),
         ("python", False),
-        ("rust", True),
+        # ("rust", True),
     ],
 )
 def test_valid_cairo_vm(cairo_vm, assert_rust_vm_logged):
-    """Test if the invalid chain id fails"""
+    """Test valid cairo vm options"""
 
     env_copy = os.environ.copy()
     env_copy[_VM_VAR] = cairo_vm
@@ -39,6 +39,26 @@ def test_valid_cairo_vm(cairo_vm, assert_rust_vm_logged):
     assert proc.returncode == 0
 
 
+# TMP: rust vm
+def test_rust_vm_temporarily_unavailable():
+    """
+    Temporarily test that rust vm is unavailable.
+    When deleting this test-case, uncomment the rust case in test_valid_cairo_vm
+    """
+
+    env_copy = os.environ.copy()
+    env_copy[_VM_VAR] = "rust"
+
+    proc = ACTIVE_DEVNET.start(stderr=subprocess.PIPE, env=env_copy)
+    terminate_and_wait(proc)
+
+    stderr = proc.stderr.read().decode("utf-8")
+    assert _RUST_VM_LOG_LINE not in stderr
+    assert "Rust Cairo VM is temporarily not available" in stderr
+
+    assert proc.returncode == 1
+
+
 def test_passing_if_no_cairo_vm_set():
     """If no vm env var set, it should assume python and pass"""
     env_copy = os.environ.copy()
diff --git a/test/test_declare.py b/test/test_declare.py
index f32162c89..4f518bd4b 100644
--- a/test/test_declare.py
+++ b/test/test_declare.py
@@ -4,7 +4,6 @@
 
 import pytest
 import requests
-from starkware.starknet.definitions.error_codes import StarknetErrorCode
 
 from .account import declare
 from .settings import APP_URL
@@ -19,7 +18,9 @@
     assert_class_by_hash,
     assert_hex_equal,
     assert_tx_status,
+    assert_undeclared_class,
     devnet_in_background,
+    get_compiled_class_by_class_hash,
 )
 
 
@@ -38,11 +39,11 @@ def test_declare_max_fee_too_low():
     assert_hex_equal(class_hash, EXPECTED_CLASS_HASH)
     assert_tx_status(declare_info["tx_hash"], "REJECTED")
 
-    resp = requests.get(
-        f"{APP_URL}/feeder_gateway/get_class_by_hash?classHash={class_hash}"
+    assert_undeclared_class(
+        resp=requests.get(
+            f"{APP_URL}/feeder_gateway/get_class_by_hash?classHash={class_hash}"
+        )
     )
-    assert resp.json()["code"] == str(StarknetErrorCode.UNDECLARED_CLASS)
-    assert resp.status_code == 500
 
 
 @pytest.mark.declare
@@ -60,3 +61,5 @@ def test_declare_happy_path():
     assert_hex_equal(class_hash, EXPECTED_CLASS_HASH)
     assert_tx_status(declare_info["tx_hash"], "ACCEPTED_ON_L2")
     assert_class_by_hash(class_hash, CONTRACT_PATH)
+
+    assert_undeclared_class(resp=get_compiled_class_by_class_hash(class_hash))
diff --git a/test/test_declare_v2.py b/test/test_declare_v2.py
new file mode 100644
index 000000000..f72d7a88e
--- /dev/null
+++ b/test/test_declare_v2.py
@@ -0,0 +1,226 @@
+"""
+Tests of v2 declaration.
+"""
+
+import pytest
+import requests
+from starkware.starknet.core.os.contract_class.compiled_class_hash import (
+    compute_compiled_class_hash,
+)
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClass,
+    ContractClass,
+)
+from starkware.starknet.services.api.contract_class.contract_class_utils import (
+    load_sierra,
+)
+
+from .account import deploy, invoke, send_declare_v2
+from .settings import APP_URL
+from .shared import (
+    ABI_1_PATH,
+    CONTRACT_1_CASM_PATH,
+    CONTRACT_1_PATH,
+    PREDEPLOY_ACCOUNT_CLI_ARGS,
+    PREDEPLOYED_ACCOUNT_ADDRESS,
+    PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+)
+from .test_state_update import get_state_update
+from .util import (
+    assert_hex_equal,
+    assert_tx_status,
+    assert_undeclared_class,
+    call,
+    devnet_in_background,
+    get_class_by_hash,
+    get_compiled_class_by_class_hash,
+)
+
+
+def assert_declare_v2_accepted(resp: requests.Response):
+    """Assert status of declaration is accepted"""
+    assert resp.status_code == 200
+
+    declare_tx_hash = resp.json()["transaction_hash"]
+    assert_tx_status(tx_hash=declare_tx_hash, expected_tx_status="ACCEPTED_ON_L2")
+
+
+def _assert_already_declared(declaration_resp: requests.Response):
+    assert declaration_resp.status_code == 200, declaration_resp.json()
+    declare_tx_hash = declaration_resp.json()["transaction_hash"]
+
+    tx_resp = requests.get(
+        f"{APP_URL}/feeder_gateway/get_transaction",
+        params={"transactionHash": declare_tx_hash},
+    )
+    assert tx_resp.status_code == 200, tx_resp.json()
+    tx_resp_body = tx_resp.json()
+
+    assert tx_resp_body.get("status") == "REJECTED", tx_resp_body
+    assert (
+        "already declared"
+        in tx_resp_body["transaction_failure_reason"]["error_message"]
+    )
+
+
+def _assert_invalid_compiled_class_hash(declaration_resp: requests.Response):
+    assert declaration_resp.status_code == 200, declaration_resp.json()
+    declare_tx_hash = declaration_resp.json()["transaction_hash"]
+
+    tx_resp = requests.get(
+        f"{APP_URL}/feeder_gateway/get_transaction",
+        params={"transactionHash": declare_tx_hash},
+    )
+    assert tx_resp.status_code == 200, tx_resp.json()
+    tx_resp_body = tx_resp.json()
+
+    assert tx_resp_body.get("status") == "REJECTED", tx_resp_body
+    assert (
+        "Compiled class hash not matching"
+        in tx_resp_body["transaction_failure_reason"]["error_message"]
+    )
+
+
+def load_cairo1_contract():
+    """Returns (contract_class, compiled_class, compiled_class_hash)"""
+    contract_class = load_sierra(CONTRACT_1_PATH)
+    with open(CONTRACT_1_CASM_PATH, encoding="utf-8") as casm_file:
+        compiled_class = CompiledClass.loads(casm_file.read())
+    compiled_class_hash = compute_compiled_class_hash(compiled_class)
+
+    return contract_class, compiled_class, compiled_class_hash
+
+
+@pytest.mark.declare
+@devnet_in_background(*PREDEPLOY_ACCOUNT_CLI_ARGS)
+def test_declare_v2_invalid_compiled_class_hash():
+    """Set an invalid compiled class hash and expect failure"""
+    contract_class, _, compiled_class_hash = load_cairo1_contract()
+    _assert_invalid_compiled_class_hash(
+        send_declare_v2(
+            contract_class=contract_class,
+            # invalid compiled class hash
+            compiled_class_hash=compiled_class_hash + 1,
+            sender_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+            sender_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        )
+    )
+
+
+@pytest.mark.declare
+@devnet_in_background(*PREDEPLOY_ACCOUNT_CLI_ARGS)
+def test_redeclaring_v2():
+    """Should fail if redeclaring"""
+    contract_class, _, compiled_class_hash = load_cairo1_contract()
+    send_declare_v2(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        sender_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+    )
+
+    _assert_already_declared(
+        send_declare_v2(
+            contract_class=contract_class,
+            compiled_class_hash=compiled_class_hash,
+            sender_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+            sender_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        )
+    )
+
+
+@pytest.mark.declare
+@devnet_in_background(*PREDEPLOY_ACCOUNT_CLI_ARGS)
+def test_classes_available_after_declare_v2():
+    """Should successfully get class and compiled class by hash"""
+    # assert class present only by class hash
+
+    contract_class, compiled_class, compiled_class_hash = load_cairo1_contract()
+
+    declaration_resp = send_declare_v2(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        sender_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+    )
+    assert_declare_v2_accepted(declaration_resp)
+    class_hash = declaration_resp.json()["class_hash"]
+
+    assert ContractClass.load(get_class_by_hash(class_hash).json()) == contract_class
+    assert_undeclared_class(get_class_by_hash(hex(compiled_class_hash)))
+
+    # assert compiled class retrievable only by class hash
+    assert (
+        CompiledClass.load(get_compiled_class_by_class_hash(class_hash).json())
+        == compiled_class
+    )
+    assert_undeclared_class(get_compiled_class_by_class_hash(hex(compiled_class_hash)))
+
+    # assert class present in the right property of state update
+    state_update = get_state_update()
+    assert "state_diff" in state_update
+
+    assert state_update["state_diff"]["old_declared_contracts"] == []
+    declared_classes = state_update["state_diff"]["declared_classes"]
+    assert len(declared_classes) == 1
+    assert_hex_equal(declared_classes[0]["class_hash"], class_hash)
+    assert_hex_equal(
+        declared_classes[0]["compiled_class_hash"], hex(compiled_class_hash)
+    )
+
+
+def _call_get_balance(address: str) -> int:
+    balance = call(
+        function="get_balance",
+        address=address,
+        abi_path=ABI_1_PATH,
+    )
+    return int(balance, base=10)
+
+
+@pytest.mark.declare
+@devnet_in_background(*PREDEPLOY_ACCOUNT_CLI_ARGS)
+def test_v2_contract_interaction():
+    """Test using declare v2 and interact with contract (deploy, invoke, call)"""
+
+    contract_class, _, compiled_class_hash = load_cairo1_contract()
+
+    # declare
+    declaration_resp = send_declare_v2(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        sender_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+    )
+    assert_declare_v2_accepted(declaration_resp)
+    class_hash = declaration_resp.json()["class_hash"]
+
+    # deploy
+    initial_balance = 10
+    deploy_info = deploy(
+        class_hash=class_hash,
+        account_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        private_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        inputs=[str(initial_balance)],
+        max_fee=int(1e18),
+    )
+    assert_tx_status(
+        tx_hash=deploy_info["tx_hash"], expected_tx_status="ACCEPTED_ON_L2"
+    )
+
+    # call after deployment
+    initial_fetched_balance = _call_get_balance(deploy_info["address"])
+    assert initial_fetched_balance == initial_balance
+
+    # invoke
+    increment_value = 15
+    invoke_tx_hash = invoke(
+        calls=[(deploy_info["address"], "increase_balance", [increment_value, 0])],
+        account_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        private_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+    )
+    assert_tx_status(tx_hash=invoke_tx_hash, expected_tx_status="ACCEPTED_ON_L2")
+
+    # call after invoke
+    fetched_balance_after_invoke = _call_get_balance(deploy_info["address"])
+    assert fetched_balance_after_invoke == initial_balance + increment_value
diff --git a/test/test_declare_v2_forked.py b/test/test_declare_v2_forked.py
new file mode 100644
index 000000000..59544bada
--- /dev/null
+++ b/test/test_declare_v2_forked.py
@@ -0,0 +1,88 @@
+"""
+Test declare v2 in forked mode.
+The benefit of having this in a separate file is the ability to parallelize.
+"""
+
+from starkware.starknet.services.api.contract_class.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class_utils import (
+    load_sierra,
+)
+
+from .account import send_declare_v2
+from .settings import APP_URL
+from .shared import (
+    CONTRACT_1_CASM_PATH,
+    CONTRACT_1_PATH,
+    EXPECTED_CLASS_1_HASH,
+    PREDEPLOYED_ACCOUNT_ADDRESS,
+    PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+)
+from .test_declare_v2 import assert_declare_v2_accepted, load_cairo1_contract
+from .testnet_deployment import (
+    TESTNET_DEPLOYMENT_BLOCK,
+    TESTNET_FORK_PARAMS,
+    TESTNET_URL,
+)
+from .util import (
+    assert_class_by_hash_not_present,
+    assert_compiled_class_by_hash,
+    assert_compiled_class_by_hash_not_present,
+    assert_tx_status,
+    devnet_in_background,
+    get_class_by_hash,
+)
+
+
+@devnet_in_background(
+    *TESTNET_FORK_PARAMS, "--fork-block", str(TESTNET_DEPLOYMENT_BLOCK - 1)
+)
+def test_declare_v2_and_get_class_by_hash():
+    """Test class declaration and class getting by hash"""
+
+    assert_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_1_HASH, feeder_gateway_url=TESTNET_URL
+    )
+    assert_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_1_HASH, feeder_gateway_url=APP_URL
+    )
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_1_HASH, feeder_gateway_url=TESTNET_URL
+    )
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_1_HASH, feeder_gateway_url=APP_URL
+    )
+
+    contract_class, _, compiled_class_hash = load_cairo1_contract()
+
+    declaration_resp = send_declare_v2(
+        contract_class=contract_class,
+        compiled_class_hash=compiled_class_hash,
+        sender_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        sender_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+    )
+    assert_declare_v2_accepted(declaration_resp)
+
+    declare_info = declaration_resp.json()
+    assert int(declare_info["class_hash"], 16) == int(EXPECTED_CLASS_1_HASH, 16)
+    assert_tx_status(declare_info["transaction_hash"], "ACCEPTED_ON_L2")
+
+    assert_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_1_HASH, feeder_gateway_url=TESTNET_URL
+    )
+
+    # assert class by hash, util.assert_class_by_hash not applicable
+    resp = get_class_by_hash(EXPECTED_CLASS_1_HASH, feeder_gateway_url=APP_URL)
+    assert resp.status_code == 200, resp.text
+    sierra_dict = resp.json()
+    sierra_dict.pop("sierra_program_debug_info", None)
+    sierra = ContractClass.load(sierra_dict)
+    assert load_sierra(CONTRACT_1_PATH) == sierra
+
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_1_HASH, feeder_gateway_url=TESTNET_URL
+    )
+    assert_compiled_class_by_hash(
+        class_hash=EXPECTED_CLASS_1_HASH,
+        expected_path=CONTRACT_1_CASM_PATH,
+        feeder_gateway_url=APP_URL,
+    )
diff --git a/test/test_deploy.py b/test/test_deploy.py
index f507fd4ba..b2f25763b 100644
--- a/test/test_deploy.py
+++ b/test/test_deploy.py
@@ -5,12 +5,16 @@
 import pytest
 from starkware.starknet.core.os.contract_address.contract_address import (
     calculate_contract_address,
-    compute_class_hash,
+)
+from starkware.starknet.core.os.contract_class.deprecated_class_hash import (
+    compute_deprecated_class_hash,
 )
 from starkware.starknet.definitions.general_config import DEFAULT_CHAIN_ID
 from starkware.starknet.definitions.transaction_type import TransactionType
 from starkware.starknet.public.abi import get_selector_from_name
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.feeder_gateway.response_objects import (
     TransactionStatus,
 )
@@ -60,7 +64,7 @@
 def get_contract_class():
     """Get the contract class from the contract.json file."""
     with open(CONTRACT_PATH, "r", encoding="utf-8") as contract_class_file:
-        return ContractClass.loads(contract_class_file.read())
+        return DeprecatedCompiledClass.loads(contract_class_file.read())
 
 
 def get_deploy_transaction(inputs: List[int], salt=0):
@@ -116,10 +120,6 @@ async def test_deploy(starknet_wrapper_args, expected_block_hash):
         contract_class=deploy_transaction.contract_definition,
     )
 
-    assert_hex_equal(
-        hex(tx_hash),
-        "0x29c0f6e2321da26dd143dc772740526416294e9300634ec646cb525c3eb9c5e",
-    )
     assert contract_address == expected_contract_address
 
     tx_status = await devnet.transactions.get_transaction_status(hex(tx_hash))
@@ -131,7 +131,9 @@ async def test_deploy(starknet_wrapper_args, expected_block_hash):
 
 def test_predeclared_oz_account():
     """Test that precomputed class matches"""
-    assert STARKNET_CLI_ACCOUNT_CLASS_HASH == compute_class_hash(oz_account_class)
+    assert STARKNET_CLI_ACCOUNT_CLASS_HASH == compute_deprecated_class_hash(
+        oz_account_class
+    )
 
 
 @devnet_in_background()
@@ -154,11 +156,11 @@ def deploy_account_test_body():
     account_address, deploy_account_tx = sign_deploy_account_tx(
         private_key=private_key,
         public_key=public_key,
-        class_hash=compute_class_hash(oz_account_class),
+        class_hash=compute_deprecated_class_hash(oz_account_class),
         salt=account_salt,
         max_fee=int(1e18),
         version=SUPPORTED_TX_VERSION,
-        chain_id=DEFAULT_CHAIN_ID.value,
+        chain_id=DEFAULT_CHAIN_ID,
         nonce=0,
     )
     deploy_account_tx = deploy_account_tx.dump()
@@ -194,7 +196,7 @@ def deploy_account_test_body():
         contract_address=int(contract_address, 16),
         selector=get_selector_from_name("increase_balance"),
         calldata=[10, 20],
-        chain_id=DEFAULT_CHAIN_ID.value,
+        chain_id=DEFAULT_CHAIN_ID,
         max_fee=int(1e18),
         version=SUPPORTED_TX_VERSION,
         nonce=1,
diff --git a/test/test_fork.py b/test/test_fork.py
index 2e47c92a8..711b74907 100644
--- a/test/test_fork.py
+++ b/test/test_fork.py
@@ -13,7 +13,7 @@
 from .shared import (
     ABI_PATH,
     ALPHA_GOERLI2_URL,
-    ALPHA_MAINNET_URL,
+    ALPHA_GOERLI_URL,
     CONTRACT_PATH,
     PREDEPLOY_ACCOUNT_CLI_ARGS,
     PREDEPLOYED_ACCOUNT_ADDRESS,
@@ -237,8 +237,9 @@ def test_forking_testnet_from_valid_block():
     "run_devnet_in_background, origin_url",
     [
         (
-            [*PREDEPLOY_ACCOUNT_CLI_ARGS, "--fork-network", "alpha-mainnet"],
-            ALPHA_MAINNET_URL,
+            # Used to be a mainnet test, but it's a problem if mainnet hasn't been updated
+            [*PREDEPLOY_ACCOUNT_CLI_ARGS, "--fork-network", "alpha-goerli"],
+            ALPHA_GOERLI_URL,
         ),
         ([*TESTNET_FORK_PARAMS], TESTNET_URL),
     ],
diff --git a/test/test_fork_feeder_gateway.py b/test/test_fork_feeder_gateway.py
index df86b7679..6aaa9b3ce 100644
--- a/test/test_fork_feeder_gateway.py
+++ b/test/test_fork_feeder_gateway.py
@@ -34,6 +34,7 @@
     assert_class_by_hash,
     assert_class_by_hash_not_present,
     assert_class_hash_at_address,
+    assert_compiled_class_by_hash_not_present,
     assert_contract_code_not_present,
     assert_contract_code_present,
     assert_full_contract,
@@ -51,10 +52,10 @@
 
 DEPLOYMENT_INPUT = "10"
 EXPECTED_DEPLOYMENT_ADDRESS = (
-    "0x0737ae2bc29753c32794143d098d87f2f96bdcbb9acd83969318522af90e4ebe"
+    "0x0122ab9601964393400c68fee98f80f8f194c86a8c966b57418bcdc59fd53434"
 )
 EXPECTED_INVOKE_HASH = (
-    "0x51b501687e77d5433c7fc00b3a6dd25c2f6edf95f506dd9cba2251a4ce9ed43"
+    "0x54dd317f451041c1d4f138538ee665bff505dbeeec575902122014b60d0ce06"
 )
 
 
@@ -179,6 +180,12 @@ def test_declare_and_get_class_by_hash():
     assert_class_by_hash_not_present(
         class_hash=EXPECTED_CLASS_HASH, feeder_gateway_url=APP_URL
     )
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_HASH, feeder_gateway_url=TESTNET_URL
+    )
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_HASH, feeder_gateway_url=APP_URL
+    )
 
     declare_info = declare(
         contract_path=CONTRACT_PATH,
@@ -197,6 +204,13 @@ def test_declare_and_get_class_by_hash():
         expected_path=CONTRACT_PATH,
         feeder_gateway_url=APP_URL,
     )
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_HASH, feeder_gateway_url=TESTNET_URL
+    )
+    assert_compiled_class_by_hash_not_present(
+        class_hash=EXPECTED_CLASS_HASH,
+        feeder_gateway_url=APP_URL,
+    )
 
 
 def _assert_transaction_trace_not_present(tx_hash: str, feeder_gateway_url=APP_URL):
diff --git a/test/test_l1_l2_mock_messaging.py b/test/test_l1_l2_mock_messaging.py
index 923e96935..bd24dc187 100644
--- a/test/test_l1_l2_mock_messaging.py
+++ b/test/test_l1_l2_mock_messaging.py
@@ -2,10 +2,16 @@
 Test l1 l2 mock messaging.
 """
 
+import json
+
+import pytest
 import requests
 from starkware.starknet.definitions.error_codes import StarknetErrorCode
 from starkware.starknet.public.abi import get_selector_from_name
 from starkware.starkware_utils.error_handling import StarkErrorCode
+from werkzeug.test import TestResponse
+
+from starknet_devnet.server import app
 
 from .account import invoke
 from .settings import APP_URL
@@ -43,6 +49,9 @@
 # user and amount for L1 contract
 MESSAGE_TO_L2_PAYLOAD = ["0x1", "0x1"]
 
+# currently any non-zero value will do
+DUMMY_PAID_FEE_ON_L1 = "0x1"
+
 
 def send_message_to_l2(req_dict: dict):
     """Sends the dict in a POST request and returns the response data."""
@@ -60,6 +69,14 @@ def consume_message_from_l2(req_dict: dict):
     )
 
 
+def _post_through_test_client(url: str, data: dict) -> TestResponse:
+    return app.test_client().post(
+        url,
+        content_type="application/json",
+        data=json.dumps(data),
+    )
+
+
 @devnet_in_background()
 def test_send_message_to_l2_deploy_execute():
     """Test POST l1 to l2 deploy contract and execute transaction"""
@@ -74,9 +91,13 @@ def test_send_message_to_l2_deploy_execute():
             "l1_contract_address": L1_CONTRACT_ADDRESS,
             "payload": MESSAGE_TO_L2_PAYLOAD,
             "nonce": MESSAGE_TO_L2_NONCE,
+            "paid_fee_on_l1": DUMMY_PAID_FEE_ON_L1,
         }
     )
 
+    assert response.status_code == 200, response.json()
+    assert_tx_status(response.json().get("transaction_hash"), "ACCEPTED_ON_L2")
+
     # Check balance of user
     value = call(
         function="get_balance",
@@ -85,43 +106,65 @@ def test_send_message_to_l2_deploy_execute():
         inputs=[str(USER_ID)],
     )
     assert int(value) == 1
-    assert response.status_code == 200
-    assert_tx_status(response.json().get("transaction_hash"), "ACCEPTED_ON_L2")
 
 
-@devnet_in_background()
-def test_send_message_to_l2_execute_without_data():
-    """Test POST l1 to l2 without data"""
-    # Create l1 to l2 mock transaction
-    response = send_message_to_l2(
-        {
-            "l2_contract_address": "",
-            "entry_point_selector": "",
-            "l1_contract_address": "",
-            "payload": "",
-            "nonce": "",
-        }
-    )
+_VALID_MESSAGE_TO_L2_BODY = {
+    "l2_contract_address": L2_CONTRACT_ADDRESS,
+    "entry_point_selector": ENTRY_POINT_SELECTOR,
+    "l1_contract_address": L1_CONTRACT_ADDRESS,
+    "payload": MESSAGE_TO_L2_PAYLOAD,
+    "nonce": MESSAGE_TO_L2_NONCE,
+    "paid_fee_on_l1": DUMMY_PAID_FEE_ON_L1,
+}
 
-    assert response.status_code == 500
-    assert response.json().get("code") == str(StarkErrorCode.MALFORMED_REQUEST)
+
+@pytest.mark.parametrize("removable_prop", _VALID_MESSAGE_TO_L2_BODY.keys())
+def test_send_message_to_l2_execute_without_data(removable_prop: str):
+    """Test POST l1 to l2 without each property"""
+
+    data = _VALID_MESSAGE_TO_L2_BODY.copy()
+    data.pop(removable_prop)
+    response = _post_through_test_client("/postman/send_message_to_l2", data)
+
+    assert response.status_code == 400, response.json
+    assert response.json.get("code") == str(StarkErrorCode.MALFORMED_REQUEST)
+
+
+@pytest.mark.parametrize(
+    "prop", [key for key in _VALID_MESSAGE_TO_L2_BODY if key != "payload"]
+)
+def test_send_message_to_l2_execute_with_data_set_to_empty_string(prop: str):
+    """Test POST l1 to l2 without each property (except payload) set to empty string."""
+
+    data = _VALID_MESSAGE_TO_L2_BODY.copy()
+    data[prop] = ""
+    response = _post_through_test_client("/postman/send_message_to_l2", data)
+
+    assert response.status_code == 500, response.json
+    assert response.json.get("code") == str(StarkErrorCode.MALFORMED_REQUEST)
 
 
 @devnet_in_background()
 def test_send_message_to_l2_execute_without_deploy():
     """Test POST l1 to l2 without the target contract being deployed"""
     # Create l1 to l2 mock transaction
-    response = send_message_to_l2(
-        {
-            "l2_contract_address": L2_CONTRACT_ADDRESS,
-            "entry_point_selector": ENTRY_POINT_SELECTOR,
-            "l1_contract_address": L1_CONTRACT_ADDRESS,
-            "payload": MESSAGE_TO_L2_PAYLOAD,
-            "nonce": MESSAGE_TO_L2_NONCE,
-        }
-    )
+    response = send_message_to_l2(_VALID_MESSAGE_TO_L2_BODY)
 
-    assert response.status_code == 200
+    assert response.status_code == 200, response.json()
+    assert_tx_status(response.json().get("transaction_hash"), "REJECTED")
+
+
+@devnet_in_background()
+def test_send_message_to_l2_with_zero_message_fee():
+    """Should fail if message fee is zero"""
+    deploy_info = deploy(L1L2_CONTRACT_PATH)
+
+    data = _VALID_MESSAGE_TO_L2_BODY.copy()
+    data["l2_contract_address"] = deploy_info["address"]
+    data["paid_fee_on_l1"] = "0x0"
+    response = send_message_to_l2(data)
+
+    assert response.status_code == 200, response.json()
     assert_tx_status(response.json().get("transaction_hash"), "REJECTED")
 
 
@@ -177,33 +220,33 @@ def test_consume_message_from_l2_deploy_execute_without_withdraw():
     )
 
 
-@devnet_in_background()
 def test_consume_message_from_l2_execute_without_data():
     """Test POST l2 to l1 deploy without data"""
-    response = consume_message_from_l2(
+    response = _post_through_test_client(
+        "/postman/consume_message_from_l2",
         {
             "l2_contract_address": "",
             "l1_contract_address": "",
             "payload": "",
-        }
+        },
     )
 
     assert response.status_code == 500
-    assert response.json().get("code") == str(StarkErrorCode.MALFORMED_REQUEST)
+    assert response.json.get("code") == str(StarkErrorCode.MALFORMED_REQUEST)
 
 
-@devnet_in_background()
 def test_consume_message_from_l2_execute_without_deploy():
     """Test POST l2 to l1 without contract deploy"""
-    response = consume_message_from_l2(
+    response = _post_through_test_client(
+        "/postman/consume_message_from_l2",
         {
             "l2_contract_address": L2_CONTRACT_ADDRESS,
             "l1_contract_address": L1_CONTRACT_ADDRESS,
             "payload": CONSUME_PAYLOAD,
-        }
+        },
     )
 
     assert response.status_code == 500
-    assert response.json().get("code") == str(
+    assert response.json.get("code") == str(
         StarknetErrorCode.L1_TO_L2_MESSAGE_ZEROED_COUNTER
     )
diff --git a/test/test_postman.py b/test/test_postman.py
index f3808cf80..44c02115d 100644
--- a/test/test_postman.py
+++ b/test/test_postman.py
@@ -20,6 +20,7 @@
     PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
 )
 from .util import (
+    assert_tx_status,
     call,
     deploy,
     devnet_in_background,
@@ -70,7 +71,11 @@ def flush():
 
 
 def assert_flush_response(
-    response, expected_from_l1, expected_from_l2, expected_l1_provider
+    response,
+    expected_from_l1,
+    expected_from_l2,
+    expected_l1_provider,
+    expected_generated_l2_transactions: int,
 ):
     """Asserts that the flush response is correct"""
 
@@ -113,6 +118,10 @@ def assert_flush_response(
         assert l2_message["to_address"] == expected_from_l2[i]["to_address"].lower()
         assert l2_message["payload"] == [hex(x) for x in expected_from_l2[i]["payload"]]
 
+    assert (
+        len(response["generated_l2_transactions"]) == expected_generated_l2_transactions
+    )
+
 
 def init_messaging_contract():
     """Initializes the messaging contract"""
@@ -193,6 +202,7 @@ def _init_l2_contract(l1l2_example_contract_address: str):
             }
         ],
         expected_l1_provider=L1_URL,
+        expected_generated_l2_transactions=0,
     )
 
     # assert balance
@@ -218,11 +228,13 @@ def _l1_l2_message_exchange(web3, l1l2_example_contract, l2_contract_address):
     withdraw_amount = 1000
     web3_transact(
         web3,
-        "withdraw",
-        l1l2_example_contract,
-        int(l2_contract_address, base=16),
-        USER_ID,
-        withdraw_amount,
+        function_name="withdraw",
+        contract=l1l2_example_contract,
+        function_args=[
+            int(l2_contract_address, base=16),
+            USER_ID,
+            withdraw_amount,
+        ],
     )
 
     # Check if l2 to l1 message is included in transaction_receipts
@@ -255,11 +267,14 @@ def _l1_l2_message_exchange(web3, l1l2_example_contract, l2_contract_address):
     # deposit in l1 and assert contract balance
     web3_transact(
         web3,
-        "deposit",
-        l1l2_example_contract,
-        int(l2_contract_address, base=16),
-        USER_ID,
-        600,
+        function_name="deposit",
+        contract=l1l2_example_contract,
+        function_args=[
+            int(l2_contract_address, base=16),
+            USER_ID,
+            600,
+        ],
+        value=1,  # for now any message fee >0 is ok
     )
 
     balance = web3_call("userBalances", l1l2_example_contract, USER_ID)
@@ -283,8 +298,12 @@ def _l1_l2_message_exchange(web3, l1l2_example_contract, l2_contract_address):
         ],
         expected_from_l2=[],
         expected_l1_provider=L1_URL,
+        expected_generated_l2_transactions=1,
     )
 
+    generated_l2_transaction = flush_response["generated_l2_transactions"][0]
+    assert_tx_status(generated_l2_transaction, "ACCEPTED_ON_L2")
+
     # assert l2 contract balance
     l2_balance = call(
         function="get_balance",
@@ -297,10 +316,13 @@ def _l1_l2_message_exchange(web3, l1l2_example_contract, l2_contract_address):
 
     # Check if last block contains L1_HANDLER transaction and event contains the correct balance
     latest_block = get_block(parse=True)
-    assert latest_block["transactions"][0]["type"] == "L1_HANDLER"
-    assert latest_block["transaction_receipts"][0]["events"][0]["data"][1] == hex(
-        int(l2_balance)
-    )
+
+    assert len(latest_block["transactions"]) == 1
+    l2_transaction = latest_block["transactions"][0]
+
+    assert l2_transaction["type"] == "L1_HANDLER"
+    latest_receipts = latest_block["transaction_receipts"]
+    assert latest_receipts[0]["events"][0]["data"][1] == hex(int(l2_balance))
 
 
 @pytest.mark.web3_messaging
diff --git a/test/test_replace_class.py b/test/test_replace_class.py
new file mode 100644
index 000000000..73bb576e8
--- /dev/null
+++ b/test/test_replace_class.py
@@ -0,0 +1,84 @@
+"""Test class replacement"""
+
+from .account import declare, deploy, invoke
+from .shared import (
+    PREDEPLOY_ACCOUNT_CLI_ARGS,
+    PREDEPLOYED_ACCOUNT_ADDRESS,
+    PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+    REPLACEABLE_ABI_PATH,
+    REPLACEABLE_CONTRACT_PATH,
+    REPLACING_ABI_PATH,
+    REPLACING_CONTRACT_PATH,
+)
+from .test_state_update import get_state_update
+from .util import (
+    assert_class_hash_at_address,
+    assert_hex_equal,
+    assert_tx_status,
+    call,
+    devnet_in_background,
+)
+
+
+@devnet_in_background(*PREDEPLOY_ACCOUNT_CLI_ARGS)
+def test_replace_class_happy_path():
+    """Deploy a contract, replace its class, assert it's replaced"""
+
+    # declare original
+    replaceable_declare_info = declare(
+        REPLACEABLE_CONTRACT_PATH,
+        account_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        private_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        max_fee=int(1e18),
+    )
+
+    # declare the replacing class
+    replacing_declare_info = declare(
+        REPLACING_CONTRACT_PATH,
+        account_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        private_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        max_fee=int(1e18),
+    )
+    new_class_hash = replacing_declare_info["class_hash"]
+
+    replaceable_deploy_info = deploy(
+        class_hash=replaceable_declare_info["class_hash"],
+        account_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        private_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        max_fee=int(1e18),
+    )
+    contract_address = replaceable_deploy_info["address"]
+
+    foo_before_replacement = call(
+        function="foo",
+        address=contract_address,
+        abi_path=REPLACEABLE_ABI_PATH,
+    )
+    assert int(foo_before_replacement) == 42
+
+    replacement_tx_hash = invoke(
+        calls=[(contract_address, "replace", [int(new_class_hash, 16)])],
+        account_address=PREDEPLOYED_ACCOUNT_ADDRESS,
+        private_key=PREDEPLOYED_ACCOUNT_PRIVATE_KEY,
+        max_fee=int(1e18),
+    )
+    assert_tx_status(replacement_tx_hash, "ACCEPTED_ON_L2")
+
+    foo_after_replacement = call(
+        function="foo",
+        address=contract_address,
+        # REPLACEABLE_ABI_PATH could be used with the same effect
+        abi_path=REPLACING_ABI_PATH,
+    )
+    assert foo_before_replacement != foo_after_replacement
+    assert int(foo_after_replacement) == 43
+
+    # assert state update contains replacement info
+    state_update = get_state_update()
+    replaced_classes = state_update["state_diff"]["replaced_classes"]
+    assert len(replaced_classes) == 1
+    assert_hex_equal(replaced_classes[0]["address"], contract_address)
+    assert_hex_equal(replaced_classes[0]["class_hash"], new_class_hash)
+
+    # assert retrieved class is the new one
+    assert_class_hash_at_address(contract_address, new_class_hash)
diff --git a/test/test_state_update.py b/test/test_state_update.py
index 3ed12d3d9..f355757df 100644
--- a/test/test_state_update.py
+++ b/test/test_state_update.py
@@ -6,7 +6,9 @@
 
 import pytest
 import requests
-from starkware.starknet.core.os.class_hash import compute_class_hash
+from starkware.starknet.core.os.contract_class.deprecated_class_hash import (
+    compute_deprecated_class_hash,
+)
 from starkware.starknet.public.abi import get_selector_from_name
 
 from .account import declare, invoke
@@ -67,7 +69,7 @@ def deploy_empty_contract():
 def get_class_hash_at_path(contract_path: str):
     """Get contract hash of the sample contract"""
     contract_class = load_contract_class(contract_path)
-    return compute_class_hash(contract_class)
+    return compute_deprecated_class_hash(contract_class)
 
 
 @pytest.mark.state_update
@@ -217,7 +219,8 @@ def test_declaration_and_deployment():
     assert_hex_equal(contract_class_hash, EXPECTED_CLASS_HASH)
 
     diff_after_declare = get_state_update()["state_diff"]
-    assert diff_after_declare["declared_contracts"] == [contract_class_hash]
+    assert diff_after_declare["old_declared_contracts"] == [contract_class_hash]
+    assert diff_after_declare["declared_classes"] == []
 
     # Deploy the deployer - also deploys a contract of the declared class using the deploy syscall
     initial_balance_in_constructor = "5"
@@ -238,4 +241,4 @@ def test_declaration_and_deployment():
     # deployed_contract_diff["address"] is a random value
 
     # deployer expected to be declared
-    assert diff_after_deploy["declared_contracts"] == [deployer_class_hash]
+    assert diff_after_deploy["old_declared_contracts"] == [deployer_class_hash]
diff --git a/test/testnet_deployment.py b/test/testnet_deployment.py
index 805ee0761..69c2e1f0f 100644
--- a/test/testnet_deployment.py
+++ b/test/testnet_deployment.py
@@ -13,4 +13,4 @@
     "0x028c7d54caa154d29953a26857c200623fd185bffa178a185d0ff247d22127a9"
 )
 TESTNET_DEPLOYMENT_BLOCK = 8827  # this is when the contract was deployed
-TESTNET_FORK_PARAMS = [*PREDEPLOY_ACCOUNT_CLI_ARGS, "--fork-network", "alpha-goerli2"]
+TESTNET_FORK_PARAMS = [*PREDEPLOY_ACCOUNT_CLI_ARGS, "--fork-network", TESTNET_URL]
diff --git a/test/util.py b/test/util.py
index 6a83fcf35..75cbedbdc 100644
--- a/test/util.py
+++ b/test/util.py
@@ -14,8 +14,13 @@
 import requests
 from starkware.starknet.cli.starknet_cli import get_salt
 from starkware.starknet.definitions.error_codes import StarknetErrorCode
+from starkware.starknet.definitions.general_config import StarknetChainId
 from starkware.starknet.definitions.transaction_type import TransactionType
-from starkware.starknet.services.api.contract_class import ContractClass
+from starkware.starknet.services.api.contract_class.contract_class import (
+    CompiledClass,
+    CompiledClassBase,
+    DeprecatedCompiledClass,
+)
 from starkware.starknet.services.api.gateway.transaction import Deploy
 
 from starknet_devnet.general_config import DEFAULT_GENERAL_CONFIG
@@ -250,7 +255,7 @@ def assert_transaction(
     if tx_type == "INVOKE_FUNCTION":
         invoke_transaction_keys = [
             "calldata",
-            "contract_address",
+            "sender_address",
             "max_fee",
             "signature",
             "transaction_hash",
@@ -321,6 +326,7 @@ def estimate_fee(
     nonce=None,
     block_number=None,
     block_hash=None,
+    chain_id=StarknetChainId.TESTNET,
     feeder_gateway_url=APP_URL,
 ):
     """Wrapper around starknet estimate_fee. Returns fee in wei."""
@@ -335,6 +341,8 @@ def estimate_fee(
         address,
         "--abi",
         abi_path,
+        "--chain_id",
+        hex(chain_id.value),
     ]
 
     if signature:
@@ -386,7 +394,7 @@ def load_contract_class(contract_path: str):
     """Loads the contract class from the contract path"""
     loaded_contract = load_json_from_path(contract_path)
 
-    return ContractClass.load(loaded_contract)
+    return DeprecatedCompiledClass.load(loaded_contract)
 
 
 def assert_tx_status(tx_hash, expected_tx_status: str, feeder_gateway_url=APP_URL):
@@ -395,6 +403,7 @@ def assert_tx_status(tx_hash, expected_tx_status: str, feeder_gateway_url=APP_UR
         ["tx_status", "--hash", tx_hash], gateway_url=feeder_gateway_url
     )
     response = json.loads(output.stdout)
+    assert "tx_status" in response
     tx_status = response["tx_status"]
     assert_equal(tx_status, expected_tx_status, response)
 
@@ -429,7 +438,7 @@ def assert_contract_code_not_present(address: str, feeder_gateway_url=APP_URL):
     assert resp.status_code == 200
 
 
-def assert_contract_class(actual_class: ContractClass, expected_class_path: str):
+def assert_contract_class(actual_class: CompiledClassBase, expected_class_path: str):
     """Asserts equality between `actual_class` and class at `expected_class_path`."""
 
     loaded_contract_class = load_contract_class(expected_class_path)
@@ -471,13 +480,13 @@ def get_transaction_receipt(tx_hash: str, feeder_gateway_url=APP_URL):
 
 def get_full_contract(
     contract_address: str, feeder_gateway_url=APP_URL
-) -> ContractClass:
+) -> CompiledClassBase:
     """Gets contract class by contract address"""
     output = run_starknet(
         ["get_full_contract", "--contract_address", contract_address],
         gateway_url=feeder_gateway_url,
     )
-    return ContractClass.loads(output.stdout)
+    return DeprecatedCompiledClass.loads(output.stdout)
 
 
 def assert_full_contract_not_present(address: str, feeder_gateway_url=APP_URL):
@@ -536,21 +545,55 @@ def get_class_by_hash(class_hash: str, feeder_gateway_url=APP_URL):
     )
 
 
+def get_compiled_class_by_class_hash(class_hash: str, feeder_gateway_url=APP_URL):
+    """Gets compiled class by sierra hash"""
+    return requests.get(
+        f"{feeder_gateway_url}/feeder_gateway/get_compiled_class_by_class_hash",
+        {"classHash": class_hash},
+    )
+
+
 def assert_class_by_hash(
     class_hash: str, expected_path: str, feeder_gateway_url=APP_URL
 ):
     """Assert the class at `class_hash` matches what is at `expected_path`."""
     resp = get_class_by_hash(class_hash, feeder_gateway_url=feeder_gateway_url)
-    class_by_hash = ContractClass.loads(resp.text)
+    assert resp.status_code == 200, resp.text
+    class_by_hash = DeprecatedCompiledClass.loads(resp.text).remove_debug_info()
     assert_contract_class(class_by_hash, expected_class_path=expected_path)
-    assert resp.status_code == 200
+
+
+def assert_compiled_class_by_hash(
+    class_hash: str,
+    expected_path: str,
+    feeder_gateway_url=APP_URL,
+):
+    """Assert the compiled class at `class_hash` matches what is at `expected_path`."""
+    resp = get_compiled_class_by_class_hash(
+        class_hash, feeder_gateway_url=feeder_gateway_url
+    )
+    assert resp.status_code == 200, resp.text
+    retrieved_class = CompiledClass.loads(resp.text)
+    with open(expected_path, encoding="utf-8") as expected_file:
+        class_from_disk = CompiledClass.loads(expected_file.read())
+
+    assert retrieved_class == class_from_disk
 
 
 def assert_class_by_hash_not_present(class_hash: str, feeder_gateway_url=APP_URL):
     """Assert the server holds no class at provided `class_hash`."""
     resp = get_class_by_hash(class_hash, feeder_gateway_url=feeder_gateway_url)
-    assert resp.json()["code"] == str(StarknetErrorCode.UNDECLARED_CLASS)
-    assert resp.status_code == 500
+    assert_undeclared_class(resp)
+
+
+def assert_compiled_class_by_hash_not_present(
+    class_hash: str, feeder_gateway_url=APP_URL
+):
+    """Assert the server holds no compiled class corresponding to the provided `class_hash`."""
+    resp = get_compiled_class_by_class_hash(
+        class_hash, feeder_gateway_url=feeder_gateway_url
+    )
+    assert_undeclared_class(resp)
 
 
 def assert_receipt(tx_hash, expected_path):
@@ -756,3 +799,11 @@ def set_time(time_s):
         assert set_time_response.json().get("block_timestamp") == time_s
 
     return set_time_response
+
+
+def assert_undeclared_class(resp=requests.Response):
+    """Assert that the provided response indicates a failure due to an undeclared class"""
+    assert resp.status_code == 500, resp.json()
+    resp_body = resp.json()
+    assert "code" in resp_body
+    assert resp_body["code"] == str(StarknetErrorCode.UNDECLARED_CLASS)
diff --git a/test/web3_util.py b/test/web3_util.py
index 4f5cbddf4..e7e235940 100644
--- a/test/web3_util.py
+++ b/test/web3_util.py
@@ -1,9 +1,12 @@
 """Util functions for invoking and calling Web3 contracts"""
 
+from typing import List
+
 from web3 import Web3
+from web3.contract import Contract, ContractFunction
 
 
-def web3_deploy(web3: Web3, contract, *inputs):
+def web3_deploy(web3: Web3, contract: Contract, *inputs):
     """Deploys a Solidity contract"""
     abi = contract["abi"]
     bytecode = contract["bytecode"]
@@ -13,19 +16,24 @@ def web3_deploy(web3: Web3, contract, *inputs):
     return web3.eth.contract(address=tx_receipt.contractAddress, abi=abi)
 
 
-def web3_transact(web3: Web3, function, contract, *inputs):
-    """Invokes a function in a Web3 contract"""
+def web3_transact(
+    web3: Web3,
+    function_name: str,
+    contract: Contract,
+    function_args: List,
+    value=0,
+):
+    """Invokes a function in a Web3 contract. Argument `value` refers to msg.value (paid amount)."""
 
-    contract_function = contract.get_function_by_name(function)(*inputs)
-    tx_hash = contract_function.transact()
+    contract_function: ContractFunction = contract.get_function_by_name(function_name)
+    tx_hash = contract_function(*function_args).transact({"value": value})
     web3.eth.wait_for_transaction_receipt(tx_hash)
 
     return tx_hash
 
 
-def web3_call(function, contract, *inputs):
+def web3_call(function_name: str, contract: Contract, *inputs):
     """Calls a function in a Web3 contract"""
 
-    value = contract.get_function_by_name(function)(*inputs).call()
-
+    value = contract.get_function_by_name(function_name)(*inputs).call()
     return value