Skip to main content
Get from zero to your first on-chain transfer on The DevNet Grid in about five minutes. You’ll install the CLI, point it at the network, fund a wallet from the faucet, send GEN to a second address, and confirm both the activation and the resulting balance.

Prerequisites

  • macOS or Linux
  • A terminal you’re comfortable with

Step 1: Install the CLI

Download the gen binary for your platform and put it on your PATH.
mv ./gen /usr/local/bin/gen
chmod +x /usr/local/bin/gen
Verify the install:
gen --help
You should see the top-level command list (wallet, client, config, service, and others). If that prints, you’re ready.

Step 2: Connect to a network

DevNet access. The RPC URL and a bearer token are issued by Gen Labs. Ask your contact and substitute them for <DEVNET_RPC_URL> and <your-jwt> in the commands below.
Tell the CLI which RPC endpoint to use. For DevNet, set it once with gen config so you don’t have to pass --rpc-url on every call:
gen config set rpc-url <DEVNET_RPC_URL>
DevNet requires a bearer token on every request. Persist your JWT as an Authorization header so it’s sent automatically:
gen config set header authorization "Bearer <your-jwt>"
Confirm the effective config:
gen config show
Expected output:
client:
  rpc_url: "<DEVNET_RPC_URL>"
  headers:
    authorization: "Bearer <your-jwt>"
    x-gen-protocol-version: "..."
You can override the endpoint on any individual command with --rpc-url <URL> (or -s), and override or add headers with --header "name: value". To remove the persisted token later, run gen config unset header authorization.

Step 3: Create a wallet

Create a new wallet called alice. This becomes your active wallet automatically:
gen wallet create alice
The CLI prints a 32-byte hex private key once, along with the wallet’s address (a grd@... bech32m string). Save the key somewhere safe. There is no way to recover it later. (If you’d rather have a BIP-39 recovery phrase, pass --mnemonic.) Expected output (abridged):
Created wallet 'alice'
  account: grd@1qgqqqqqgcte6a...
  public key: 0x...

Seed (write this down. It will not be shown again):
  0x...
Grab the account’s address into a shell variable so the next steps are copy-paste:
ALICE=$(gen wallet --json show alice --account-address-only | jq -r .result.account)

Step 4: Fund the wallet from the faucet

Ask the DevNet faucet to fund Alice. The faucet auto-creates the account on first use:
gen wallet faucet --amount 1000000000
Expected output:
Faucet transfer submitted

Recipient: grd@1zjm8wamf3nz...
Token contract: grd@1ma475ve...
Amount: 1000000000
Mode: with confirmation

Status: success
Activation ID: 0xf0f37be6...aff3
In --json mode the result looks like:
{
  "ok": true,
  "command": "faucet",
  "result": {
    "activation_id": "0xf0f37be6...aff3",
    "status": "success"
  }
}
Note: The DevNet faucet has a per-account rate limit. If a request fails with RateLimited, wait a minute and retry. If the faucet returns InsufficientFunds, it has been drained. Refills happen periodically.

Step 5: Send a transfer

Pick a recipient. For this walk-through, create a second wallet so you have somewhere to send to:
gen wallet create bob
BOB=$(gen wallet --json show bob --account-address-only | jq -r .result.account)
gen wallet create bob makes bob the active wallet, so the next command pins the source explicitly with --wallet alice. Send 1,000 subunits, pass --yes to skip the confirmation prompt, and capture the activation ID from the JSON envelope for the next step.
TXN=$(gen wallet --json transfer --wallet alice --to "$BOB" --amount 1000 --yes | jq -r .result.activation_id)
The transfer envelope looks like this in --json mode:
{
  "ok": true,
  "command": "transfer",
  "result": {
    "activation_id": "0x57dfbf81...aff3",
    "status": "success"
  }
}

Step 6: Confirm the activation

Fetch the activation you just submitted to see how it played out on the network:
gen client --json get-activation --activation-id "$TXN"
The result includes the events the activation emitted and the block it finalized in (end_block). This is useful for tracing and debugging. For a simple yes/no that the transfer landed, the most direct check is the recipient’s balance in Step 7.

Step 7: Verify the recipient balance

Query Bob’s balance to confirm the funds arrived. Pass the wallet name to query a specific stored wallet:
gen wallet balance bob
Expected output:
Balance

Wallet: bob
Account: grd@1cxyrpe2q7uh...

TOKEN  BALANCE  NAME       CONTRACT
GEN       1000  Gen Token  grd@1ma475ve...
Or in JSON:
gen wallet --json balance bob
{
  "ok": true,
  "command": "wallet-balance",
  "result": {
    "account": "grd@1cxyrpe2q7uh...",
    "balance": "1000",
    "name": "Gen Token",
    "symbol": "GEN",
    "token_contract": "grd@1ma475ve..."
  }
}
That’s it. You’ve sent and confirmed your first transfer on the Grid.

What’s next