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.