Skip to content
Open
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
6f46ace
fix web build on current Node
akobrin1 Jul 28, 2026
5ebaa2f
add selectable network profiles
akobrin1 Jul 28, 2026
fdf68e2
add EVM wallet support for EVM-enabled network profiles
akobrin1 Jul 31, 2026
035ad75
add design doc for MetaMask Cosmos signing on EVM profiles
akobrin1 Jul 31, 2026
9b0239b
fix EVM wallet safety and governance gating
akobrin1 Aug 13, 2026
d2b6d44
improve network startup and EVM query safety
akobrin1 Aug 13, 2026
9a04de5
support selectable MetaMask and Keplr wallets
akobrin1 Aug 13, 2026
4c1f81b
upgrade CosmJS for EVM account keys
akobrin1 Aug 13, 2026
76316f2
match wallet dialog to portal design
akobrin1 Aug 13, 2026
50f9df8
use portal MetaMask wallet icon
akobrin1 Aug 13, 2026
88f1363
add connected wallet account menu
akobrin1 Aug 13, 2026
24a030b
suppress extension body hydration mismatch
akobrin1 Aug 13, 2026
9f68cf1
show complete wallet page addresses
akobrin1 Aug 13, 2026
f15af52
fit wallet address card to content
akobrin1 Aug 13, 2026
453cfc8
keep validators visible with MetaMask
akobrin1 Aug 13, 2026
88aad6e
replace validator wallet labels with staking warning
akobrin1 Aug 13, 2026
ce2c1a6
show current governance votes
akobrin1 Aug 13, 2026
8778b1b
show both EVM account address formats
akobrin1 Aug 13, 2026
67b1ff8
query governance votes by bech32 address
akobrin1 Aug 13, 2026
c50b650
show active proposal voting countdown
akobrin1 Aug 13, 2026
bd7b77e
correct countdown unit plurals
akobrin1 Aug 13, 2026
874c7ad
cache staking overview data
akobrin1 Aug 13, 2026
cdb6e76
update project configuration
akobrin1 Aug 13, 2026
5bc8bff
defer fresh staking cache refresh
akobrin1 Aug 13, 2026
46f57f7
make WalletConnect initialization idempotent
akobrin1 Aug 13, 2026
f04e3d3
fix MetaMask wallet account data
akobrin1 Aug 13, 2026
d005f62
add global search, account inspector, and dashboard versions block
akobrin1 Aug 14, 2026
1c06974
Potential fix for pull request finding
a-ok123 Aug 17, 2026
c27821a
Update packages/ui/src/screens/HomeScreen.tsx
a-ok123 Aug 17, 2026
6160acc
Update packages/ui/src/screens/GovernanceScreen.tsx
a-ok123 Aug 17, 2026
b88b844
Update packages/ui/src/screens/GovernanceDetailsScreen.tsx
a-ok123 Aug 17, 2026
1b84bc9
Update apps/web/src/utils/staking-overview-cache.ts
a-ok123 Aug 17, 2026
4b94675
Update apps/web/src/hooks/useStaking.ts
a-ok123 Aug 17, 2026
f9edb26
Update apps/web/src/hooks/useStaking.ts
a-ok123 Aug 17, 2026
7ff0611
Update apps/web/src/hooks/useStaking.ts
a-ok123 Aug 17, 2026
87a6b81
Update apps/web/src/hooks/useStaking.ts
a-ok123 Aug 17, 2026
f2bfdfa
Potential fix for pull request finding 'Unused variable, import, func…
a-ok123 Aug 17, 2026
78584ef
repair staking auto-refresh fix and cover it with tests
akobrin1 Aug 17, 2026
0661d19
handle unavailable staking cache storage
akobrin1 Aug 17, 2026
5d204ca
fix portfolio tooltip units, degenerate heights, and EVM sync races
akobrin1 Aug 17, 2026
85e6f8c
update Tailwind loader for Node 26
akobrin1 Aug 17, 2026
8be380c
avoid serializing large SDK cache strings
akobrin1 Aug 17, 2026
d963d8e
classify transaction history transfer direction
akobrin1 Aug 17, 2026
359b483
improve transaction history action icons
akobrin1 Aug 17, 2026
e2ea272
add design for integrating EVM work into the deployed develop line
akobrin1 Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,6 @@ yarn-error.log*
*.pem

#.tamagui/

# Superdesign local design context and temporary templates
.superdesign/
70 changes: 70 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Changelog

All notable changes to Lumera Hub are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.0.0] - 2026-08-14

First public release of Lumera Hub — a web portal for the Lumera network covering
wallet management, staking, governance, and chain exploration.

### Added

