वॉलेट ट्रैकिंग
Monitor a list of wallet addresses on Solana and Ethereum easily with Quicknode Streams. Update the wallet list through a simple UI.
अवलोकन
This sample app ships a live user activity feed that wires Quicknode Streams + Key-Value Store (KV Store) to monitor addresses, verify webhooks, store events in SQLite via Prisma, and push updates over SSE in real time (EVM + Solana).
वास्तुकला
Blockchain (EVM + Solana)
-> Quicknode Streams + KV
-> POST /api/webhook/streams (signature verified)
-> DB insert + SSE emit
-> UI live feed
विशेषताएँ
- Quicknode Streams सेटअप स्क्रिप्ट (बनाना + सक्रिय करना)
- EVM filter for native transfers and ERC-20 Transfer logs
- Solana filter for native transfers and SPL token transfers
- Quicknode KV list backed user monitoring, enabling dynamic user monitoring without redeploying the stream
- Labeling monitored addresses
- Bulk add monitored addresses
- वेबहुक हस्ताक्षर सत्यापन और टाइमस्टैम्प जांच
- SSE live updates
- ENS resolution for EVM addresses
- प्रिज्मा + SQLite स्थानीय संग्रहण
आवश्यक शर्तें
- Node.js 20+ और एक पैकेज मैनेजर (pnpm, yarn, npm)।
- Quicknode खाता and API key: Create an account, and get your Admin API चाबी के लिए
QN_API_KEY. - EVM endpoint for ENS/ERC-20 metadata: Create an Ethereum endpoint and copy the HTTPS URL for
QN_EVM_ENDPOINT. - Solana RPC endpoint for SPL token metadata: Create a Solana endpoint and copy the HTTPS URL for
QN_SOLANA_ENDPOINT. - सार्वजनिक वेबहुक यूआरएल: टनल का उपयोग करें जैसे
एनग्रोकया ऐप को इस तरह से तैनात करेंAPP_URLपहुँच योग्य है Quicknode .
परियोजना संरचना
filters/
evm-filter.js # Quicknode Streams filter (EVM)
solana-filter.js # Quicknode Streams filter (Solana)
scripts/
setup-streams.ts # Creates KV lists + stream (paused)
activate-streams.ts # Activates stream by id
src/
app/api/ # API routes (webhooks, users, SSE)
lib/ # Quicknode, webhook, SSE helpers
types/ # Stream payload types
prisma/
schema.prisma # SQLite schema
पर्यावरण चर
प्रतिलिपि .env.example को .पर्यावरण और भरें:
QN_API_KEY="" # Quicknode API key
QN_STREAM_SECURITY_TOKEN_EVM="" # EVM stream security token (from setup)
QN_STREAM_SECURITY_TOKEN_SOL="" # Solana stream security token (from setup)
QN_EVM_ENDPOINT="" # Quicknode EVM endpoint URL
QN_SOLANA_ENDPOINT="" # Solana RPC endpoint URL
DATABASE_URL="file:./dev.db" # SQLite DB
APP_URL="http://localhost:3000" # Public app URL (ngrok for local webhooks)
टिप्पणियाँ:
QN_STREAM_SECURITY_TOKEN_EVMऔरQN_STREAM_SECURITY_TOKEN_SOLare returned byस्थापित करना: streamsper chain.APP_URLपहुँच योग्य होना चाहिए Quicknode (एनजीरोक या तैनात यूआरएल का उपयोग करें)।
शुरू करना
1. आवश्यक शर्तें स्थापित करें
npm install
# pnpm install
# yarn install
2. अपनी env फ़ाइल बनाएँ
cp .env.example .env
3. आवश्यक चर जोड़ें
भरें .पर्यावरण (देखना आवश्यक शर्तेंस्थानीय के लिए webhooks अपने ऐप को ngrok के साथ एक्सपोज़ करें और HTTPS URL को कॉपी करें। APP_URL:
ngrok http 3000
4. Create Quicknode Streams + KV lists
npm run setup:streams
# pnpm run setup:streams
# yarn setup:streams
मुद्रित सुरक्षा टोकन की प्रतिलिपि इसमें डालें .पर्यावरण (QN_STREAM_SECURITY_TOKEN_EVM या QN_STREAM_SECURITY_TOKEN_SOL).
If you want Solana, run the command again with chain=solana-mainnet (देखना Quicknode Streams Setup for options).
5. Set up the database and start the app
npx prisma migrate dev --name init
# pnpm prisma migrate dev --name init
# yarn prisma migrate dev --name init
npm run dev
# pnpm dev
# yarn dev
6. Activate the stream
npm run activate:streams
# pnpm run activate:streams
# yarn activate:streams
खुला http://localhost:3000, add wallet addresses, and you should see live events as streams deliver webhooks.
डेटाबेस
डिफ़ॉल्ट रूप से SQLite का उपयोग किया जाता है। Prisma स्कीमा इसमें है। प्रिज्मा/स्कीमा.प्रिज्मा.
सामान्य कमांड:
pnpm prisma migrate dev --name init
pnpm prisma studio
Quicknode Streams Setup
Following the Getting Started section is enough. However, if you want to manage Streams settings or KV lists manually, follow these steps.
1. Check the filter
The EVM filter lives in filters/evm-filter.js. It emits:
nativeTransferevents (ETH transfers with non-zero value)erc20Transferevents (ERC-20 Transfer logs)
The filter checks addresses against the userstream_monitored_users_evm KV list.
The Solana filter lives in filters/solana-filter.js. It emits:
solTransferevents (native SOL transfers)splTransferevents (SPL token transfers)
The filter checks addresses against the userstream_monitored_users_sol KV list.
Adding addresses through UI will update the KV list automatically. However, if you need to manage KV lists manually, you can do so through the Quicknode REST API. Check the Key-Value Store documentation page to learn more.
2. Create stream + KV lists
pnpm run setup:streams
This will:
- Create the KV list for the selected chain (
userstream_monitored_users_evmयाuserstream_monitored_users_sol) - Base64 encode the filter for the chosen chain
- Test the filter with a test block number (as KV list will be empty at first, no events will be emitted.)
- Create a stream with:
status=pauseddataset=block_with_receipts(EVM) ordataset=block(Solana)- required webhook attributes (compression, retries, timeouts)
- Save the stream id to
.quicknode/streams.json - Print the
security_tokenके लिए.पर्यावरण(QN_STREAM_SECURITY_TOKEN_EVMयाQN_STREAM_SECURITY_TOKEN_SOL) - Creates a single stream per run (run again with
chain=solana-mainnetयाchain=ethereum-mainnetto create both).
You can override options using key=value args, for example:
pnpm run setup:streams chain=ethereum-mainnet name="UserStream EVM Monitor" test_block_number=24223192
pnpm run setup:streams chain=solana-mainnet name="UserStream Solana Monitor" test_block_number=393612994
Common options:
chain=ethereum-mainnet(alias:network=ethereum-mainnet)dataset=block_with_receiptsdataset_batch_size=1status=pausedelastic_batch_enabled=truefilter_path=filters/evm-filter.jstest_block_number=24223192destination_compression=nonedestination_headers='{"Content-Type":"application/json"}'destination_max_retry=3destination_retry_interval_sec=1destination_post_timeout_sec=10
वेबहुक सुरक्षा और पेलोड
- Endpoint :
POST /api/webhook/ streams - आवश्यक हेडर:
x-qn-nonce,x-qn-टाइमस्टैम्प,x-qn-हस्ताक्षर - पेलोड को जीज़िप कंप्रेस किया जा सकता है; हैंडलर इसे स्वतः पहचान लेता है।
सामग्री-एन्कोडिंग: जीज़िप - हस्ताक्षर सत्यापन का उपयोग
QN_STREAM_SECURITY_TOKEN_EVMयाQN_STREAM_SECURITY_TOKEN_SOL
एपीआई एंडपॉइंट्स
GET /api/health- स्वास्थ्य जांचGET /api/users- list monitored usersPOST /api/users- add a single user (walletAddress, optionalनाम)PATCH /api/users?id=...- update user name/displayNameDELETE /api/users?id=...- delete a userPOST /api/users/bulk- bulk add users (newline separated)POST /api/webhook/ streams- Quicknode Streams WEbhookPOST /api/webhook/test- local-only webhook testGET /api/sse- SSE stream of activity events
पूर्व दर्शन
![]()
- रिपॉजिटरी को फोर्क करें
- एक फीचर ब्रांच बनाएं:git checkout -b feature/amazing-feature
- अपने बदलावों को सेव करें:git commit -m "अद्भुत सुविधा जोड़ें"
- अपनी शाखा को आगे बढ़ाएं:git push origin feature/amazing-feature
- एक पुल रिक्वेस्ट खोलें।
