Skip to main content
Back to Sample Apps

Sui Portfolio Tracker

A real-time terminal portfolio tracker for Sui that uses Quicknode GraphQL to fetch balances and transaction history, and gRPC streaming to detect live onchain activity.

Frontend Framework/Library:
Node.js
Language:
TypeScript
Build Tool/Development Server:
tsx
Sample app preview

Overview

This sample app is a terminal-based portfolio tracker for the Sui blockchain. It combines two Quicknode Sui API layers: GraphQL for rich balance and transaction queries, and gRPC streaming for real-time checkpoint notifications. For a step-by-step walkthrough, see the companion guide.

On startup, the app fetches initial coin balances and recent transactions via GraphQL. It then opens a persistent gRPC connection to SubscribeCheckpoints on Sui's SubscriptionService, receiving a new checkpoint roughly every 400-500ms. When the stream detects onchain activity for a tracked address, it triggers a debounced GraphQL re-fetch to update the displayed state.

Architecture

Startup
App -> Quicknode GraphQL (HTTPS/443)
-> GetBalances + GetTransactions
-> render initial state

Live Updates
App -> Quicknode gRPC (:9000)
-> SubscribeCheckpoints (persistent stream)
-> detect address in sender or balance_changes
-> 2s debounce -> GraphQL re-fetch -> re-render

Features


  • GraphQL queries for coin balances (all coin types) and the 20 most recent transactions on startup
  • gRPC SubscribeCheckpoints stream for event-driven detection (~400ms per checkpoint)
  • Debounced GraphQL re-fetch after relevant checkpoints to avoid redundant requests during bursts
  • Inline balance change display for each relevant checkpoint (coin type, direction, amount)
  • Multi-address tracking: one gRPC stream, client-side filtering across all addresses
  • Automatic gRPC reconnection with exponential backoff (up to 30s)
  • Split rendering: stable balance/transaction panel at the top, scrolling live feed below

Prerequisites


  • Node.js 20+
  • pnpm (npm install -g pnpm)
  • A Quicknode Sui mainnet endpoint

Project Structure

src/
index.ts # Entry point, startup orchestration, rendering
graphql.ts # GraphQL queries: GetBalances, GetTransactions
grpc-stream.ts # gRPC stream subscription and checkpoint processing
portfolio.ts # Portfolio state management and terminal rendering
types.ts # TypeScript type definitions
protos/ # Sui proto files (cloned from MystenLabs/sui-apis)

Environment Variables

Copy .env.example to .env and fill in:

QN_ENDPOINT_URL=https://your-endpoint.sui-mainnet.quiknode.pro
QN_ENDPOINT_TOKEN=your-token-here
SUI_ADDRESS=0x...
VariableDescription
QN_ENDPOINT_URLQuicknode Sui mainnet endpoint URL (without trailing slash or token)
QN_ENDPOINT_TOKENAuth token (the path segment after the hostname in your endpoint URL)
SUI_ADDRESSSui address(es) to track. Comma-separate multiple addresses

Finding your token: Your Quicknode endpoint URL looks like https://abc123xyz.sui-mainnet.quiknode.pro/abcdef1234567890. The token is the path segment after the hostname: abcdef1234567890.

To track multiple addresses, comma-separate them:

SUI_ADDRESS=0xabc...,0xdef...,0x123...

Note: GraphQL uses the token in the URL path; gRPC uses it as an x-token metadata header. Both values come from the same Quicknode endpoint.

Getting Started

1. Clone the repo

git clone https://github.com/quiknode-labs/qn-guide-examples.git
cd qn-guide-examples/sui/sui-portfolio-tracker

2. Clone Sui proto files

The gRPC client requires Sui's protobuf definitions:

git clone https://github.com/MystenLabs/sui-apis.git protos

3. Install dependencies

pnpm install

4. Configure environment

cp .env.example .env

Fill in the values from the Environment Variables section above.

5. Run

pnpm start

Scripts

CommandDescription
pnpm startRun with tsx (recommended)
pnpm devRun with file watching
pnpm buildCompile TypeScript
pnpm start:compiledRun compiled output

Preview

Preview 1Preview 2
Contributions & Feedback
We'd love to hear your feedback and welcome any contributions to this sample app!
To report issues or share feedback, open a GitHub issue in the qn-guide-examples repository.
To contribute, follow these steps:
  1. Fork the repository
  2. Create a feature branch:
    git checkout -b feature/amazing-feature
  3. Commit your changes:
    git commit -m "Add amazing feature"
  4. Push your branch:
    git push origin feature/amazing-feature
  5. Open a Pull Request.