Skip to content

CLI

The Controller CLI enables automated execution of Starknet transactions from the terminal. It uses a human-in-the-loop workflow: you authorize sessions in the browser, then execute transactions from the command line without further prompts.

This is useful for scripting, backend automation, and AI agent integration.

Installation

curl -fsSL https://raw.githubusercontent.com/cartridge-gg/controller-cli/main/install.sh | bash

Or install via Cargo:

cargo install --git https://github.com/cartridge-gg/controller-cli

Quick Start

1. Generate a keypair

controller generate-keypair --json

This creates a session signing keypair and stores it locally in ~/.config/cartridge/.

2. Define policies

Create a policies.json file specifying which contracts and methods the session can call:

{
  "contracts": {
    "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7": {
      "name": "ETH Token",
      "methods": [
        {
          "name": "transfer",
          "entrypoint": "transfer",
          "description": "Transfer ETH tokens to another address"
        }
      ]
    }
  }
}

This uses the same policy format as the JavaScript SDK, with contract addresses mapping to allowed methods.

3. Register a session

controller register-session policies.json --json

This prints an authorization URL. Open it in your browser and approve the session. The CLI automatically polls for authorization and stores the session credentials once approved.

4. Execute transactions

Single call:

controller execute \
  --contract 0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 \
  --entrypoint transfer \
  --calldata 0x1234,0x100,0x0 \
  --wait --json

Multiple calls from a file:

controller execute --file calls.json --wait --json

Where calls.json contains:

{
  "calls": [
    {
      "contractAddress": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
      "entrypoint": "transfer",
      "calldata": ["0x1234", "0x100", "0x0"]
    }
  ]
}

Commands

generate-keypair

Creates a new session signing keypair and stores it locally.

controller generate-keypair [--json]

register-session

Generates an authorization URL and waits for the user to approve in the browser. Polls the API automatically (every 2 minutes, up to 3 attempts).

controller register-session <policy_file> [--json]

execute

Executes a transaction using the active session.

# Single call
controller execute --contract <address> --entrypoint <name> --calldata <hex,hex,...> [--wait] [--timeout <seconds>] [--json]
 
# Multiple calls
controller execute --file <calls.json> [--wait] [--timeout <seconds>] [--json]
FlagDescriptionDefault
--waitWait for transaction confirmationoff
--timeoutConfirmation timeout in seconds300

status

Displays current session status, keypair info, and expiration details.

controller status [--json]

Returns one of three states: no_session, keypair_only, or active.

clear

Removes all stored session data and keypairs.

controller clear [--yes] [--json]

Global Flags

All commands support:

FlagDescription
--jsonMachine-readable JSON output
--no-colorDisable colored terminal output

Configuration

The CLI reads configuration from ~/.config/controller-cli/config.toml:

[session]
storage_path = "~/.config/cartridge"
default_chain_id = "SN_SEPOLIA"
default_rpc_url = "https://api.cartridge.gg/x/starknet/sepolia"
 
[cli]
json_output = false
use_colors = true
callback_timeout_seconds = 300

Settings can be overridden with environment variables:

VariableDescription
CARTRIDGE_STORAGE_PATHSession storage location
CARTRIDGE_CHAIN_IDDefault chain ID
CARTRIDGE_RPC_URLDefault RPC endpoint
CARTRIDGE_API_URLAPI endpoint for session queries
CARTRIDGE_JSON_OUTPUTDefault to JSON output (true/1)

Precedence: CLI flags > environment variables > config file.

Error Handling

When using --json, errors return structured responses with machine-readable codes and recovery hints:

{
  "status": "error",
  "error_code": "SessionExpired",
  "message": "Session expired at 2025-01-01 00:00:00 UTC",
  "recovery_hint": "Run 'controller register-session' to create a new session"
}
Error CodeMeaningFix
NoSessionNo keypair foundRun generate-keypair
SessionExpiredSession has expiredRun register-session again
InvalidSessionDataCorrupted session dataRun clear and start over
TransactionFailedExecution failedCheck policies and calldata
CallbackTimeoutAuthorization timed outRun register-session again

Source

github.com/cartridge-gg/controller-cli