L1 Creation

Create an L1 with Transaction and Contract Deployer Precompiles enabled(using self-hosted node)

Objectives

By the end of this exercise, you will be able to:

  • Create an Avalanche L1 record in Builder Console with a custom genesis
  • Enable Transaction AllowList and Contract Deployer AllowList at genesis
  • Run a self-hosted node via Docker and connect Core Wallet to your L1

Prerequisites

Before starting this exercise, ensure you have:

  • BuilderHub account (create one if needed)
  • Core Wallet installed and set to the correct network mode
  • Docker installed and running locally
  • A funded wallet (testnet AVAX) to create the Subnet + Chain transactions - get tokens from the Console Faucet

Instructions

Step 1: Create the Subnet + Chain in Console

Use Builder Console to create the Subnet and then create your chain. You’ll edit the Genesis JSON before finalizing.

Builder Console

Checking requirements...

In Step 2: Create a Chain, open the Genesis JSON tab and add the two allowlist configs under config:

{
  "config": {
    "txAllowListConfig": {
      "blockTimestamp": 0,
      "adminAddresses": ["0x...YOUR_WALLET_EVM_ADDRESS"]
    },
    "contractDeployerAllowListConfig": {
      "blockTimestamp": 0,
      "adminAddresses": ["0x...YOUR_WALLET_EVM_ADDRESS"]
    }
  }
}

If you enable these allowlists but do not include your own wallet as an admin at genesis, you can immediately lock yourself out of the network.

Step 2: Run a self-hosted node (Docker)

This course does not use BuilderHub-managed nodes. Run your node locally with Docker so you control startup flags and can restart easily during troubleshooting.

Builder Console

L1 Node Setup with Docker

Configure your node settings, preview the Subnet-EVM chain config, create it on your server, and run Docker to start your L1 node.

Docker Installation

Make sure you have Docker installed on your system. You can use the following commands to install it:

# Install Docker using convenience scriptcurl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.shsudo usermod -aG docker $USERnewgrp docker# Test installationdocker run -it --rm hello-world
# Install Dockersudo yum update -ysudo yum install -y dockersudo systemctl start dockersudo systemctl enable dockersudo usermod -aG docker $USERnewgrp docker# Test installationdocker run -it --rm hello-world
# Install Docker using convenience scriptcurl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.shsudo usermod -aG docker $USERnewgrp docker# Test installationdocker run -it --rm hello-world
# Install Docker Desktop for Mac# Download from: https://www.docker.com/products/docker-desktop/echo "Please download and install Docker Desktop for Mac from the official Docker website."# After installation, you can test it by running:docker run -it --rm hello-world

If you do not want to use Docker, you can follow the instructions here.

Select L1

Enter the Avalanche Subnet ID of the L1 you want to run a node for

Step 3: Connect Core Wallet and verify precompiles are active

Once your node is running and you’ve added the network to Core Wallet:

  • Try sending a simple transaction (it should succeed for your admin wallet)
  • Confirm the precompiles are reachable at:
    • Transaction AllowList: 0x0200000000000000000000000000000000000002
    • Contract Deployer AllowList: 0x0200000000000000000000000000000000000000

Expected Output

You should have:

  • A running L1 node (Docker)
  • Core Wallet connected to your L1
  • Both allowlist precompiles enabled from genesis

Verification

To verify you've completed this exercise successfully:

  1. Your wallet can send a transaction on the L1
  2. You can open the allowlist consoles in the next section and view your role as Admin

Troubleshooting

I can’t send transactions after enabling the allowlist

  • Ensure your wallet address is included in txAllowListConfig.adminAddresses at genesis.

I can’t deploy contracts after enabling the deployer allowlist

  • Ensure your wallet address is included in contractDeployerAllowListConfig.adminAddresses at genesis.

Next Steps

Next, we’ll start interacting with these precompiles and then intentionally break permissions to learn recovery patterns.

Is this guide helpful?