Skip to main content

Local devnet

Run a single-validator devnet on your machine. Chain ID safro-devnet-1 is separate from public testnet so wallets and scripts do not accidentally hit live endpoints.

When to use

Use local devnetUse public testnet
Offline developmentShared faucet and explorers
Unlimited test usafRealistic latency and peers
Wasm upload experimentsIBC to Noble / Osmosis
SafHandle contract iterationProduction-like conditions

Prerequisites: Install safrochaind (testnet toolchain is fine for local dev).

Quick start (repo script)

From the monorepo root:

chmod +x safrodevnet/scripts/bootstrap.sh
./safrodevnet/scripts/bootstrap.sh

First run creates genesis, funds a dev key, enables wasm uploads for everybody, and starts the node.

To wipe state and re-init:

RESET=1 ./safrodevnet/scripts/bootstrap.sh

Default endpoints: Local devnet endpoints.

Manual setup

export CHAIN_ID=safro-devnet-1
export HOME_DIR="$PWD/safrodevnet" # or any writable path
export KEYRING=test

safrochaind init devnet-node --chain-id "$CHAIN_ID" --home "$HOME_DIR"

safrochaind keys add validator --home "$HOME_DIR" --keyring-backend "$KEYRING"
safrochaind keys add dev --home "$HOME_DIR" --keyring-backend "$KEYRING"

VAL=$(safrochaind keys show validator -a --home "$HOME_DIR" --keyring-backend "$KEYRING")
DEV=$(safrochaind keys show dev -a --home "$HOME_DIR" --keyring-backend "$KEYRING")

safrochaind genesis add-genesis-account "$VAL" 100000000000000usaf \
--home "$HOME_DIR" --keyring-backend "$KEYRING"
safrochaind genesis add-genesis-account "$DEV" 100000000000000usaf \
--home "$HOME_DIR" --keyring-backend "$KEYRING"

# Allow wasm store on local devnet (default genesis is Nobody)
jq '.app_state.wasm.params.code_upload_access.permission = "Everybody"' \
"$HOME_DIR/config/genesis.json" > /tmp/genesis.json && mv /tmp/genesis.json "$HOME_DIR/config/genesis.json"

safrochaind genesis gentx validator 70000000000000usaf \
--chain-id "$CHAIN_ID" --home "$HOME_DIR" --keyring-backend "$KEYRING"
safrochaind genesis collect-gentxs --home "$HOME_DIR"
safrochaind genesis validate-genesis --home "$HOME_DIR"

safrochaind start --home "$HOME_DIR"

Save the dev address printed by keys show dev. It is pre-funded in genesis.

Verify

curl -s http://127.0.0.1:26657/status | jq '.result.node_info.network'
# "safro-devnet-1"

safrochaind query bank balances "$DEV" \
--node tcp://127.0.0.1:26657 \
--chain-id safro-devnet-1

Send a test tx

safrochaind tx bank send dev "$DEV" 1usaf \
--chain-id safro-devnet-1 \
--node tcp://127.0.0.1:26657 \
--gas auto --gas-adjustment 1.3 \
--gas-prices 0.05usaf \
--home "$HOME_DIR" \
--keyring-backend test \
-y

App developers

Point CosmJS or Cosmos Kit at localhost:

SettingValue
RPChttp://127.0.0.1:26657
RESThttp://127.0.0.1:1317
Chain IDsafro-devnet-1

Guide: Developers: local devnet.

Deploy SafHandle locally

  1. Start devnet (above)
  2. Store and instantiate safhandle-contract wasm
  3. Point SafHandle({ contractAddress: '...' }) at your local contract

See Smart contracts: local dev.