genlayer-test 0.10.1__py3-none-any.whl → 0.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: genlayer-test
3
- Version: 0.10.1
3
+ Version: 0.12.0
4
4
  Summary: GenLayer Testing Suite
5
5
  Author: GenLayer
6
6
  License-Expression: MIT
@@ -24,8 +24,8 @@ Dynamic: license-file
24
24
  # GenLayer Testing Suite
25
25
 
26
26
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/license/mit/)
27
- [![Discord](https://dcbadge.vercel.app/api/server/8Jm4v89VAu?compact=true&style=flat)](https://discord.gg/VpfmXEMN66)
28
- [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/yeagerai.svg?style=social&label=Follow%20%40GenLayer)](https://x.com/GenLayer)
27
+ [![Discord](https://dcbadge.vercel.app/api/server/8Jm4v89VAu?compact=true&style=flat)](https://discord.gg/qjCU4AWnKE)
28
+ [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/genlayerlabs.svg?style=social&label=Follow%20%40GenLayer)](https://x.com/GenLayer)
29
29
  [![PyPI version](https://badge.fury.io/py/genlayer-test.svg)](https://badge.fury.io/py/genlayer-test)
30
30
  [![Documentation](https://img.shields.io/badge/docs-genlayer-blue)](https://docs.genlayer.com/api-references/genlayer-test)
31
31
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -107,7 +107,7 @@ $ pip install genlayer-test
107
107
 
108
108
  2. Install from source:
109
109
  ```bash
110
- $ git clone https://github.com/yeagerai/genlayer-testing-suite
110
+ $ git clone https://github.com/genlayerlabs/genlayer-testing-suite
111
111
  $ cd genlayer-testing-suite
112
112
  $ pip install -e .
113
113
  ```
@@ -312,6 +312,72 @@ The chain type determines various behaviors including RPC endpoints, consensus m
312
312
  - **Prompt Testing & Statistical Analysis** – Evaluate and statistically test prompts for AI-driven contract execution.
313
313
  - **Scalability to Security & Audit Tools** – Designed to extend into security testing and smart contract auditing.
314
314
  - **Custom Transaction Context** – Set custom validators with specific LLM providers and models, and configure GenVM datetime for deterministic testing scenarios.
315
+ - **Direct Execution Mode** – Run contracts directly in Python for ultra-fast unit testing (~ms vs minutes).
316
+
317
+ ## ⚡ Direct vs Simulator Mode
318
+
319
+ The testing suite provides two execution modes:
320
+
321
+ | Mode | How it works | Speed | Use case |
322
+ |------|--------------|-------|----------|
323
+ | **Simulator** | Deploy to GenLayer simulator, interact via RPC | ~minutes | Integration tests, consensus validation |
324
+ | **Direct** | Run Python code directly in-memory | ~milliseconds | Unit tests, rapid development |
325
+
326
+ ### Quick Start with Direct Mode
327
+
328
+ ```python
329
+ def test_token_transfer(direct_vm, direct_deploy):
330
+ # Deploy contract directly in Python (no simulator)
331
+ token = direct_deploy("contracts/Token.py", initial_supply=1000)
332
+
333
+ # Create test addresses
334
+ from gltest.direct import create_address
335
+ alice = create_address("alice")
336
+ bob = create_address("bob")
337
+
338
+ # Set sender and interact
339
+ direct_vm.sender = alice
340
+ token.mint(alice, 500)
341
+ token.transfer(bob, 100)
342
+
343
+ assert token.balances[bob] == 100
344
+ ```
345
+
346
+ ### Available Fixtures
347
+
348
+ | Fixture | Description |
349
+ |---------|-------------|
350
+ | `direct_vm` | VM context with cheatcodes |
351
+ | `direct_deploy` | Deploy contracts directly |
352
+ | `direct_alice`, `direct_bob`, `direct_charlie` | Test addresses |
353
+ | `direct_owner` | Default sender address |
354
+ | `direct_accounts` | List of 10 test addresses |
355
+
356
+ ### Cheatcodes
357
+
358
+ ```python
359
+ # Change sender
360
+ direct_vm.sender = alice
361
+
362
+ # Prank (temporary sender change)
363
+ with direct_vm.prank(bob):
364
+ contract.method() # Called as bob
365
+
366
+ # Snapshots
367
+ snap_id = direct_vm.snapshot()
368
+ contract.modify_state()
369
+ direct_vm.revert(snap_id) # State restored
370
+
371
+ # Expect revert
372
+ with direct_vm.expect_revert("Insufficient balance"):
373
+ contract.transfer(bob, 1000000)
374
+
375
+ # Mock web/LLM (for nondet operations)
376
+ direct_vm.mock_web(r"api\.example\.com", {"status": 200, "body": "{}"})
377
+ direct_vm.mock_llm(r"analyze.*", "positive sentiment")
378
+ ```
379
+
380
+ 📖 **[Full Direct Mode Documentation](docs/direct-runner.md)**
315
381
 
316
382
  ## 📚 Examples
317
383
 
@@ -622,6 +688,205 @@ The `.analyze()` method helps you:
622
688
  - Benchmark performance across multiple runs
623
689
 
624
690
 
691
+ ### Mock Web Responses
692
+
693
+ The Mock Web Response system allows you to simulate HTTP responses for web requests made by intelligent contracts using GenLayer's web methods (`gl.nondet.web.get()`, `gl.nondet.web.post()`, etc.). This feature enables deterministic testing of contracts that interact with external web services without making actual HTTP calls.
694
+
695
+ #### Basic Example
696
+
697
+ Here's a simple example of mocking a web API response:
698
+
699
+ ```python
700
+ from gltest import get_contract_factory, get_validator_factory
701
+ from gltest.types import MockedWebResponse
702
+ import json
703
+
704
+ def test_simple_web_mock():
705
+ # Define mock web responses
706
+ mock_web_response: MockedWebResponse = {
707
+ "nondet_web_request": {
708
+ "https://api.example.com/price": {
709
+ "method": "GET",
710
+ "status": 200,
711
+ "body": json.dumps({"price": 100.50})
712
+ }
713
+ }
714
+ }
715
+
716
+ # Create validators with mock web responses
717
+ validator_factory = get_validator_factory()
718
+ validators = validator_factory.batch_create_mock_validators(
719
+ count=5,
720
+ mock_web_response=mock_web_response
721
+ )
722
+
723
+ # Use validators in transaction context
724
+ transaction_context = {"validators": [v.to_dict() for v in validators]}
725
+
726
+ # Deploy and test contract
727
+ factory = get_contract_factory("PriceOracle")
728
+ contract = factory.deploy(transaction_context=transaction_context)
729
+
730
+ # Contract's web requests will receive the mocked response
731
+ result = contract.update_price().transact(transaction_context=transaction_context)
732
+ ```
733
+
734
+ #### Supported HTTP Methods
735
+
736
+ Mock web responses support all HTTP methods including GET, POST, PUT, DELETE, PATCH, etc.:
737
+
738
+ ```python
739
+ mock_web_response: MockedWebResponse = {
740
+ "nondet_web_request": {
741
+ # GET request
742
+ "https://api.example.com/users/123": {
743
+ "method": "GET",
744
+ "status": 200,
745
+ "body": '{"id": 123, "name": "Alice"}'
746
+ },
747
+ # POST request
748
+ "https://api.example.com/users": {
749
+ "method": "POST",
750
+ "status": 201,
751
+ "body": '{"id": 124, "name": "Bob", "created": true}'
752
+ },
753
+ # DELETE request
754
+ "https://api.example.com/users/123": {
755
+ "method": "DELETE",
756
+ "status": 204,
757
+ "body": ""
758
+ },
759
+ # PUT request
760
+ "https://api.example.com/users/123": {
761
+ "method": "PUT",
762
+ "status": 200,
763
+ "body": '{"id": 123, "name": "Alice Updated"}'
764
+ },
765
+ # Error response
766
+ "https://api.example.com/error": {
767
+ "method": "GET",
768
+ "status": 500,
769
+ "body": "Internal Server Error"
770
+ }
771
+ }
772
+ }
773
+ ```
774
+
775
+ #### How It Works
776
+
777
+ When a contract calls any web method (`gl.nondet.web.get()`, `gl.nondet.web.post()`, etc.):
778
+ 1. The mock system checks if the URL exists in the mock configuration
779
+ 2. If found, it returns the mocked response with the specified status and body
780
+ 3. If not found, the actual web request would be made (or fail if network access is disabled)
781
+
782
+ #### Complete Example: Twitter/X Username Storage
783
+
784
+ Here's a real-world example showing how to mock Twitter/X API responses:
785
+
786
+ ```python
787
+ # test_x_username_storage.py
788
+ from gltest import get_contract_factory, get_validator_factory
789
+ from gltest.assertions import tx_execution_succeeded
790
+ from gltest.types import MockedWebResponse
791
+ import json
792
+ import urllib.parse
793
+
794
+ def test_x_username_storage():
795
+ # Helper to build URL with query parameters
796
+ def get_username_url(username: str) -> str:
797
+ params = {"user.fields": "public_metrics,verified"}
798
+ return f"https://domain.com/api/twitter/users/by/username/{username}?{urllib.parse.urlencode(params)}"
799
+
800
+ # Define mock responses for different usernames
801
+ mock_web_response: MockedWebResponse = {
802
+ "nondet_web_request": {
803
+ get_username_url("user_a"): {
804
+ "method": "GET",
805
+ "status": 200,
806
+ "body": json.dumps({"username": "user_a", "verified": True})
807
+ },
808
+ get_username_url("user_b"): {
809
+ "method": "GET",
810
+ "status": 200,
811
+ "body": json.dumps({"username": "user_b", "verified": False})
812
+ }
813
+ }
814
+ }
815
+
816
+ # Create validators with mock web responses
817
+ validator_factory = get_validator_factory()
818
+ validators = validator_factory.batch_create_mock_validators(
819
+ count=5,
820
+ mock_web_response=mock_web_response
821
+ )
822
+ transaction_context = {"validators": [v.to_dict() for v in validators]}
823
+
824
+ # Deploy and test contract
825
+ factory = get_contract_factory("XUsernameStorage")
826
+ contract = factory.deploy(transaction_context=transaction_context)
827
+
828
+ # Test updating username - will use mocked response
829
+ tx_receipt = contract.update_username(args=["user_a"]).transact(
830
+ transaction_context=transaction_context
831
+ )
832
+ assert tx_execution_succeeded(tx_receipt)
833
+
834
+ # Verify the username was stored
835
+ username = contract.get_username().call(transaction_context=transaction_context)
836
+ assert username == "user_a"
837
+ ```
838
+
839
+ #### Combining Mock LLM and Web Responses
840
+
841
+ You can combine both mock LLM responses and mock web responses in the same test:
842
+
843
+ ```python
844
+ def test_combined_mocks():
845
+ # Define both mock types
846
+ mock_llm_response = {
847
+ "eq_principle_prompt_comparative": {
848
+ "values match": True
849
+ }
850
+ }
851
+
852
+ mock_web_response: MockedWebResponse = {
853
+ "nondet_web_request": {
854
+ "https://api.example.com/data": {
855
+ "method": "GET",
856
+ "status": 200,
857
+ "body": '{"value": 42}'
858
+ }
859
+ }
860
+ }
861
+
862
+ # Create validators with both mock types
863
+ validator_factory = get_validator_factory()
864
+ validators = validator_factory.batch_create_mock_validators(
865
+ count=5,
866
+ mock_llm_response=mock_llm_response,
867
+ mock_web_response=mock_web_response
868
+ )
869
+
870
+ # Use in your tests...
871
+ ```
872
+
873
+ #### Best Practices
874
+
875
+ 1. **URL Matching**: URLs must match exactly, including query parameters
876
+ 2. **Response Body**: Always provide the body as a string (use `json.dumps()` for JSON data)
877
+ 3. **Status Codes**: Use realistic HTTP status codes (200, 404, 500, etc.)
878
+ 4. **Method Matching**: Specify the correct HTTP method that your contract uses
879
+ 5. **Error Testing**: Mock error responses to test error handling paths
880
+ 6. **Deterministic Tests**: Mock web responses ensure tests don't depend on external services
881
+
882
+ #### Notes
883
+
884
+ - Mock web responses are only available when using mock validators
885
+ - URL matching is exact - the full URL including query parameters must match
886
+ - The method field should match the HTTP method used by the contract
887
+ - Useful for testing contracts that interact with external APIs without network dependencies
888
+ - All standard HTTP methods are supported (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS)
889
+
625
890
  ### Custom Transaction Context
626
891
 
627
892
  The GenLayer Testing Suite allows you to customize the transaction execution environment by providing a `transaction_context` parameter with custom validators and GenVM datetime settings.
@@ -1001,8 +1266,8 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
1001
1266
  ## 💬 Support
1002
1267
 
1003
1268
  - [Documentation](https://docs.genlayer.com/api-references/genlayer-test)
1004
- - [Discord Community](https://discord.gg/VpfmXEMN66)
1005
- - [GitHub Issues](https://github.com/yeagerai/genlayer-testing-suite/issues)
1269
+ - [Discord Community](https://discord.gg/qjCU4AWnKE)
1270
+ - [GitHub Issues](https://github.com/genlayerlabs/genlayer-testing-suite/issues)
1006
1271
  - [Twitter](https://x.com/GenLayer)
1007
1272
 
1008
1273
 
@@ -1,4 +1,4 @@
1
- genlayer_test-0.10.1.dist-info/licenses/LICENSE,sha256=che_H4vE0QUx3HvWrAa1_jDEVInift0U6VO15-QqEls,1064
1
+ genlayer_test-0.12.0.dist-info/licenses/LICENSE,sha256=qeyU7v-TUbXruF0KGiAPMvgxsqxMq1ObA47C0gR5kWI,1070
2
2
  gltest/__init__.py,sha256=49112x2CLdYwvCbBZ1laJmMk0NQ7S3u5YUbxPefqhrk,454
3
3
  gltest/accounts.py,sha256=HUmWguJMolggQaZNRPw-LGlRlQCjLLdUanKRowMv6pI,812
4
4
  gltest/assertions.py,sha256=0dEk0VxcHK4I7GZPHxJmz-2jaA60V499gOSR74rZbfM,1748
@@ -6,7 +6,7 @@ gltest/clients.py,sha256=1dX6wmG3QCevQRLbSaFlHymZSb-sJ5aYwet1IoX2nbA,1554
6
6
  gltest/exceptions.py,sha256=deJPmrTe5gF33qkkKF2IVJY7lc_knI7Ql3N7jZ8aLZs,510
7
7
  gltest/fixtures.py,sha256=omVjLh1kXXUyL7Oo8zzdooJBbSX-Qk-Aa-prp5MqvFc,833
8
8
  gltest/logging.py,sha256=jAkHsuMm-AEx1Xu1srU6W-0YzTwXJB48mCK-OVzAiN4,342
9
- gltest/types.py,sha256=H32fHrU5aFMaPHXgEWcHAmLWOZ9pBFVp8PK_ncpVOgM,940
9
+ gltest/types.py,sha256=LLkKjkFsKG0AXpqt-qk70YhOm18AGkqmihamG_9kjEc,1305
10
10
  gltest/utils.py,sha256=-gHhjrS7i_GhDG3sKOq2qsTtYBt4HHgXHEXh-3RB_rI,573
11
11
  gltest/artifacts/__init__.py,sha256=qTt3TE19gVNWnQLUlt5aDe4nNvJ2YJ1jzDkMmYIsCG0,194
12
12
  gltest/artifacts/contract.py,sha256=KChpmfjZod_0dVB8y-dvWz6IVm7QlIJsgG2ArtvVDaU,6457
@@ -17,22 +17,29 @@ gltest/contracts/contract_functions.py,sha256=W6Dpw1z-n9EeJxlNtIbeVnzpv4BPABhtgm
17
17
  gltest/contracts/method_stats.py,sha256=zWWjvf7K5VC4yrHpDIR717VF7LYp1RaZ1Hr_RZvWxJA,5150
18
18
  gltest/contracts/stats_collector.py,sha256=iwsnoYo5aZbI4SVMH7dR-5CQgkglExXfsvaUDpwcdss,9286
19
19
  gltest/contracts/utils.py,sha256=TTXgcXn9BuRIlKJrjwmU7R3l1IgXsXk2luM-r3lfbbg,296
20
+ gltest/direct/__init__.py,sha256=l4CWok9cWnXaUloWEeN4eTA4lSMxYOLkkLW_pZNjFno,877
21
+ gltest/direct/loader.py,sha256=Ai8At94mLAc6QtgPbOYOEnlTRwMtE2V-qhhb799dpLI,7981
22
+ gltest/direct/pytest_plugin.py,sha256=HvHZcjRGenuXWCHnmFJJarwZDLKeIniLOXkEHxqpfuA,3017
23
+ gltest/direct/sdk_loader.py,sha256=Q3fSVpBRBiQgHDUCw1S2pIkqxnOCkRSYA3_Sl6FwVPo,8120
24
+ gltest/direct/types.py,sha256=PY5vsVrkxdC-8HTit8FpRp7TcqOqXwErz2xra3FVDek,356
25
+ gltest/direct/vm.py,sha256=lBc6nJInnfHAmXnSuoimBmBO_ijmJNDsTNXz4Jjh_f8,13812
26
+ gltest/direct/wasi_mock.py,sha256=nQIeHNQ3fusAUsu2t8hoBUjDF-kDqMLBeIdJg7XGwp4,5695
20
27
  gltest/helpers/__init__.py,sha256=I7HiTu_H7_hP65zY6Wl02r-5eAMr2eZvqBVmusuQLX4,180
21
28
  gltest/helpers/fixture_snapshot.py,sha256=bMgvlEVQBGIQzj7NOyosXWlphI1H2C1o75Zo0C-kGfQ,1931
22
29
  gltest/helpers/take_snapshot.py,sha256=-QkaBvFG4ZsNKv_nCSEsy5Ze1pICOHxVhReSeQmZUlY,1276
23
30
  gltest/validators/__init__.py,sha256=AXboXORF5a8MVtG7jWMT1fJcwGXNzcX6txXQstwX2EU,152
24
- gltest/validators/validator_factory.py,sha256=fpb-YyAKuWo4-pXBjrZ_TApYLsm6HHa6kGpbFByRucs,3886
31
+ gltest/validators/validator_factory.py,sha256=Pu7c5XMc7HgPFIiWet0ybcgtW4T29d0lsgPrpj4tHtk,4957
25
32
  gltest_cli/logging.py,sha256=WXVhfq9vT6FtV_jxDqGEGia1ZWSIUKAfmWRnZd_gWQk,1266
26
33
  gltest_cli/main.py,sha256=Ti2-0Ev1x5_cM0D1UKqdgaDt80CDHEQGtdRne2qLm4M,53
27
34
  gltest_cli/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
35
  gltest_cli/config/constants.py,sha256=z7njbU8WXYhTnp1NYrW4YI2jN-p114BP2UDSYF0qAJE,571
29
36
  gltest_cli/config/general.py,sha256=ezpoGsT8grO9zQH6RugV14b1GzeFt-htYToHQBJhNvY,186
30
- gltest_cli/config/plugin.py,sha256=rySUyo7OSG1SOiUx2Xrxiv-SfjaxJSWpT5KKKNRk4Mk,6719
37
+ gltest_cli/config/plugin.py,sha256=jxmdSBq7A1UPpxL4zolhDX53T8Eo4M8xluAsKx_6MTY,6774
31
38
  gltest_cli/config/pytest_context.py,sha256=Ze8JSkrwMTCE8jIhpzU_71CEXg92SiEPvSgNTp-gbS4,243
32
39
  gltest_cli/config/types.py,sha256=nGKm2qTwo99M8DbGchj14IdIQ4lcNTDODZFHXdsi5rY,9506
33
40
  gltest_cli/config/user.py,sha256=JeclpIVv4BT5COMW2xrEbTspI6e1RAYIOvd8ruPc3gM,12887
34
- genlayer_test-0.10.1.dist-info/METADATA,sha256=TAZaEuDPIKWu3kDlIfASJ_M0BGPsFFV1TLMKPivnm68,36341
35
- genlayer_test-0.10.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
- genlayer_test-0.10.1.dist-info/entry_points.txt,sha256=RWPcSArBpz_G4BYioh5L8Q8hyClRbSgzLimjcWMp-BQ,94
37
- genlayer_test-0.10.1.dist-info/top_level.txt,sha256=GSdrnQbiLcZssmtCpbDgBTygsc8Bt_TPeYjwm0FmpdA,18
38
- genlayer_test-0.10.1.dist-info/RECORD,,
41
+ genlayer_test-0.12.0.dist-info/METADATA,sha256=IdrLJccnpUAFQtG5gXq87TM7oI7a9dHKyzXWQ-s8ZDI,45258
42
+ genlayer_test-0.12.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
+ genlayer_test-0.12.0.dist-info/entry_points.txt,sha256=0cvllUWh2HnyzAv9L2YlXErDCsd2DDU2lR-6Mm-BNcc,138
44
+ genlayer_test-0.12.0.dist-info/top_level.txt,sha256=GSdrnQbiLcZssmtCpbDgBTygsc8Bt_TPeYjwm0FmpdA,18
45
+ genlayer_test-0.12.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -3,3 +3,4 @@ gltest = gltest_cli.main:main
3
3
 
4
4
  [pytest11]
5
5
  gltest = gltest_cli.config.plugin
6
+ gltest_direct = gltest.direct.pytest_plugin
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 YeagerAI
3
+ Copyright (c) 2024 GenLayer Labs
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
@@ -0,0 +1,31 @@
1
+ """
2
+ Native Python test runner for GenLayer intelligent contracts.
3
+
4
+ Runs contracts directly in Python without WASM/simulator, providing
5
+ Foundry-style cheatcodes and fast test execution.
6
+
7
+ Usage:
8
+ from gltest.direct import VMContext, deploy_contract
9
+
10
+ def test_transfer():
11
+ vm = VMContext()
12
+ with vm.activate():
13
+ token = deploy_contract("path/to/Token.py", vm, owner)
14
+ vm.sender = alice
15
+ token.transfer(bob, 100)
16
+ assert token.balances[bob] == 100
17
+ """
18
+
19
+ from .vm import VMContext
20
+ from .loader import deploy_contract, load_contract_class, create_address, create_test_addresses
21
+ from .wasi_mock import ContractRollback, MockNotFoundError
22
+
23
+ __all__ = [
24
+ "VMContext",
25
+ "deploy_contract",
26
+ "load_contract_class",
27
+ "create_address",
28
+ "create_test_addresses",
29
+ "ContractRollback",
30
+ "MockNotFoundError",
31
+ ]