The user dashboard now fetches real-time data from the Soroban smart contract instead of mock data.
-
frontend/src/lib/contract.ts- Fixed
MeterDatainterface to match v1 contract schema - Updated
fetchMeter()to fetch balance separately viaget_meter_balance() - Added
checkMeterAccess()function
- Fixed
-
frontend/src/services/meterService.ts- Added
checkAccess()export
- Added
-
frontend/src/app/dashboard/user/page.tsx- Enhanced
MeterCardto show all real data including expiry - Added warnings for expired plans and zero balance
- Improved access status calculation
- Enhanced
// 1. Get meter IDs for connected wallet
const meterIds = await getMetersByOwner(walletAddress);
// 2. For each meter, fetch details + balance
const meter = await getMeter(meterId);
// This internally calls:
// - get_meter(meter_id) → meter details
// - get_meter_balance(meter_id) → balance
// 3. Display in dashboard
// Shows: balance, active status, units used, plan, last payment, expiry-
Start the frontend:
cd frontend npm run dev -
Connect Freighter wallet on the dashboard
-
Verify data displays:
- Balance in XLM
- Active/Inactive status (green/red badge)
- Units used in kWh
- Plan type (Daily/Weekly/UsageBased)
- Last payment date
- Expiry date
-
Test refresh:
- Click "↻ Refresh" button
- Data should reload from contract
-
Test wallet change:
- Disconnect wallet
- Connect different wallet
- Data should update automatically
| Function | Purpose | Returns |
|---|---|---|
get_meters_by_owner(address) |
Get meter IDs | Vec<Symbol> |
get_meter(meter_id) |
Get meter details | Meter struct |
get_meter_balance(meter_id) |
Get balance | i128 (stroops) |
check_access(meter_id) |
Check access status | bool |
- In contract v1, balance is NOT in the
Meterstruct - Balance is stored separately via
DataKey::MeterBalance - Must call
get_meter_balance()separately
- Contract stores in milli-kWh (units × 1000)
- Dashboard converts to kWh by dividing by 1000
Dashboard calculates: hasAccess = active && balance > 0 && !expired
- Daily plan: expires_at = last_payment + 86,400 seconds
- Weekly plan: expires_at = last_payment + 604,800 seconds
- UsageBased plan: expires_at = u64::MAX (never expires by time)
- Meter ID doesn't exist in contract
- Check if meter is registered
- Meter exists but has no balance entry
- This is normal for newly registered meters (balance = 0)
- Check wallet is connected
- Check RPC_URL is correct
- Check CONTRACT_ID is correct
- Open browser console for errors
cd frontend
npm run build- ✅ Dashboard displays real data
- ✅ Auto-refresh on wallet change
- ✅ Manual refresh button
- ✅ Loading and error states
- ✅ Expiry tracking
- ✅ Balance warnings
All acceptance criteria met! 🎉
Check DASHBOARD_IMPLEMENTATION.md for detailed documentation.