**Dashboard**
- Network overview with recent activity, claimable staking rewards, and active
governance proposals with voting countdowns.
- Versions footer showing the connected network's chain ID and node version,
the EVM chain ID (on EVM-enabled networks), and the Hub build version taken
from the git tag or commit.

**Wallet**
- Keplr and MetaMask wallet support with a selectable wallet picker.
- Send, receive (QR code), and stake flows with advanced fee/gas/memo options.
- Balance overview: available, staking, rewards, and unstaking totals.
- Both address formats (Bech32 and ETH hex) with click-to-copy.
- Paginated transaction history with block and transaction links.

**EVM support**
- Selectable network profiles (mainnet, testnet, devnet) with EVM-enabled
profiles served via MetaMask: EVM balance queries, `eth_sendTransaction`
transfers, and Bech32 ↔ ETH hex address conversion throughout the app.

**Staking**
- Validator list with sorting, filtering, and delegation totals.
- Delegate, undelegate, redelegate, and claim-rewards flows.
- "My Staking" view with sortable positions and unbonding entries.
- Validator details page: statistics, uptime over the last 100 blocks,
commission, and delegator list.
- Staking rewards calculator.

**Governance**
- Proposal list with status, results, and voting countdowns.
- Vote flow with current-vote display, queried by Bech32 address.
- Proposal creation (text proposals) with deposit validation.

**Explorers**
- Global search in the header accepting a block height, transaction hash, or
account address (Bech32 or ETH hex, case-insensitive) and routing to the
matching inspector.
- Block details page with proposer and transaction list.
- Transaction details page with decoded messages and events.
- Account inspector: balances, delegations, both address formats, and
sent/received transaction history for any address.
- Validator inspector linked from delegator lists.

**Services**
- Cascade page with storage metrics, charts, and file browsing.
- Sense, Inference, and NFTs sections.

### Fixed

- Wallet "Unstaking" total always showing zero due to a misread unbonding
response.
- MetaMask account data not refreshing correctly on wallet changes.
- WalletConnect initialization running more than once per session.
- Governance votes not recorded when queried with an EVM address format.
- Countdown unit plurals (for example "1 days" → "1 day").

[1.0.0]: https://github.com/LumeraProtocol/lumera-hub/releases/tag/v1.0.0
124 changes: 124 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
SHELL := /bin/bash

PNPM ?= pnpm
PORT ?= 3000
WEB_ENV_FILE := apps/web/.env.local
WEB_ENV_EXAMPLE := apps/web/.env.example

# Set complete profiles explicitly so stale local overrides cannot route a run
# to another network. Cosmos EIP-712 writes remain fail-closed.
COMMON_NETWORK_ENV := \
NEXT_PUBLIC_DENOM=ulume \
NEXT_PUBLIC_COSMOS_EIP712_ENABLED=false \
NEXT_PUBLIC_SNAPI_URL=http://localhost:3100

DEVNET_ENV := \
$(COMMON_NETWORK_ENV) \
NEXT_PUBLIC_NETWORK_PROFILE=devnet \
NEXT_PUBLIC_CHAIN_NAME=lumera-devnet \
NEXT_PUBLIC_CHAIN_ID=lumera-devnet-1 \
NEXT_PUBLIC_REST_AI_URL=https://lcd.pastel.network \
NEXT_PUBLIC_RPC_ENDPOINT=https://rpc.pastel.network \
NEXT_PUBLIC_EVM_PROFILE_NAME=lumera-devnet-evm \
NEXT_PUBLIC_EVM_RPC_ENDPOINT=https://evm-rpc.pastel.network \
NEXT_PUBLIC_EVM_WS_ENDPOINT= \
NEXT_PUBLIC_EVM_CHAIN_ID=76857769

TESTNET_ENV := \
$(COMMON_NETWORK_ENV) \
NEXT_PUBLIC_NETWORK_PROFILE=testnet \
NEXT_PUBLIC_CHAIN_NAME=lumera-testnet \
NEXT_PUBLIC_CHAIN_ID=lumera-testnet-2 \
NEXT_PUBLIC_REST_AI_URL=https://lcd-testnet.lumeraprotocol.com \
NEXT_PUBLIC_RPC_ENDPOINT=https://rpc-testnet.lumeraprotocol.com \
NEXT_PUBLIC_EVM_PROFILE_NAME=lumera-testnet-evm \
NEXT_PUBLIC_EVM_RPC_ENDPOINT=https://evm-testnet.lumeraprotocol.com \
NEXT_PUBLIC_EVM_WS_ENDPOINT=https://evm-ws-testnet.lumeraprotocol.com \
NEXT_PUBLIC_EVM_CHAIN_ID=76857769

