This project includes the boilerplate code for a GenLayer use case implementation, specifically a football bets game.
- An example intelligent contract (Football Bets) with web access and LLM integration
- Direct mode tests — fast, in-memory unit tests with web/LLM mocking (~ms per test)
- Integration tests — full end-to-end tests against GenLayer Studio
- Contract linting — static analysis to catch common contract issues before deployment
- CI pipeline — GitHub Actions workflow for linting and direct tests
- A production-ready Next.js 15 frontend with TypeScript, TanStack Query, and Radix UI
- Configuration file template and deployment scripts
- Python >= 3.12
- GenLayer CLI globally installed:
npm install -g genlayer - GenLayer Studio (for integration tests and deployment): Install from Docs or use the hosted GenLayer Studio
contracts/ # Python intelligent contracts
tests/
direct/ # Fast in-memory tests (no Studio required)
test_create_bet.py # Bet creation logic
test_resolve_bet.py # Bet resolution with web/LLM mocks
test_views.py # Read-only view methods
integration/ # Full tests against GenLayer Studio
test_football_bets.py
fixtures.py # Expected state fixtures
frontend/ # Next.js 15 app (TypeScript, TanStack Query, Radix UI)
deploy/ # TypeScript deployment scripts
gltest.config.yaml # Test runner network configuration
pyproject.toml # Python/pytest configuration
.github/workflows/ # CI pipeline
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtRun the GenVM linter to catch issues before deployment:
genvm-lint check contracts/football_bets.pyThe linter catches:
- Forbidden imports and non-deterministic calls
- Invalid storage types (must use
TreeMap,DynArray,u256, etc.) - Missing decorators and return type annotations
- Non-deterministic operations outside equivalence principle blocks
- And 20+ other rules
Direct mode tests run contracts in-memory without needing GenLayer Studio. They use mocks for web requests and LLM calls, giving you fast feedback (~milliseconds per test):
pytest tests/direct/ -vDirect mode features used in these tests:
direct_deploy("contracts/file.py")— deploy contract in memorydirect_vm.sender = address— set transaction senderdirect_vm.mock_web(pattern, response)— mock HTTP/render callsdirect_vm.mock_llm(pattern, response)— mock LLM responsesdirect_vm.expect_revert("message")— assert expected failuresdirect_vm.clear_mocks()— reset mocks between calls
- Choose your network:
genlayer network - Deploy:
genlayer deploy(runs the script in/deploy/deployScript.ts)
Integration tests deploy the contract to GenLayer Studio and test with real consensus:
gltest tests/integration/ -v -sThese require GenLayer Studio running (local or hosted).
- Copy
frontend/.env.exampletofrontend/.env - Add your deployed contract address as
NEXT_PUBLIC_CONTRACT_ADDRESS - Run:
cd frontend
npm install
npm run devThe app will be available at http://localhost:3000/.
- Creating Bets: Users bet on a football match by providing the game date, teams, and predicted winner.
- Resolving Bets: After the match, the contract fetches results from BBC Sport, uses an LLM to extract the score, and validates via the equivalence principle.
- Points: Correct predictions earn points. Users can query their points or the leaderboard.
| Test Type | Command | Speed | Requires Studio |
|---|---|---|---|
| Lint | genvm-lint check contracts/*.py |
~250ms | No |
| Direct | pytest tests/direct/ -v |
~ms/test | No |
| Integration | gltest tests/integration/ -v -s |
~min/test | Yes |
Recommended workflow:
- Lint after every contract change
- Run direct tests frequently during development
- Run integration tests before deployment to verify consensus behavior
For AI coding agents (Claude Code, Cursor, etc.), the linter and direct tests provide the fast feedback loop needed for iterative development without requiring a running Studio instance.
For detailed information, see our documentation.
This project is licensed under the MIT License - see the LICENSE file for details.