# How to Deploy a GenLayer Contract with Python: Complete CLI Guide

> Deploy GenLayer contracts with Python using the GenLayer CLI. This guide details how to compile and upload bytecode to the GenVM for seamless smart contract deployment.

- Repository: [GenLayer Labs/genlayer-project-boilerplate](https://github.com/genlayerlabs/genlayer-project-boilerplate)
- Tags: how-to-guide
- Published: 2026-08-20

---

**Deploy Python-based GenLayer smart contracts to any network using the GenLayer CLI, which orchestrates TypeScript deployment scripts to compile and upload bytecode to the GenVM.**

GenLayer contracts are written in Python and executed by the GenVM (Gen Virtual Machine). The `genlayerlabs/genlayer-project-boilerplate` repository provides a production-ready workflow that separates contract logic from deployment infrastructure. While your contract remains pure Python, the deployment process leverages the GenLayer JavaScript SDK to handle compilation, network communication, and transaction finalization.

## Prerequisites: Install the GenLayer CLI

Before deploying, install the global CLI tool that manages network configuration and orchestrates the deployment script.

```bash
npm install -g genlayer

```

This command makes the `genlayer` binary available system-wide, providing access to network selection and deployment commands used throughout this workflow.

## How the Deployment Architecture Works

Unlike traditional blockchain deployments that use the same language for contracts and deployment scripts, GenLayer separates these concerns. Your contract logic resides in Python files (e.g., [`contracts/football_bets.py`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/contracts/football_bets.py)), while the deployment harness is implemented in TypeScript at [`deploy/deployScript.ts`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/deploy/deployScript.ts).

The deployment process follows this architectural flow:

1. **Network Selection** – The CLI stores your chosen environment (localnet, testnet, or mainnet) in its configuration.
2. **Source Code Ingestion** – The script uses `fs.readFileSync` to load the Python contract into a `Uint8Array`.
3. **Consensus Initialization** – `client.initializeConsensusSmartContract()` ensures the on-chain consensus contract is active.
4. **Bytecode Deployment** – `client.deployContract({code, args})` transmits the compiled Python bytecode to the GenLayer chain.
5. **Transaction Finalization** – `client.waitForTransactionReceipt` polls until the transaction status returns *ACCEPTED* or *FINALIZED*.
6. **Address Extraction** – The deployment script parses the receipt and outputs the contract address for frontend integration.

## Step-by-Step Deployment Guide

### Configure Your Target Network

Select the appropriate network before deploying. Run the interactive network selector:

```bash
genlayer network

```

Choose between `localnet` for development, `testnet` for staging, or `mainnet` for production deployments. This selection persists across CLI sessions until changed.

### Execute the Deployment Command

Deploy your contract by running the deployment script. From the root of your `genlayer-project-boilerplate` checkout, execute:

```bash
genlayer deploy

```

This command invokes [`deploy/deployScript.ts`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/deploy/deployScript.ts), which performs the following operations:

- Reads [`contracts/football_bets.py`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/contracts/football_bets.py) into memory as binary data
- Initializes the consensus smart contract via the SDK client
- Submits the deployment transaction with constructor arguments
- Waits for blockchain confirmation
- Prints the deployed contract address to stdout

Expected output:

```

Contract deployed at address: 0xAbc123…

```

### Verify and Configure the Contract Address

After deployment, copy the emitted address into your frontend configuration. The repository provides a template at `frontend/.env.example` that expects `NEXT_PUBLIC_CONTRACT_ADDRESS`.

Update your `.env` file:

```bash
NEXT_PUBLIC_CONTRACT_ADDRESS=0xYourDeployedAddress

```

This makes the contract address available to the React frontend components that interact with the deployed contract.

## Deep Dive: The Deployment Script Anatomy

The [`deploy/deployScript.ts`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/deploy/deployScript.ts) file handles the technical complexity of GenLayer deployment without requiring additional Python code. Key implementation details include:

**Binary Conversion** – The script converts Python source to deployment-ready bytecode using standard file system operations, treating the `.py` file as a raw `Uint8Array` buffer.

**Consensus Management** – Before deploying user contracts, the script calls `client.initializeConsensusSmartContract()` to ensure the network's consensus layer is ready to validate transactions.

**Asynchronous Finalization** – The deployment uses `client.waitForTransactionReceipt` with polling logic to detect when the transaction reaches *ACCEPTED* or *FINALIZED* status, ensuring the contract is live before returning the address.

## Summary

- **GenLayer CLI** provides the primary interface for deploying Python contracts via `genlayer deploy`.
- **Python contracts** (like [`contracts/football_bets.py`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/contracts/football_bets.py)) are compiled to GenVM bytecode during the deployment process.
- **TypeScript deployment script** at [`deploy/deployScript.ts`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/deploy/deployScript.ts) handles network communication, consensus initialization, and transaction polling.
- **Network selection** supports localnet, testnet, and mainnet through the `genlayer network` command.
- **Contract addresses** must be exported to `frontend/.env` for the boilerplate frontend to interact with the deployed contract.

## Frequently Asked Questions

### Do I need to write TypeScript to deploy my Python contract?

No. The `genlayer-project-boilerplate` repository includes a complete TypeScript deployment script at [`deploy/deployScript.ts`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/deploy/deployScript.ts). You only write Python for the contract itself; the CLI handles the deployment infrastructure automatically when you run `genlayer deploy`.

### Can I deploy to a local testnet before using mainnet?

Yes. Run `genlayer network` and select `localnet` to deploy to a local development environment. This allows you to test the deployment workflow and contract functionality without consuming testnet resources or mainnet gas.

### What file format does the deployment script expect for the contract?

The deployment script reads standard Python files (`.py`) from the `contracts/` directory. Specifically, [`deploy/deployScript.ts`](https://github.com/genlayerlabs/genlayer-project-boilerplate/blob/main/deploy/deployScript.ts) uses Node.js `fs.readFileSync` to ingest the Python source as a `Uint8Array` before transmitting it to the GenVM for execution.

### How do I know when the deployment is finalized?

The deployment script polls the blockchain using `client.waitForTransactionReceipt` until the transaction status indicates *ACCEPTED* or *FINALIZED*. The CLI only prints the contract address after achieving finalization, ensuring the contract is fully deployed and ready for interaction.