MAINNET_ENV := \
$(COMMON_NETWORK_ENV) \
NEXT_PUBLIC_NETWORK_PROFILE=mainnet \
NEXT_PUBLIC_CHAIN_NAME=lumera \
NEXT_PUBLIC_CHAIN_ID=lumera-mainnet-1 \
NEXT_PUBLIC_REST_AI_URL=https://lcd.lumera.io \
NEXT_PUBLIC_RPC_ENDPOINT=https://rpc.lumera.io \
NEXT_PUBLIC_EVM_PROFILE_NAME= \
NEXT_PUBLIC_EVM_RPC_ENDPOINT= \
NEXT_PUBLIC_EVM_WS_ENDPOINT= \
NEXT_PUBLIC_EVM_CHAIN_ID=

.DEFAULT_GOAL := help

.PHONY: help deps local-env setup \
devnet devnet-build devnet-check devnet-preview \
testnet testnet-build testnet-check testnet-preview \
mainnet mainnet-build mainnet-check mainnet-preview \
test typecheck

help: ## Show available commands.
@printf '%s\n' \
'make devnet Install, configure, and run the devnet development server' \
'make testnet Install, configure, and run the testnet development server' \
'make mainnet Install, configure, and run the mainnet development server' \
'make <net>-check Run tests, type checking, and a production build' \
'make <net>-preview Build and serve a production bundle' \
'make <net>-build Build the web app for devnet, testnet, or mainnet' \
'make setup Install dependencies and create .env.local when missing' \
'make test Run web unit tests' \
'make typecheck Run web TypeScript checks'

deps:
$(PNPM) install --frozen-lockfile

local-env:
@if [[ -f "$(WEB_ENV_FILE)" ]]; then \
printf 'Keeping existing %s\n' "$(WEB_ENV_FILE)"; \
else \
cp "$(WEB_ENV_EXAMPLE)" "$(WEB_ENV_FILE)"; \
printf 'Created %s from %s\n' "$(WEB_ENV_FILE)" "$(WEB_ENV_EXAMPLE)"; \
fi

setup: deps local-env

devnet: setup ## Run the development server against Lumera devnet.
@printf 'Starting devnet at http://localhost:%s (the first request can take about a minute to compile)\n' "$(PORT)"
$(DEVNET_ENV) $(PNPM) --filter web dev --port $(PORT)

testnet: setup ## Run the development server against Lumera testnet.
@printf 'Starting testnet at http://localhost:%s (the first request can take about a minute to compile)\n' "$(PORT)"
$(TESTNET_ENV) $(PNPM) --filter web dev --port $(PORT)

mainnet: setup ## Run the development server against Lumera mainnet.
@printf 'Starting mainnet at http://localhost:%s (the first request can take about a minute to compile)\n' "$(PORT)"
$(MAINNET_ENV) $(PNPM) --filter web dev --port $(PORT)

test: deps ## Run web unit tests.
$(PNPM) --filter web test

typecheck: deps ## Run web TypeScript checks.
$(PNPM) --filter web exec tsc --noEmit

devnet-build: setup ## Create a production build configured for devnet.
$(DEVNET_ENV) $(PNPM) build:web

testnet-build: setup ## Create a production build configured for testnet.
$(TESTNET_ENV) $(PNPM) build:web

mainnet-build: setup ## Create a production build configured for mainnet.
$(MAINNET_ENV) $(PNPM) build:web

devnet-check: test typecheck devnet-build ## Run all automated devnet checks.

testnet-check: test typecheck testnet-build ## Run all automated testnet checks.

mainnet-check: test typecheck mainnet-build ## Run all automated mainnet checks.

devnet-preview: devnet-build ## Build and serve the devnet production bundle.
$(DEVNET_ENV) $(PNPM) --filter web start --port $(PORT)

testnet-preview: testnet-build ## Build and serve the testnet production bundle.
$(TESTNET_ENV) $(PNPM) --filter web start --port $(PORT)

mainnet-preview: mainnet-build ## Build and serve the mainnet production bundle.
$(MAINNET_ENV) $(PNPM) --filter web start --port $(PORT)
49 changes: 49 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,37 @@ A monorepo for Lumera Hub applications: web (Next.js), desktop (Tauri), and mobi
- For desktop: Rust toolchain
- For mobile: Xcode (macOS) or Android Studio

### Quick Start (Make)

The fastest way to run the web app is through the Makefile. Each network target
installs dependencies, creates `apps/web/.env.local` from the template when it
is missing, and pins the complete network profile — no manual env editing needed:

```bash
make devnet # run the dev server against Lumera devnet
make testnet # run the dev server against Lumera testnet
make mainnet # run the dev server against Lumera mainnet
```

