Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Write and run fast direct mode tests for GenLayer intelligent contracts.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -28% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 12% | 0% |
Write fast, in-memory tests for intelligent contracts. No server, no Docker — tests run in ~30-50ms.
bashpytest tests/direct/ -v pytest tests/direct/test_specific.py -v pytest tests/direct/test_specific.py::test_one_case -v
Available from genlayer-test pytest plugin:
pythondef test_example(direct_vm, direct_deploy, direct_alice, direct_bob): # direct_vm — VMContext with cheatcodes # direct_deploy — deploy a contract file # direct_alice — test address # direct_bob — test address pass
All fixtures: direct_vm, direct_deploy, direct_alice, direct_bob, direct_charlie, direct_owner, direct_accounts
pythondef test_set_and_get(direct_vm, direct_deploy, direct_alice): contract = direct_deploy("contracts/my_contract.py") direct_vm.sender = direct_alice contract.set_data("hello") result = contract.get_data(direct_alice) assert result == "hello"
For contracts that call gl.nondet.web.get():
pythonimport json def test_with_web_mock(direct_vm, direct_deploy, direct_alice): contract = direct_deploy("contracts/my_contract.py") direct_vm.sender = direct_alice # Pattern: regex matching on URL direct_vm.mock_web( r".*api\.example\.com/prices.*", {"status": 200, "body": '{"price": 42.5}'}, ) contract.update_price("ETH/USD") assert contract.get_price("ETH/USD") == 42.5
pythondirect_vm.mock_web( r"api\.example\.com/data", { "response": { "status": 200, "headers": {}, "body": json.dumps({"key": "value"}).encode() }, "method": "GET" } )
For contracts that call gl.nondet.exec_prompt():
pythondirect_vm.mock_llm( r".*Extract the match result.*", # Regex on prompt text json.dumps({"score": "2:1", "winner": 1}), )
pythondirect_vm.clear_mocks() # Reset between test scenarios
python# Set transaction sender direct_vm.sender = direct_alice # Set native value (wei) direct_vm.value = 1000000000000000000 # 1 ETH # Expect a revert with direct_vm.expect_revert("Insufficient balance"): contract.withdraw(1000) # Temporary sender change with direct_vm.prank(direct_bob): contract.method() # Called as bob # Snapshot and restore state snap_id = direct_vm.snapshot() contract.modify_state() direct_vm.revert(snap_id) # State restored # Set account balance direct_vm.deal(direct_alice, 1000000000000000000) # Time travel direct_vm.warp("2024-06-01T12:00:00Z")
tests/direct/
├── conftest.py # Shared fixtures and mock helpers
├── test_<feature>.py # Tests per feature/method
└── test_<feature>_web.py # Tests requiring web/LLM mocks| Category | Example | |----------|---------| | State transitions | Create → read back → verify fields | | Validation / reverts | Invalid inputs, unauthorized callers | | Access control | Owner-only methods, role checks | | Edge cases | Empty state, boundary values, overflow | | Web/LLM parsing | Mock responses → verify extraction logic |
pythondef test_only_owner(direct_vm, direct_deploy, direct_alice, direct_bob): contract = direct_deploy("contracts/my_contract.py") direct_vm.sender = direct_alice contract.create_item("item_1") direct_vm.sender = direct_bob with direct_vm.expect_revert("Only owner"): contract.delete_item("item_1")
pythondef test_state_flow(direct_vm, direct_deploy, direct_alice): contract = direct_deploy("contracts/my_contract.py") direct_vm.sender = direct_alice contract.create_item("item_1") assert contract.get_item("item_1")["status"] == "pending" contract.approve_item("item_1") assert contract.get_item("item_1")["status"] == "approved"
pythonimport json def mock_price_api(direct_vm, pair: str, price: float): """Mock a price API response.""" direct_vm.mock_web( rf".*api\.example\.com/prices/{pair}.*", {"status": 200, "body": json.dumps({"price": price})}, )
direct_vm.sender = ... before calling write methods--json flag on genvm-lint check before writing tests to understand the contract's interfaceOther measured skills in the registry, with their headline benchmark lift.