Appearance
Wallet Transfers β
Real-time monitoring of wallet-to-wallet transfers on the Solana blockchain, providing insights into SOL and token movements between addresses.
Overview β
The wallet transfers WebSocket stream captures:
- SOL transfers between wallets
- SPL token transfers between wallets
- Transfer amounts and token types
- Transaction signatures and block information
- Related wallet analysis for tracking connected addresses
Connection β
WebSocket Endpoint:
wss://api.nolimitnodes.com/socket?apikey=YOUR_API_KEY1
Subscription β
Subscribe Request β
json
{
"method": "dataSubscribe",
"params": {
"referenceId": "WALLET_TRANSFERS",
"streams": [
{
"stream": "walletTransfersSubscribe",
"params": {
"token": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"from_address": "optional_sender_address",
"to_address": "optional_recipient_address"
}
}
]
},
"id": 1
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Filter Parameters β
| Parameter | Type | Required | Description |
|---|---|---|---|
from_address | string | No | Filter by sender wallet address |
to_address | string | No | Filter by recipient wallet address |
token | string | No | Filter by token mint address or "Solana" for SOL |
min_amount | number | No | Minimum transfer amount |
max_amount | number | No | Maximum transfer amount |
Response Messages β
Subscription Confirmation β
json
{
"status": "Subscribed to wallet transfers",
"subscription_id": "4db6df25-fa4f-4325-8652-ee3a9f9690b4",
"stream": "walletTransfersSubscribe",
"reference_id": "WALLET_TRANSFERS"
}1
2
3
4
5
6
2
3
4
5
6
Transfer Event β
json
{
"method": "walletTransfersSubscribe",
"subscription_id": "4db6df25-fa4f-4325-8652-ee3a9f9690b4",
"result": {
"from": "28fdboacCPayNxToWNfgNpkVpUuuhN9LyxfQKFt8vXjm",
"to": "axmFmfqQwZGEUZeF3i3MqbRCDiGPfshtbdoBjk41k88",
"amount": 1000000000,
"token": "Solana",
"transaction_signature": "4wBiX5Pw5QkJ7dmrZTSnqVP4axLsDNzB11f3vTHgbzcqLCKadBa48gCDoPe7CudLFHwwwnKDQMYXxCqmgFprVFAu",
"block_num": "367222399",
"block_time": "1758033052",
"decimals": 9
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Field Descriptions β
Transfer Information β
from: Sender wallet addressto: Recipient wallet addressamount: Transfer amount in smallest unit (lamports for SOL)token: Token type ("Solana" for SOL, mint address for SPL tokens)decimals: Token decimal places
Transaction Details β
transaction_signature: Solana transaction signatureblock_num: Block number where transfer occurredblock_time: Unix timestamp of the block
Unsubscribe β
To stop receiving transfer events, use the dataUnsubscribe method with the subscription ID:
Unsubscribe Request β
json
{
"method": "dataUnsubscribe",
"params": {
"subscriptionIds": ["your_subscription_id_here"],
"referenceId": "UNSUB_REF"
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
Unsubscribe Response β
json
{
"status": "Unsubscribed from wallet transfers",
"subscription_id": "your_subscription_id_here",
"stream": "walletTransfersSubscribe",
"reference_id": "UNSUB_REF"
}1
2
3
4
5
6
2
3
4
5
6
Code Examples β
JavaScript/Node.js β
javascript
const WebSocket = require('ws');
class WalletTransferMonitor {
constructor(apiKey) {
this.ws = new WebSocket(`wss://api.nolimitnodes.com/socket?apikey=${apiKey}`);
this.walletConnections = new Map(); // Track related wallets
this.setupHandlers();
}
setupHandlers() {
this.ws.on('open', () => {
console.log('Connected to wallet transfers stream');
this.subscribe();
});
this.ws.on('message', (data) => {
const message = JSON.parse(data);
if (message.method === 'walletTransfersSubscribe') {
this.processTransfer(message.result);
}
});
}
subscribe() {
// Subscribe to all transfers
this.ws.send(JSON.stringify({
method: 'dataSubscribe',
params: {
referenceId: 'WALLET_TRANSFERS',
streams: [{
stream: 'walletTransfersSubscribe',
params: {}
}]
}
}));
}
processTransfer(transfer) {
// Track wallet connections
this.trackWalletConnection(transfer.from, transfer.to);
// Convert amount based on decimals
const amount = transfer.amount / Math.pow(10, transfer.decimals || 9);
console.log('\nπΈ Wallet Transfer Detected:');
console.log(` From: ${transfer.from.slice(0, 8)}...${transfer.from.slice(-4)}`);
console.log(` To: ${transfer.to.slice(0, 8)}...${transfer.to.slice(-4)}`);
console.log(` Amount: ${amount.toLocaleString()} ${transfer.token === 'Solana' ? 'SOL' : 'tokens'}`);
console.log(` Signature: ${transfer.transaction_signature.slice(0, 16)}...`);
console.log(` Block: ${transfer.block_num}`);
// Check for related wallets
this.analyzeRelatedWallets(transfer.from, transfer.to);
}
trackWalletConnection(from, to) {
// Track connections between wallets
if (!this.walletConnections.has(from)) {
this.walletConnections.set(from, new Set());
}
if (!this.walletConnections.has(to)) {
this.walletConnections.set(to, new Set());
}
this.walletConnections.get(from).add(to);
this.walletConnections.get(to).add(from);
}
analyzeRelatedWallets(wallet1, wallet2) {
const connections1 = this.walletConnections.get(wallet1) || new Set();
const connections2 = this.walletConnections.get(wallet2) || new Set();
// Find common connections
const commonConnections = [...connections1].filter(w => connections2.has(w));
if (commonConnections.length > 0) {
console.log(` π Common connections found: ${commonConnections.length} wallet(s)`);
}
// Alert if wallets have interacted multiple times
if (connections1.has(wallet2)) {
console.log(' β οΈ These wallets have transferred before!');
}
}
}
// Usage
const monitor = new WalletTransferMonitor('YOUR_API_KEY');1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Python β
python
import json
import asyncio
import websockets
from collections import defaultdict
from datetime import datetime
class WalletTransferAnalyzer:
def __init__(self, api_key):
self.api_key = api_key
self.uri = f"wss://api.nolimitnodes.com/socket?apikey={api_key}"
self.transfer_history = []
self.wallet_graph = defaultdict(set) # Track wallet relationships
self.wallet_stats = defaultdict(lambda: {
'sent': 0, 'received': 0, 'total_volume': 0, 'tx_count': 0
})
async def connect(self):
self.websocket = await websockets.connect(self.uri)
print("Connected to wallet transfers stream")
async def subscribe(self, from_address=None, to_address=None):
params = {}
if from_address:
params["from_address"] = from_address
if to_address:
params["to_address"] = to_address
subscription = {
"method": "dataSubscribe",
"params": {
"referenceId": "WALLET_ANALYSIS",
"streams": [{
"stream": "walletTransfersSubscribe",
"params": params
}]
}
}
await self.websocket.send(json.dumps(subscription))
async def listen(self):
async for message in self.websocket:
data = json.loads(message)
if data.get('method') == 'walletTransfersSubscribe':
await self.process_transfer(data['result'])
async def process_transfer(self, transfer):
# Store transfer
self.transfer_history.append({
'timestamp': datetime.now(),
'data': transfer
})
# Update wallet graph
self.wallet_graph[transfer['from']].add(transfer['to'])
self.wallet_graph[transfer['to']].add(transfer['from'])
# Update statistics
amount = float(transfer['amount']) / (10 ** transfer.get('decimals', 9))
self.wallet_stats[transfer['from']]['sent'] += amount
self.wallet_stats[transfer['from']]['tx_count'] += 1
self.wallet_stats[transfer['from']]['total_volume'] += amount
self.wallet_stats[transfer['to']]['received'] += amount
self.wallet_stats[transfer['to']]['tx_count'] += 1
self.wallet_stats[transfer['to']]['total_volume'] += amount
# Display transfer
await self.display_transfer(transfer)
# Analyze for patterns
await self.detect_patterns(transfer)
async def display_transfer(self, transfer):
amount = float(transfer['amount']) / (10 ** transfer.get('decimals', 9))
token_name = "SOL" if transfer['token'] == "Solana" else "tokens"
print(f"\nπΈ Transfer Detected:")
print(f" From: {transfer['from'][:8]}...{transfer['from'][-4:]}")
print(f" To: {transfer['to'][:8]}...{transfer['to'][-4:]}")
print(f" Amount: {amount:,.4f} {token_name}")
print(f" Block: {transfer['block_num']}")
async def detect_patterns(self, transfer):
alerts = []
# Check for wallet clusters
from_connections = len(self.wallet_graph[transfer['from']])
to_connections = len(self.wallet_graph[transfer['to']])
if from_connections > 10:
alerts.append(f"πΈοΈ Sender connected to {from_connections} wallets")
if to_connections > 10:
alerts.append(f"πΈοΈ Receiver connected to {to_connections} wallets")
# Check for common connections
common_wallets = self.wallet_graph[transfer['from']] & self.wallet_graph[transfer['to']]
if len(common_wallets) > 1:
alerts.append(f"π {len(common_wallets)} common connections between wallets")
# Check volume patterns
sender_stats = self.wallet_stats[transfer['from']]
if sender_stats['tx_count'] > 50:
alerts.append(f"π High activity sender: {sender_stats['tx_count']} transfers")
# Display alerts
if alerts:
print(" π¨ Patterns Detected:")
for alert in alerts:
print(f" β’ {alert}")
async def analyze_wallet_cluster(self, wallet_address, depth=2):
"""Analyze wallet connections up to specified depth"""
print(f"\nπ Analyzing wallet cluster for: {wallet_address[:8]}...")
visited = set()
to_visit = [(wallet_address, 0)]
cluster = defaultdict(set)
while to_visit:
current, level = to_visit.pop(0)
if current in visited or level >= depth:
continue
visited.add(current)
connections = self.wallet_graph.get(current, set())
cluster[level].update(connections)
for connected in connections:
if connected not in visited:
to_visit.append((connected, level + 1))
# Display cluster analysis
total_wallets = sum(len(wallets) for wallets in cluster.values())
print(f"\nπ Cluster Analysis Results:")
print(f" Total related wallets: {total_wallets}")
for level, wallets in cluster.items():
if wallets:
print(f" Level {level + 1}: {len(wallets)} wallet(s)")
return cluster
async def show_statistics(self):
"""Display accumulated statistics"""
print("\n" + "="*60)
print("π WALLET TRANSFER STATISTICS")
print("="*60)
# Top senders
top_senders = sorted(
self.wallet_stats.items(),
key=lambda x: x[1]['sent'],
reverse=True
)[:5]
print("\nπΈ Top Senders:")
for wallet, stats in top_senders:
if stats['sent'] > 0:
print(f" {wallet[:8]}...{wallet[-4:]}")
print(f" Sent: {stats['sent']:,.2f} SOL")
print(f" Transactions: {stats['tx_count']}")
# Top receivers
top_receivers = sorted(
self.wallet_stats.items(),
key=lambda x: x[1]['received'],
reverse=True
)[:5]
print("\nπ₯ Top Receivers:")
for wallet, stats in top_receivers:
if stats['received'] > 0:
print(f" {wallet[:8]}...{wallet[-4:]}")
print(f" Received: {stats['received']:,.2f} SOL")
print(f" Transactions: {stats['tx_count']}")
# Most connected wallets
most_connected = sorted(
self.wallet_graph.items(),
key=lambda x: len(x[1]),
reverse=True
)[:5]
print("\nπ Most Connected Wallets:")
for wallet, connections in most_connected:
if connections:
print(f" {wallet[:8]}...{wallet[-4:]}: {len(connections)} connections")
async def main():
analyzer = WalletTransferAnalyzer("YOUR_API_KEY")
await analyzer.connect()
# Subscribe to all transfers
await analyzer.subscribe()
# Show statistics every 60 seconds
async def periodic_stats():
while True:
await asyncio.sleep(60)
await analyzer.show_statistics()
# Run both tasks concurrently
await asyncio.gather(
analyzer.listen(),
periodic_stats()
)
if __name__ == "__main__":
asyncio.run(main())1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
Use Cases β
1. Wallet Analysis β
- Related Wallet Discovery: Track connections between wallets to identify clusters
- Wallet Behavior Profiling: Analyze transfer patterns and frequencies
- Fund Flow Tracking: Follow the movement of funds across multiple wallets
2. Security Monitoring β
- Suspicious Activity Detection: Identify unusual transfer patterns or volumes
- Wallet Cluster Analysis: Detect potential wallet farms or related accounts
- Large Transfer Alerts: Monitor high-value transfers in real-time
3. Portfolio Tracking β
- Balance Monitoring: Track incoming and outgoing transfers for specific wallets
- Token Movement Analysis: Monitor specific token transfers
- Transaction History: Build comprehensive transfer histories for wallets
Best Practices β
1. Efficient Filtering β
- Use address filters to focus on specific wallets of interest
- Set amount thresholds to filter out dust transactions
- Filter by token type when tracking specific assets
2. Data Management β
- Implement data retention policies for historical transfers
- Use batch processing for analyzing large volumes of transfers
- Consider using a database for long-term storage and analysis
3. Pattern Recognition β
- Build wallet relationship graphs for cluster analysis
- Track transfer frequencies to identify automated wallets
- Monitor for circular transfers that might indicate wash trading