All targets (replace `<net>` with `devnet`, `testnet`, or `mainnet`):

| Target | What it does |
| --- | --- |
| `make <net>` | Install, configure, and run the development server |
| `make <net>-build` | Create a production build configured for that network |
| `make <net>-check` | Run tests, type checking, and a production build |
| `make <net>-preview` | Build and serve a production bundle |
| `make setup` | Install dependencies and create `.env.local` when missing |
| `make test` | Run web unit tests |
| `make typecheck` | Run web TypeScript checks |
| `make help` | List available commands (also the default target) |

The dev and preview servers listen on port 3000; override it with `PORT`:

```bash
make testnet PORT=3001
```

### Installation

```bash
Expand All @@ -19,6 +50,24 @@ pnpm install

## Development

### Select a network

The Make targets above set the network profile for you. When running the app
directly with pnpm instead, copy the web environment template and select one of
the local network profiles:

```bash
cp apps/web/.env.example apps/web/.env.local
```

```dotenv
NEXT_PUBLIC_NETWORK_PROFILE=testnet
```

Supported profiles are `devnet`, `testnet`, and `mainnet`. Their chain IDs and endpoints are defined together in `apps/web/src/contants/network.ts`. Individual `NEXT_PUBLIC_CHAIN_NAME`, `NEXT_PUBLIC_CHAIN_ID`, `NEXT_PUBLIC_RPC_ENDPOINT`, `NEXT_PUBLIC_REST_AI_URL`, `NEXT_PUBLIC_EVM_RPC_ENDPOINT`, `NEXT_PUBLIC_EVM_WS_ENDPOINT`, `NEXT_PUBLIC_EVM_CHAIN_ID`, and `NEXT_PUBLIC_SNAPI_URL` values can still override the selected profile.

Profiles with both an EVM RPC endpoint and EVM chain ID use an injected EIP-1193 wallet for native LUME balances and transfers. Profiles without those values continue to use the legacy Cosmos/Interchain wallet flow.

### Run Dev Servers with Watcher

Run all apps in development mode:
Expand Down
23 changes: 16 additions & 7 deletions apps/web/.env.example
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
NEXT_PUBLIC_NODE_ENV=production
NEXT_PUBLIC_CHAIN_NAME=lumera
NEXT_PUBLIC_DENOM=ulume
NEXT_PUBLIC_CHAIN_ID=lumera-testnet-2
NEXT_PUBLIC_REST_AI_URL=https://lcd.testnet.lumera.io
NEXT_PUBLIC_RPC_ENDPOINT=https://rpc.testnet.lumera.io
# Switch the complete local endpoint set with: devnet, testnet, or mainnet.
NEXT_PUBLIC_NETWORK_PROFILE=testnet

# Optional per-value overrides. Leave unset to use the selected profile.
# NEXT_PUBLIC_CHAIN_NAME=lumeratestnet
# NEXT_PUBLIC_DENOM=ulume
# NEXT_PUBLIC_CHAIN_ID=lumera-testnet-2
# NEXT_PUBLIC_REST_AI_URL=https://lcd-testnet.lumeraprotocol.com
# NEXT_PUBLIC_RPC_ENDPOINT=https://rpc-testnet.lumeraprotocol.com
# NEXT_PUBLIC_EVM_RPC_ENDPOINT=https://evm-testnet.lumeraprotocol.com
# NEXT_PUBLIC_EVM_WS_ENDPOINT=https://evm-ws-testnet.lumeraprotocol.com
# NEXT_PUBLIC_EVM_CHAIN_ID=76857769
# Enable only after the chain and hub MetaMask Cosmos signer are both ready.
# NEXT_PUBLIC_COSMOS_EIP712_ENABLED=false
# NEXT_PUBLIC_SNAPI_URL=http://localhost:3100

NEXT_PUBLIC_WALLET_CONNECT_PROJECTID=fd049c1154d0886fda615b1c2e08ee28
NEXT_PUBLIC_WALLET_CONNECT_RELAY_URL=wss://relay.walletconnect.org
NEXT_PUBLIC_WALLET_CONNECT_NAME=Lumera Hub
NEXT_PUBLIC_WALLET_CONNECT_DESCRIPTION=Lumera Hub
NEXT_PUBLIC_WALLET_CONNECT_URL=https://hub.testnet.lumera.io
NEXT_PUBLIC_WALLET_CONNECT_ICON=https://portal.testnet.lumera.io/assets/logo-5cb73fc7.png
NEXT_PUBLIC_SNAPI_URL=http://localhost:3100
NEXT_PUBLIC_IPAPI_KEY=
NEXT_PUBLIC_ABSTRACTAPI_KEY=
Loading