├── __init__.py ├── backend ├── __init__.py ├── errors │ └── __init__.py ├── node │ ├── __init__.py │ ├── genvm │ │ ├── origin │ │ │ ├── __init__.py │ │ │ ├── host_fns.py │ │ │ └── public_abi.py │ │ └── __init__.py │ └── create_nodes │ │ └── default_providers │ │ ├── xai_grok-3.json │ │ ├── openai_gpt-4o.json │ │ ├── openai_gpt-4.1.json │ │ ├── openai_gpt-4.1-mini.json │ │ ├── openai_gpt-4.1-nano.json │ │ ├── openai_gpt-4-1106-preview.json │ │ ├── anthropic_claude-4-opus.json │ │ ├── anthropic_claude-4-sonnet.json │ │ ├── google_gemini-2.5-flash.json │ │ ├── google_gemini-2.5-flash-lite.json │ │ ├── anthropic_claude-3-5-haiku-20241022.json │ │ ├── anthropic_claude-3-7-sonnet-20250219.json │ │ ├── heuristai_deepseekdeepseek-v3.json │ │ ├── google_googlegemini-2.0-flash-lite-001.json │ │ ├── openai_gpt-5-nano.json │ │ ├── openai_gpt-5.1-nano.json │ │ ├── heuristai_mistralaimixtral-8x7b-instruct.json │ │ ├── heuristai_meta-llamallama-3.3-70b-instruct.json │ │ ├── openai_gpt-5.json │ │ ├── openai_gpt-5.1.json │ │ ├── openai_gpt-5-mini.json │ │ ├── openai_gpt-5.1-mini.json │ │ ├── ollama_gemma.json │ │ ├── ollama_llama3.json │ │ └── ollama_mistral.json ├── rollup │ ├── __init__.py │ └── default_contracts │ │ └── __init__.py ├── consensus │ ├── __init__.py │ ├── vrf.py │ └── utils.py ├── protocol_rpc │ ├── __init__.py │ ├── message_handler │ │ ├── __init__.py │ │ ├── config │ │ │ ├── logging.dev.json │ │ │ └── logging.prod.json │ │ └── types.py │ ├── configuration.py │ ├── calls_intercept │ │ └── __init__.py │ ├── call_interceptor.py │ └── rpc_decorators.py ├── database_handler │ ├── __init__.py │ ├── migration │ │ ├── requirements.txt │ │ ├── script.py.mako │ │ ├── README.md │ │ └── versions │ │ │ ├── 1daddff774b2_drop_from_constraint_on_rollup_tx.py │ │ │ ├── 3566595124f6_add_leader_only_flag.py │ │ │ ├── 47519c0bf986_validators_private_key.py │ │ │ ├── 130836786511_config_rotation_rounds.py │ │ │ ├── a32f85df2806_add_client_session_id_to_transactions.py │ │ │ ├── 3bc34e44eb72_add_providers_unique_constraint.py │ │ │ ├── 035ef00c2779_add_sim_config_to_transactions.py │ │ │ ├── 15fde6faebaf_contract_snapshot.py │ │ │ ├── 2de9c3151194_consensus_history.py │ │ │ ├── 2a4ac5eb9455_appeal_failed.py │ │ │ ├── 0a4312659782_remove_ghost_contract.py │ │ │ ├── 579e86111b36_remove_client_session_id_from_.py │ │ │ ├── d932a5fef8b1_appeal_processing_time.py │ │ │ ├── 96840ab9133a_add_blocked_at_and_worker_id_to_.py │ │ │ ├── b5acc405bcca_add_transactions_triggers.py │ │ │ ├── 22319ddb113d_tx_receipt.py │ │ │ └── ab256b41602a_remove_invalid_models.py │ ├── errors.py │ └── session_manager.py ├── requirements.txt └── healthcheck.py ├── tests ├── e2e │ └── __init__.py ├── common │ ├── __init__.py │ ├── transactions.py │ └── response.py ├── integration │ ├── __init__.py │ ├── rpc │ │ └── __init__.py │ ├── accounts │ │ └── __init__.py │ ├── icontracts │ │ ├── __init__.py │ │ ├── schemas │ │ │ ├── __init__.py │ │ │ ├── wizard_get_contract_schema_for_code.py │ │ │ ├── storage_get_contract_schema_for_code.py │ │ │ ├── football_prediction_market_get_contract_schema_for_code.py │ │ │ ├── user_storage_get_contract_schema_for_code.py │ │ │ ├── llm_erc20_get_contract_schema_for_code.py │ │ │ └── log_indexer_get_contract_schema_for_code.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── test_multi_file_contract.py │ │ │ ├── test_wizard_of_coin.py │ │ │ ├── test_storage.py │ │ │ ├── test_football_prediction_market.py │ │ │ └── test_read_erc20.py │ │ ├── contracts │ │ │ ├── __init__.py │ │ │ ├── multi_file_contract │ │ │ │ ├── runner.json │ │ │ │ ├── other.py │ │ │ │ └── __init__.py │ │ │ ├── read_erc20.py │ │ │ ├── error_web_contract.py │ │ │ └── multi_read_erc20.py │ │ └── ideas.md │ ├── features │ │ ├── transaction_state_machine.feature │ │ ├── security_resilience.feature │ │ ├── load_testing.feature │ │ ├── parallel_deployment.feature │ │ ├── websocket_notifications.feature │ │ └── concurrent_transactions.feature │ ├── pytest.ini │ └── README.md ├── unit │ ├── consensus │ │ └── __init__.py │ ├── pytest.ini │ ├── __init__.py │ └── test_types.py ├── __init__.py ├── load │ ├── .last_deployed_contract │ └── reset_db.sh ├── hardhat │ ├── requirements.txt │ ├── Dockerfile │ └── docker-compose.yml ├── db-sqlalchemy │ ├── requirements.txt │ ├── Dockerfile │ └── docker-compose.yml └── test_rpc │ └── test_address_utils.py ├── frontend ├── .nvmrc ├── env.d.ts ├── .prettierignore ├── src │ ├── plugins │ │ └── index.ts │ ├── services │ │ ├── index.ts │ │ └── IJsonRpcService.ts │ ├── components │ │ ├── global │ │ │ ├── fields │ │ │ │ ├── FieldError.vue │ │ │ │ ├── AnyFieldValue.ts │ │ │ │ ├── FieldLabel.vue │ │ │ │ ├── BooleanField.vue │ │ │ │ ├── StringField.vue │ │ │ │ ├── IntegerField.vue │ │ │ │ ├── FloatField.vue │ │ │ │ └── AnyField.vue │ │ │ ├── ContentLoader.vue │ │ │ ├── MoreInfo.vue │ │ │ ├── inputs │ │ │ │ ├── CheckboxInput.vue │ │ │ │ ├── TextInput.vue │ │ │ │ ├── TextAreaInput.vue │ │ │ │ └── NumberInput.vue │ │ │ ├── CopyTextButton.vue │ │ │ ├── GhostBtn.vue │ │ │ ├── registerGlobalComponents.js │ │ │ ├── Loader.vue │ │ │ └── ConfirmationModal.vue │ │ ├── JsonViewer │ │ │ ├── icon.svg │ │ │ └── types │ │ │ │ ├── json-boolean.vue │ │ │ │ ├── json-undefined.vue │ │ │ │ ├── json-function.vue │ │ │ │ ├── json-date.vue │ │ │ │ └── json-number.vue │ │ ├── Simulator │ │ │ ├── EmptyListPlaceholder.vue │ │ │ ├── MainTitle.vue │ │ │ ├── TransactionStatusBadge.vue │ │ │ ├── ModalSection.vue │ │ │ ├── PageSection.vue │ │ │ ├── HomeFeatureItem.vue │ │ │ ├── HomeContractItem.vue │ │ │ ├── ContractParams.ts │ │ │ ├── ContractsPanel.vue │ │ │ ├── LogFilterBtn.vue │ │ │ ├── parsers │ │ │ │ └── splitTopLevelLines.ts │ │ │ └── settings │ │ │ │ └── ConsensusSection.vue │ │ ├── SimulatorMenuLink.vue │ │ ├── SimulatorMenuItem.vue │ │ ├── Notification.vue │ │ └── Tutorial │ │ │ └── constants.ts │ ├── hooks │ │ ├── useRpcClient.ts │ │ ├── useUniqueId.ts │ │ ├── useFileName.ts │ │ ├── useShortAddress.ts │ │ ├── useConfig.ts │ │ ├── index.ts │ │ ├── useEventTracking.ts │ │ ├── useInputMap.ts │ │ ├── useContractListener.ts │ │ ├── useGenlayer.ts │ │ ├── useTransactionListener.ts │ │ └── useMockContractData.ts │ ├── types │ │ ├── responses.ts │ │ ├── results.ts │ │ ├── events.ts │ │ ├── store.ts │ │ ├── index.ts │ │ └── requests.ts │ ├── stores │ │ ├── index.ts │ │ └── ui.ts │ ├── global.d.ts │ ├── constants │ │ └── links.ts │ ├── assets │ │ ├── images │ │ │ ├── mark_black.svg │ │ │ └── mark_white.svg │ │ └── icons │ │ │ ├── DiscordIcon.vue │ │ │ └── TelegramIcon.vue │ ├── views │ │ └── Simulator │ │ │ └── SettingsView.vue │ ├── index.d.ts │ ├── router │ │ └── index.ts │ ├── main.ts │ └── clients │ │ └── rpc.ts ├── .mocharc.cjs ├── postcss.config.cjs ├── .vscode │ └── settings.json ├── tsconfig.json ├── .prettierrc.json ├── tsconfig.vitest.json ├── test │ ├── pages │ │ ├── RunDebugPage.ts │ │ ├── ContractsPage.ts │ │ └── BasePage.ts │ ├── utils │ │ ├── driver.ts │ │ └── pages.ts │ ├── unit │ │ ├── hooks │ │ │ ├── useConfig.test.ts │ │ │ ├── useUniqueId.test.ts │ │ │ ├── useRpcClient.test.ts │ │ │ ├── useFileName.test.ts │ │ │ └── useInputMap.test.ts │ │ └── calldata │ │ │ └── decode.test.ts │ └── e2e │ │ └── CreateNodeValidator.spec.ts ├── shims.d.ts ├── vitest.config.ts ├── tsconfig.node.json ├── tsconfig.app.json ├── .eslintrc.cjs ├── tailwind.config.js ├── .gitignore ├── scripts │ └── contract-examples.js ├── .stylelintrc.json ├── README.md ├── vite.config.ts └── public │ └── loader.css ├── .gitattributes ├── .github ├── workflows │ ├── README.md │ ├── conventional-commit-pr.yml │ ├── frontend-unit-tests.yml │ ├── test-semgrep.yml │ ├── release-staging.yml │ ├── .pre-commit.yml │ ├── unit-tests-pr.yml │ ├── scan-codeql.yml │ └── release-from-main.yml └── pull_request_template.md ├── .last_deployed_contract ├── .last_deployment_tx ├── .vscode ├── extensions.json └── settings.json ├── requirements.txt ├── .claude └── settings.json ├── docker ├── Dockerfile.nginx ├── Dockerfile.database-migration ├── Dockerfile.frontend └── entrypoint-frontend.sh ├── requirements.test.txt ├── hardhat ├── contracts │ ├── v2_contracts │ │ ├── interfaces │ │ │ ├── IGenConsensus.sol │ │ │ ├── IGenLayerToken.sol │ │ │ ├── IGenManager.sol │ │ │ ├── IMessages.sol │ │ │ └── IGhostFactory.sol │ │ ├── ghost_contracts │ │ │ └── GhostManager.sol │ │ └── transactions │ │ │ ├── Utils.sol │ │ │ └── interfaces │ │ │ └── IIdleness.sol │ ├── GhostContract.sol │ └── BasicERC20.sol └── package.json ├── traefik └── tls.yml ├── .cursor └── mcp.json ├── decisions └── README.md ├── sonar-project.properties ├── examples └── contracts │ ├── storage.py │ └── user_storage.py ├── renovate.json ├── .dockerignore ├── asgi.py ├── .pre-commit-config.yaml ├── LICENSE ├── nginx └── ssl │ └── README.md ├── release.config.js └── uvicorn_config.py /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/e2e/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/errors/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/node/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/rollup/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/.nvmrc: -------------------------------------------------------------------------------- 1 | 22.14.0 2 | -------------------------------------------------------------------------------- /tests/common/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | text=auto eol=lf -------------------------------------------------------------------------------- /backend/consensus/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/protocol_rpc/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/rpc/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/consensus/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/database_handler/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/accounts/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/icontracts/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/protocol_rpc/message_handler/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/rollup/default_contracts/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/icontracts/schemas/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/icontracts/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/workflows/README.md: -------------------------------------------------------------------------------- 1 | # Trigger CI re-run 2 | -------------------------------------------------------------------------------- /tests/integration/icontracts/contracts/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/env.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | package*.json -------------------------------------------------------------------------------- /.last_deployed_contract: -------------------------------------------------------------------------------- 1 | 0x6652823eb62FC70E0F16F3ce4Dd6F19F9716Ae66 -------------------------------------------------------------------------------- /frontend/src/plugins/index.ts: -------------------------------------------------------------------------------- 1 | export * from './persistStore'; 2 | -------------------------------------------------------------------------------- /backend/node/genvm/origin/__init__.py: -------------------------------------------------------------------------------- 1 | # This code is taken from genvm repo 2 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | from dotenv import load_dotenv 2 | 3 | load_dotenv() 4 | -------------------------------------------------------------------------------- /tests/load/.last_deployed_contract: -------------------------------------------------------------------------------- 1 | 0x0fA93e0C3196E6a9D6C1ad10acD785063b9e8330 -------------------------------------------------------------------------------- /.last_deployment_tx: -------------------------------------------------------------------------------- 1 | 0x5a87615b3590a4553437d0e1973c68f6e41903b5ded2bb8a6ba556ba10cdce79 -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "sumneko.lua" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /tests/unit/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | asyncio_default_fixture_loop_scope = function 3 | timeout = 240 4 | -------------------------------------------------------------------------------- /frontend/src/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './IJsonRpcService'; 2 | export * from './JsonRpcService'; 3 | -------------------------------------------------------------------------------- /backend/database_handler/migration/requirements.txt: -------------------------------------------------------------------------------- 1 | SQLAlchemy==2.0.40 2 | alembic==1.15.2 3 | psycopg2-binary==2.9.10 -------------------------------------------------------------------------------- /tests/integration/icontracts/contracts/multi_file_contract/runner.json: -------------------------------------------------------------------------------- 1 | { 2 | "Depends": "py-genlayer-multi:test" 3 | } 4 | -------------------------------------------------------------------------------- /tests/unit/__init__.py: -------------------------------------------------------------------------------- 1 | from dotenv import load_dotenv 2 | 3 | if not load_dotenv(): 4 | load_dotenv(".env.example") 5 | -------------------------------------------------------------------------------- /frontend/.mocharc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = 2 | { 3 | "$schema": "https://json.schemastore.org/mocharc.json", 4 | "require": "tsx" 5 | } -------------------------------------------------------------------------------- /frontend/src/components/global/fields/FieldError.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /tests/integration/features/transaction_state_machine.feature: -------------------------------------------------------------------------------- 1 | Feature: Transaction State Machine 2 | 3 | Scenario: Transaction completes full lifecycle 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.32.3 2 | python-dotenv==1.1.0 3 | black==25.1.0 4 | pytest==8.3.5 5 | pytest-mock==3.14.0 6 | pre-commit==4.2.0 7 | aiohttp==3.11.16 -------------------------------------------------------------------------------- /tests/hardhat/requirements.txt: -------------------------------------------------------------------------------- 1 | pytest==8.2.1 2 | debugpy==1.8.5 3 | requests==2.32.3 4 | numpy==1.26.4 5 | web3==7.5.0 6 | eth-typing==5.0.1 7 | python-dotenv==1.0.1 -------------------------------------------------------------------------------- /backend/node/genvm/__init__.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | 3 | 4 | def get_code_slot() -> bytes: 5 | return hashlib.sha3_256(b"\x00" * 32 + b"\x01\x00\x00\x00").digest() 6 | -------------------------------------------------------------------------------- /frontend/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | /* global module */ 2 | module.exports = { 3 | plugins: { 4 | 'postcss-import': {}, 5 | tailwindcss: {}, 6 | autoprefixer: {}, 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/components/global/ContentLoader.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /frontend/src/components/JsonViewer/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.claude/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "enabledPlugins": { 3 | "code-review@claude-plugins-official": true, 4 | "feature-dev@claude-plugins-official": true, 5 | "hookify@claude-plugins-official": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /docker/Dockerfile.nginx: -------------------------------------------------------------------------------- 1 | # This Dockerfile is used to build the nginx image with lua and LuaRocks installed 2 | FROM fabiocicerchia/nginx-lua:1.27.2-almalinux9.4-20240923 3 | 4 | # Install lua-cjson 5 | RUN luarocks install lua-cjson -------------------------------------------------------------------------------- /tests/db-sqlalchemy/requirements.txt: -------------------------------------------------------------------------------- 1 | SQLAlchemy==2.0.31 2 | pytest==8.2.1 3 | psycopg2-binary==2.9.9 4 | debugpy==1.8.5 5 | requests==2.32.3 6 | numpy==1.26.4 7 | eth-account==0.13.1 8 | python-dotenv==1.0.1 9 | web3==7.5.0 10 | -------------------------------------------------------------------------------- /frontend/src/hooks/useRpcClient.ts: -------------------------------------------------------------------------------- 1 | import { RpcClient } from '@/clients/rpc'; 2 | import { JsonRpcService } from '@/services/JsonRpcService'; 3 | 4 | export function useRpcClient() { 5 | return new JsonRpcService(new RpcClient()); 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/types/responses.ts: -------------------------------------------------------------------------------- 1 | export interface JsonRPCResponse { 2 | id: string; 3 | jsonrpc: string; 4 | result: T; 5 | error?: { 6 | code: number; 7 | message: string; 8 | data?: any; 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/stores/index.ts: -------------------------------------------------------------------------------- 1 | export * from './accounts'; 2 | export * from './contracts'; 3 | export * from './node'; 4 | export * from './ui'; 5 | export * from './tutorial'; 6 | export * from './transactions'; 7 | export * from './consensus'; 8 | -------------------------------------------------------------------------------- /requirements.test.txt: -------------------------------------------------------------------------------- 1 | eth-account==0.13.6 2 | eth-abi==5.2.0 3 | web3==7.10.0 4 | psycopg2-binary==2.9.10 5 | pytest==8.3.5 6 | pytest-xdist==3.6.1 7 | pytest-asyncio==0.26.0 8 | pytest-timeout==2.3.1 9 | genlayer-test==0.9.0 10 | httpx==0.27.2 11 | -------------------------------------------------------------------------------- /frontend/src/components/global/fields/AnyFieldValue.ts: -------------------------------------------------------------------------------- 1 | export class AnyFieldValue { 2 | value: string; 3 | constructor(value: string) { 4 | this.value = value; 5 | } 6 | 7 | toString(): string { 8 | return this.value; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tests/integration/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | asyncio_default_fixture_loop_scope = function 3 | addopts = -m "not error_handling" 4 | markers = 5 | error_handling: marks tests that verify error handling of genvm and consensus (run with '-m error_handling') 6 | -------------------------------------------------------------------------------- /backend/protocol_rpc/configuration.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | 5 | class GlobalConfiguration: 6 | @staticmethod 7 | def get_disabled_info_logs_endpoints() -> list: 8 | return json.loads(os.environ.get("DISABLE_INFO_LOGS_ENDPOINTS", "[]")) 9 | -------------------------------------------------------------------------------- /frontend/src/global.d.ts: -------------------------------------------------------------------------------- 1 | // global.d.ts 2 | interface Window { 3 | ethereum?: { 4 | isMetaMask?: boolean; 5 | request: (args: { method: string; params?: unknown[] }) => Promise; 6 | on: (method: string, callback: Function) => {}; 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /frontend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.codeActionsOnSave": { 3 | "source.fixAll": "explicit" 4 | }, 5 | "editor.defaultFormatter": "esbenp.prettier-vscode", 6 | "[vue]": { 7 | "editor.defaultFormatter": "esbenp.prettier-vscode" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | } 10 | ], 11 | "compilerOptions": { 12 | "module": "NodeNext" 13 | } 14 | } -------------------------------------------------------------------------------- /frontend/src/hooks/useUniqueId.ts: -------------------------------------------------------------------------------- 1 | import { v4 as uuidv4 } from 'uuid'; 2 | 3 | export function useUniqueId(prefix?: string): string { 4 | const uid = uuidv4(); 5 | 6 | if (prefix) { 7 | return `${prefix}-${uid}`; 8 | } else { 9 | return uid; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/hardhat/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.12-slim 2 | 3 | WORKDIR /app 4 | 5 | ENV TEST_PATH=tests/hardhat 6 | 7 | COPY ${TEST_PATH}/requirements.txt . 8 | 9 | RUN pip install --no-cache-dir -r requirements.txt 10 | 11 | COPY ${TEST_PATH} . 12 | 13 | ENTRYPOINT ["pytest", "-svv"] 14 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/xai_grok-3.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "xai", 3 | "plugin": "openai-compatible", 4 | "model": "grok-3", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "XAI_API_KEY", 8 | "api_url": "https://api.x.ai" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-4o.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-4o", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/prettierrc", 3 | "semi": true, 4 | "tabWidth": 2, 5 | "singleQuote": true, 6 | "printWidth": 80, 7 | "trailingComma": "all", 8 | "bracketSpacing": true, 9 | "plugins": ["prettier-plugin-tailwindcss"] 10 | } 11 | -------------------------------------------------------------------------------- /hardhat/contracts/v2_contracts/interfaces/IGenConsensus.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.20; 3 | 4 | interface IGenConsensus { 5 | function executeMessage( 6 | address _recipient, 7 | uint _value, 8 | bytes memory _data 9 | ) external returns (bool success); 10 | } -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-4.1.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-4.1", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-4.1-mini.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-4.1-mini", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-4.1-nano.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-4.1-nano", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/tsconfig.vitest.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.app.json", 3 | "exclude": [], 4 | "compilerOptions": { 5 | "composite": true, 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.vitest.tsbuildinfo", 7 | 8 | "lib": [], 9 | "types": ["node", "jsdom"] 10 | } 11 | } -------------------------------------------------------------------------------- /frontend/src/components/Simulator/EmptyListPlaceholder.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /traefik/tls.yml: -------------------------------------------------------------------------------- 1 | tls: 2 | certificates: 3 | - certFile: /etc/ssl/traefik/genlayer.com.crt 4 | keyFile: /etc/ssl/traefik/genlayer.com.key 5 | stores: 6 | default: 7 | defaultCertificate: 8 | certFile: /etc/ssl/traefik/genlayer.com.crt 9 | keyFile: /etc/ssl/traefik/genlayer.com.key 10 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-4-1106-preview.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-4-1106-preview", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tests/integration/features/security_resilience.feature: -------------------------------------------------------------------------------- 1 | Feature: Security Resilience 2 | Scenario: DOS attack mitigation 3 | Given an attacker sends 10000 requests per second 4 | When rate limiting kicks in after 100 requests 5 | Then subsequent requests should be throttled 6 | And legitimate users should still be served -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/anthropic_claude-4-opus.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "anthropic", 3 | "plugin": "anthropic", 4 | "model": "claude-opus-4-20250514", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "ANTHROPIC_API_KEY", 8 | "api_url": "https://api.anthropic.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/anthropic_claude-4-sonnet.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "anthropic", 3 | "plugin": "anthropic", 4 | "model": "claude-sonnet-4-20250514", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "ANTHROPIC_API_KEY", 8 | "api_url": "https://api.anthropic.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/google_gemini-2.5-flash.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "google", 3 | "plugin": "google", 4 | "model": "gemini-2.5-flash", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "GEMINI_API_KEY", 8 | "api_url": "https://generativelanguage.googleapis.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tests/db-sqlalchemy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.12-slim 2 | 3 | WORKDIR /app 4 | 5 | ENV TEST_PATH=tests/db-sqlalchemy 6 | 7 | COPY ${TEST_PATH}/requirements.txt . 8 | 9 | RUN pip install --no-cache-dir -r requirements.txt 10 | 11 | COPY ${TEST_PATH} . 12 | 13 | COPY backend /app/backend 14 | 15 | ENTRYPOINT ["pytest", "-svv"] 16 | -------------------------------------------------------------------------------- /frontend/src/hooks/useFileName.ts: -------------------------------------------------------------------------------- 1 | export const useFileName = () => { 2 | function cleanupFileName(name: string) { 3 | const tokens = name.split('.'); 4 | if (tokens.length > 0) { 5 | return `${tokens[0]}.py`; 6 | } 7 | return `${name}.py`; 8 | } 9 | 10 | return { 11 | cleanupFileName, 12 | }; 13 | }; 14 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/google_gemini-2.5-flash-lite.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "google", 3 | "plugin": "google", 4 | "model": "gemini-2.5-flash-lite", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "GEMINI_API_KEY", 8 | "api_url": "https://generativelanguage.googleapis.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/anthropic_claude-3-5-haiku-20241022.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "anthropic", 3 | "plugin": "anthropic", 4 | "model": "claude-3-5-haiku-20241022", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "ANTHROPIC_API_KEY", 8 | "api_url": "https://api.anthropic.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/anthropic_claude-3-7-sonnet-20250219.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "anthropic", 3 | "plugin": "anthropic", 4 | "model": "claude-3-7-sonnet-20250219", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "ANTHROPIC_API_KEY", 8 | "api_url": "https://api.anthropic.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/heuristai_deepseekdeepseek-v3.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "heuristai", 3 | "plugin": "openai-compatible", 4 | "model": "deepseek/deepseek-v3", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "HEURISTAIAPIKEY", 8 | "api_url": "https://llm-gateway.heurist.xyz" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.cursor/mcp.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "postgres": { 4 | "command": "docker", 5 | "args": [ 6 | "run", 7 | "-i", 8 | "--rm", 9 | "--network=host", 10 | "mcp/postgres", 11 | "postgresql://postgres:postgres@host.docker.internal:5432/genlayer_state" 12 | ] 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/google_googlegemini-2.0-flash-lite-001.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "google", 3 | "plugin": "google", 4 | "model": "gemini-2.0-flash-lite-001", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "GEMINI_API_KEY", 8 | "api_url": "https://generativelanguage.googleapis.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-5-nano.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-5-nano", 5 | "config": { "temperature": 1, "use_max_completion_tokens": true }, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-5.1-nano.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-5.1-nano", 5 | "config": { "temperature": 1, "use_max_completion_tokens": true }, 6 | "plugin_config": { 7 | "api_key_env_var": "OPENAIKEY", 8 | "api_url": "https://api.openai.com" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tests/integration/icontracts/contracts/multi_file_contract/other.py: -------------------------------------------------------------------------------- 1 | # { "Depends": "py-genlayer:test" } 2 | 3 | from genlayer import * 4 | 5 | 6 | class Other(gl.Contract): 7 | data: str 8 | 9 | def __init__(self, data: str): 10 | self.data = data 11 | 12 | @gl.public.view 13 | def test(self) -> str: 14 | return self.data 15 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/heuristai_mistralaimixtral-8x7b-instruct.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "heuristai", 3 | "plugin": "openai-compatible", 4 | "model": "mistralai/mixtral-8x7b-instruct", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "HEURISTAIAPIKEY", 8 | "api_url": "https://llm-gateway.heurist.xyz" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/components/Simulator/MainTitle.vue: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /frontend/test/pages/RunDebugPage.ts: -------------------------------------------------------------------------------- 1 | import { By, type Locator } from 'selenium-webdriver'; 2 | import { BasePage } from './BasePage'; 3 | 4 | export class RunDebugPage extends BasePage { 5 | override baseurl = 'http://localhost:8080/run-debug'; 6 | override visibleLocator: Locator = By.xpath( 7 | "//*[@data-testid='run-debug-page-title']", 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/heuristai_meta-llamallama-3.3-70b-instruct.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "heuristai", 3 | "plugin": "openai-compatible", 4 | "model": "meta-llama/llama-3.3-70b-instruct", 5 | "config": {}, 6 | "plugin_config": { 7 | "api_key_env_var": "HEURISTAIAPIKEY", 8 | "api_url": "https://llm-gateway.heurist.xyz" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-5.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-5", 5 | "config": { 6 | "temperature": 1, 7 | "use_max_completion_tokens": true 8 | }, 9 | "plugin_config": { 10 | "api_key_env_var": "OPENAIKEY", 11 | "api_url": "https://api.openai.com" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-5.1.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-5.1", 5 | "config": { 6 | "temperature": 1, 7 | "use_max_completion_tokens": true 8 | }, 9 | "plugin_config": { 10 | "api_key_env_var": "OPENAIKEY", 11 | "api_url": "https://api.openai.com" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-5-mini.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-5-mini", 5 | "config": { 6 | "temperature": 1, 7 | "use_max_completion_tokens": true 8 | }, 9 | "plugin_config": { 10 | "api_key_env_var": "OPENAIKEY", 11 | "api_url": "https://api.openai.com" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /decisions/README.md: -------------------------------------------------------------------------------- 1 | # Decisions documentation 2 | 3 | Greatly inspired by ADRs, this directory contains important decisions about the `Studio` code. 4 | 5 | # Index 6 | 7 | - [Handle database migrations with SQLAlchemy + Alembic](001-handle-database-migrations.md) 8 | 9 | # Useful documentation 10 | 11 | - https://github.com/joelparkerhenderson/architecture-decision-record 12 | -------------------------------------------------------------------------------- /frontend/src/constants/links.ts: -------------------------------------------------------------------------------- 1 | type Links = { 2 | discord: string; 3 | docs: string; 4 | feedbackForm: string; 5 | }; 6 | 7 | export const LINKS: Links = { 8 | discord: 'https://discord.gg/8Jm4v89VAu', 9 | docs: 'https://docs.genlayer.com/', 10 | feedbackForm: 11 | 'https://docs.google.com/forms/d/1IVNsZwm936kSNCiXmlAP8bgJnbik7Bqaoc3I6UYhr-o/viewform', 12 | }; 13 | -------------------------------------------------------------------------------- /backend/database_handler/errors.py: -------------------------------------------------------------------------------- 1 | class AccountNotFoundError(Exception): 2 | """Exception raised when a given account is not found.""" 3 | 4 | def __init__( 5 | self, 6 | address: str, 7 | message: str = "Account not found.", 8 | ): 9 | self.address = address 10 | self.message = message 11 | super().__init__(self.message) 12 | -------------------------------------------------------------------------------- /backend/node/create_nodes/default_providers/openai_gpt-5.1-mini.json: -------------------------------------------------------------------------------- 1 | { 2 | "provider": "openai", 3 | "plugin": "openai-compatible", 4 | "model": "gpt-5.1-mini", 5 | "config": { 6 | "temperature": 1, 7 | "use_max_completion_tokens": true 8 | }, 9 | "plugin_config": { 10 | "api_key_env_var": "OPENAIKEY", 11 | "api_url": "https://api.openai.com" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | sonar.organization=yeagerai 2 | sonar.projectKey=yeagerai_genlayer-simulator 3 | 4 | # relative paths to source directories. More details and properties are described 5 | # in https://sonarcloud.io/documentation/project-administration/narrowing-the-focus/ 6 | sonar.sources=. 7 | sonar.exclusions=tests/**,frontend/test/**/* 8 | sonar.python.coverage.reportPaths=coverage.xml 9 | -------------------------------------------------------------------------------- /tests/integration/features/load_testing.feature: -------------------------------------------------------------------------------- 1 | Feature: System Performance 2 | 3 | Scenario: Sustained high load 4 | Given 100 clients are connected 5 | When each client submits 10 transactions per second 6 | And this continues for 60 seconds 7 | Then 95% of transactions should complete within 5 seconds 8 | And no transactions should be lost 9 | And memory usage should remain stable -------------------------------------------------------------------------------- /frontend/shims.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import type { DefineComponent } from 'vue' 3 | 4 | const component: DefineComponent<{}, {}, any> 5 | export default component 6 | } 7 | 8 | 9 | declare module 'vue-prism-component' { 10 | import { ComponentOptions } from 'vue' 11 | const component: ComponentOptions 12 | export default component 13 | } 14 | declare module 'vue-shepherd'; 15 | -------------------------------------------------------------------------------- /hardhat/contracts/GhostContract.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | pragma solidity ^0.8.24; 3 | 4 | contract GhostContract { 5 | // Define an event 6 | event ReceivedData(bytes data); 7 | 8 | // Fallback function logs any raw data received 9 | fallback() external payable { 10 | emit ReceivedData(msg.data); // Logs the data in a blockchain event 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/components/global/MoreInfo.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | -------------------------------------------------------------------------------- /frontend/src/components/global/fields/FieldLabel.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /frontend/src/components/Simulator/TransactionStatusBadge.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 18 | -------------------------------------------------------------------------------- /frontend/src/components/SimulatorMenuLink.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /frontend/src/components/JsonViewer/types/json-boolean.vue: -------------------------------------------------------------------------------- 1 | 20 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[vue]": { 3 | "editor.defaultFormatter": "esbenp.prettier-vscode" 4 | }, 5 | "python.testing.pytestArgs": ["tests", "backend"], 6 | "python.testing.unittestEnabled": false, 7 | "python.testing.pytestEnabled": true, 8 | "python.analysis.typeCheckingMode": "standard", 9 | "sonarlint.connectedMode.project": { 10 | "connectionId": "YeagerAI", 11 | "projectKey": "yeagerai_genlayer-simulator" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/components/Simulator/ModalSection.vue: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /frontend/src/types/results.ts: -------------------------------------------------------------------------------- 1 | export interface GetContractStateResult extends Record {} 2 | 3 | export interface GetProvidersAndModelsData 4 | extends Array<{ 5 | config: Record; 6 | id: number; 7 | model: string; 8 | plugin: string; 9 | plugin_config: Record; 10 | provider: string; 11 | is_available: boolean; 12 | is_model_available: boolean; 13 | is_default: boolean; 14 | }> {} 15 | -------------------------------------------------------------------------------- /frontend/src/hooks/useShortAddress.ts: -------------------------------------------------------------------------------- 1 | export const useShortAddress = () => { 2 | function shorten(address?: string) { 3 | if (!address) { 4 | return '0x'; 5 | } 6 | 7 | const maxChars = 4; 8 | const displayedChars = Math.min(Math.floor(address.length / 3), maxChars); 9 | 10 | return ( 11 | address.slice(0, displayedChars) + '...' + address.slice(-displayedChars) 12 | ); 13 | } 14 | 15 | return { 16 | shorten, 17 | }; 18 | }; 19 | -------------------------------------------------------------------------------- /frontend/src/assets/images/mark_black.svg: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /frontend/src/assets/images/mark_white.svg: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /frontend/src/components/Simulator/PageSection.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /frontend/src/hooks/useConfig.ts: -------------------------------------------------------------------------------- 1 | import { getRuntimeConfigBoolean } from '@/utils/runtimeConfig'; 2 | 3 | export const useConfig = () => { 4 | const isHostedEnvironment = getRuntimeConfigBoolean('VITE_IS_HOSTED', false); 5 | const canUpdateValidators = !isHostedEnvironment; 6 | const canUpdateProviders = !isHostedEnvironment; 7 | const canUpdateFinalityWindow = !isHostedEnvironment; 8 | 9 | return { 10 | canUpdateValidators, 11 | canUpdateProviders, 12 | canUpdateFinalityWindow, 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /hardhat/contracts/v2_contracts/interfaces/IGenLayerToken.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.0; 3 | 4 | import { IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; 5 | 6 | interface IGenLayerToken is IERC20 { 7 | function mint(address account, uint256 amount) external; 8 | function burn(uint256 amount) external; 9 | function setTimelockFactory(address _timelockFactory) external; 10 | function getInflationOverSeconds( 11 | uint256 secs 12 | ) external view returns (uint256); 13 | } -------------------------------------------------------------------------------- /frontend/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url'; 2 | import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'; 3 | import viteConfig from './vite.config'; 4 | 5 | export default defineConfig((env) => 6 | mergeConfig( 7 | viteConfig(env), 8 | defineConfig({ 9 | test: { 10 | environment: 'jsdom', 11 | exclude: [...configDefaults.exclude, 'test/e2e/**'], 12 | root: fileURLToPath(new URL('./', import.meta.url)), 13 | }, 14 | }), 15 | ), 16 | ); 17 | -------------------------------------------------------------------------------- /frontend/src/components/JsonViewer/types/json-undefined.vue: -------------------------------------------------------------------------------- 1 | 23 | -------------------------------------------------------------------------------- /tests/integration/features/parallel_deployment.feature: -------------------------------------------------------------------------------- 1 | @parallel @cleanup_transactions 2 | Feature: Parallel Contract Deployment 3 | 4 | Background: 5 | Given all required containers are running 6 | 7 | Scenario: Deploy multiple contracts simultaneously 8 | Given I have a slow contract that takes time to initialize 9 | When I start deploying the contract 5 times in parallel 10 | Then within 2 seconds all 5 transactions should have status "PROPOSING" 11 | And all 5 transactions should have different transaction IDs -------------------------------------------------------------------------------- /tests/integration/features/websocket_notifications.feature: -------------------------------------------------------------------------------- 1 | Feature: WebSocket Notifications 2 | 3 | Scenario: Client receives real-time status updates 4 | Given a client is connected via WebSocket 5 | And subscribed to transaction "tx_123" 6 | When the transaction moves through states 7 | Then the client should receive events: 8 | | event_type | status | timestamp | 9 | | update | PROPOSING |