@validators-dao/solana-stream-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -16,18 +16,188 @@ pnpm add @validators-dao/solana-stream-sdk
|
|
|
16
16
|
|
|
17
17
|
## Usage
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
import { gRPC, bs58 } from '@validators-dao/solana-stream-sdk'
|
|
19
|
+
Example of using the GeyserClient to subscribe to Solana Pump Fun transactions and accounts:
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
```typescript
|
|
22
|
+
import {
|
|
23
|
+
GeyserClient,
|
|
24
|
+
bs58,
|
|
25
|
+
CommitmentLevel,
|
|
26
|
+
SubscribeRequestAccountsDataSlice,
|
|
27
|
+
SubscribeRequestFilterAccounts,
|
|
28
|
+
SubscribeRequestFilterBlocks,
|
|
29
|
+
SubscribeRequestFilterBlocksMeta,
|
|
30
|
+
SubscribeRequestFilterEntry,
|
|
31
|
+
SubscribeRequestFilterSlots,
|
|
32
|
+
SubscribeRequestFilterTransactions,
|
|
33
|
+
} from '@validators-dao/solana-stream-sdk'
|
|
34
|
+
import 'dotenv/config'
|
|
35
|
+
|
|
36
|
+
interface SubscribeRequest {
|
|
37
|
+
accounts: {
|
|
38
|
+
[key: string]: SubscribeRequestFilterAccounts
|
|
39
|
+
}
|
|
40
|
+
slots: {
|
|
41
|
+
[key: string]: SubscribeRequestFilterSlots
|
|
42
|
+
}
|
|
43
|
+
transactions: {
|
|
44
|
+
[key: string]: SubscribeRequestFilterTransactions
|
|
45
|
+
}
|
|
46
|
+
transactionsStatus: {
|
|
47
|
+
[key: string]: SubscribeRequestFilterTransactions
|
|
48
|
+
}
|
|
49
|
+
blocks: {
|
|
50
|
+
[key: string]: SubscribeRequestFilterBlocks
|
|
51
|
+
}
|
|
52
|
+
blocksMeta: {
|
|
53
|
+
[key: string]: SubscribeRequestFilterBlocksMeta
|
|
54
|
+
}
|
|
55
|
+
entry: {
|
|
56
|
+
[key: string]: SubscribeRequestFilterEntry
|
|
57
|
+
}
|
|
58
|
+
commitment?: CommitmentLevel | undefined
|
|
59
|
+
accountsDataSlice: SubscribeRequestAccountsDataSlice[]
|
|
60
|
+
ping?: any
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// const PUMP_FUN_MINT_AUTHORITY = 'TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM'
|
|
64
|
+
const PUMP_FUN_PROGRAM_ID = '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P'
|
|
65
|
+
|
|
66
|
+
const tran: SubscribeRequestFilterTransactions = {
|
|
67
|
+
accountInclude: [PUMP_FUN_PROGRAM_ID],
|
|
68
|
+
accountExclude: [],
|
|
69
|
+
accountRequired: [],
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const request: SubscribeRequest = {
|
|
73
|
+
accounts: {
|
|
74
|
+
pumpfun: {
|
|
75
|
+
account: [],
|
|
76
|
+
owner: [],
|
|
77
|
+
filters: [],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
slots: {},
|
|
81
|
+
transactions: { elsol: tran },
|
|
82
|
+
transactionsStatus: {},
|
|
83
|
+
blocks: {},
|
|
84
|
+
blocksMeta: {},
|
|
85
|
+
entry: {},
|
|
86
|
+
accountsDataSlice: [],
|
|
87
|
+
commitment: CommitmentLevel.PROCESSED,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const geyser = async () => {
|
|
91
|
+
console.log('Starting geyser client...')
|
|
92
|
+
const maxRetries = 2000000
|
|
93
|
+
|
|
94
|
+
const createClient = () => {
|
|
95
|
+
const token = process.env.X_TOKEN || ''
|
|
96
|
+
console.log('X_TOKEN:', token)
|
|
97
|
+
if (token === '') {
|
|
98
|
+
throw new Error('X_TOKEN environment variable is not set')
|
|
99
|
+
}
|
|
100
|
+
const endpoint = `https://grpc-ams-3.erpc.global`
|
|
101
|
+
console.log('Connecting to', endpoint)
|
|
102
|
+
|
|
103
|
+
// @ts-ignore ignore
|
|
104
|
+
return new GeyserClient(endpoint, token, undefined)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const connect = async (retries: number = 0): Promise<void> => {
|
|
108
|
+
if (retries > maxRetries) {
|
|
109
|
+
throw new Error('Max retries reached')
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
const client = createClient()
|
|
114
|
+
const version = await client.getVersion()
|
|
115
|
+
console.log('version: ', version)
|
|
116
|
+
const stream = await client.subscribe()
|
|
117
|
+
stream.on('data', async (data: any) => {
|
|
118
|
+
if (data.transaction !== undefined) {
|
|
119
|
+
const transaction = data.transaction
|
|
120
|
+
const txnSignature = transaction.transaction.signature
|
|
121
|
+
const tx = bs58.encode(new Uint8Array(txnSignature))
|
|
122
|
+
console.log('tx:', tx)
|
|
123
|
+
return
|
|
124
|
+
}
|
|
125
|
+
if (data.account === undefined) {
|
|
126
|
+
return
|
|
127
|
+
}
|
|
128
|
+
// console.log('data:', JSON.stringify(data, null, 2))
|
|
129
|
+
|
|
130
|
+
const accounts = data.account
|
|
131
|
+
const rawPubkey = accounts.account.pubkey
|
|
132
|
+
const rawTxnSignature = accounts.account.txnSignature
|
|
133
|
+
const pubkey = bs58.encode(new Uint8Array(rawPubkey))
|
|
134
|
+
const txnSignature = bs58.encode(new Uint8Array(rawTxnSignature))
|
|
135
|
+
console.log('pubkey:', pubkey)
|
|
136
|
+
console.log('txnSignature:', txnSignature)
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
stream.on('error', async (e: any) => {
|
|
140
|
+
console.error('Stream error:', e)
|
|
141
|
+
console.log(`Reconnecting ...`)
|
|
142
|
+
await connect(retries + 1)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
await new Promise<void>((resolve, reject) => {
|
|
146
|
+
stream.write(request, (err: any) => {
|
|
147
|
+
if (!err) {
|
|
148
|
+
resolve()
|
|
149
|
+
} else {
|
|
150
|
+
console.error('Request error:', err)
|
|
151
|
+
reject(err)
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
}).catch((reason) => {
|
|
155
|
+
console.error(reason)
|
|
156
|
+
throw reason
|
|
157
|
+
})
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error(`Connection failed. Retrying ...`, error)
|
|
160
|
+
await connect(retries + 1)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
await connect()
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const main = async () => {
|
|
168
|
+
try {
|
|
169
|
+
await geyser()
|
|
170
|
+
} catch (error) {
|
|
171
|
+
console.log(error)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
main()
|
|
24
176
|
```
|
|
25
177
|
|
|
178
|
+
Please ensure you have the `X_TOKEN` environment variable set with your gRPC token for authentication.
|
|
179
|
+
|
|
180
|
+
Please note that the url endpoint in the example is for demonstration purposes. You should replace it with the actual endpoint you are using.
|
|
181
|
+
|
|
26
182
|
## Features
|
|
27
183
|
|
|
28
|
-
- **
|
|
184
|
+
- **Geyser Client**: Direct access to Triton's Yellowstone gRPC client for real-time Solana data streaming
|
|
185
|
+
- **TypeScript Types**: Comprehensive TypeScript types for all filter and subscription interfaces
|
|
29
186
|
- **Base58 Utilities**: Includes bs58 for Solana address and data encoding/decoding
|
|
30
|
-
- **
|
|
187
|
+
- **Full Type Safety**: Complete TypeScript support with detailed type definitions
|
|
188
|
+
|
|
189
|
+
## Exported Types
|
|
190
|
+
|
|
191
|
+
- `GeyserClient`: Main client for connecting to Yellowstone gRPC streams
|
|
192
|
+
- `CommitmentLevel`: Solana commitment level types
|
|
193
|
+
- `SubscribeRequestFilterAccounts`: Account filter types
|
|
194
|
+
- `SubscribeRequestFilterTransactions`: Transaction filter types
|
|
195
|
+
- `SubscribeRequestFilterBlocks`: Block filter types
|
|
196
|
+
- `SubscribeRequestFilterBlocksMeta`: Block metadata filter types
|
|
197
|
+
- `SubscribeRequestFilterSlots`: Slot filter types
|
|
198
|
+
- `SubscribeRequestFilterEntry`: Entry filter types
|
|
199
|
+
- `SubscribeRequestAccountsDataSlice`: Account data slice types
|
|
200
|
+
- `bs58`: Base58 encoding/decoding utilities
|
|
31
201
|
|
|
32
202
|
## Dependencies
|
|
33
203
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Client, { CommitmentLevel, SubscribeRequestAccountsDataSlice, SubscribeRequestFilterAccounts, SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, SubscribeRequestFilterTransactions } from '@triton-one/yellowstone-grpc';
|
|
2
2
|
import bs58 from 'bs58';
|
|
3
|
-
export {
|
|
3
|
+
export { bs58, Client as GeyserClient, CommitmentLevel, SubscribeRequestAccountsDataSlice, SubscribeRequestFilterAccounts, SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, SubscribeRequestFilterTransactions, };
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EACb,eAAe,EACf,iCAAiC,EACjC,8BAA8B,EAC9B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,2BAA2B,EAC3B,kCAAkC,EACnC,MAAM,8BAA8B,CAAA;AACrC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EACL,IAAI,EACJ,MAAM,IAAI,YAAY,EACtB,eAAe,EACf,iCAAiC,EACjC,8BAA8B,EAC9B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,2BAA2B,EAC3B,kCAAkC,GACnC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Client, { CommitmentLevel, SubscribeRequestAccountsDataSlice, SubscribeRequestFilterAccounts, SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, SubscribeRequestFilterTransactions, } from '@triton-one/yellowstone-grpc';
|
|
2
2
|
import bs58 from 'bs58';
|
|
3
|
-
export {
|
|
3
|
+
export { bs58, Client as GeyserClient, CommitmentLevel, SubscribeRequestAccountsDataSlice, SubscribeRequestFilterAccounts, SubscribeRequestFilterBlocks, SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, SubscribeRequestFilterTransactions, };
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EACb,eAAe,EACf,iCAAiC,EACjC,8BAA8B,EAC9B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,8BAA8B,CAAA;AACrC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EACL,IAAI,EACJ,MAAM,IAAI,YAAY,EACtB,eAAe,EACf,iCAAiC,EACjC,8BAA8B,EAC9B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,2BAA2B,EAC3B,kCAAkC,GACnC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@validators-dao/solana-stream-sdk",
|
|
3
3
|
"description": "Solana Stream SDK by Validators DAO",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
"engines": {
|
|
10
10
|
"pnpm": ">=10",
|
|
11
11
|
"npm": "please_use_pnpm_instead",
|
|
12
|
-
"node": "22"
|
|
13
|
-
"version": "0.0.1"
|
|
12
|
+
"node": "22"
|
|
14
13
|
},
|
|
15
14
|
"repository": {
|
|
16
15
|
"type": "git",
|
|
@@ -32,8 +31,8 @@
|
|
|
32
31
|
"format": "prettier --write ."
|
|
33
32
|
},
|
|
34
33
|
"dependencies": {
|
|
35
|
-
"@triton-one/yellowstone-grpc": "
|
|
36
|
-
"bs58": "
|
|
34
|
+
"@triton-one/yellowstone-grpc": "4.0.2",
|
|
35
|
+
"bs58": "6.0.0"
|
|
37
36
|
},
|
|
38
37
|
"devDependencies": {
|
|
39
38
|
"prettier": "3.5.3",
|