@@ -5,14 +5,27 @@ import { Injectable, Logger } from '@nestjs/common'
5
5
import { OnEvent } from '@nestjs/event-emitter'
6
6
import { NetworkCluster } from '@prisma/client'
7
7
import { AccountInfo , Connection , ParsedAccountData , PublicKey } from '@solana/web3.js'
8
+ import { Helius , HeliusCluster } from 'helius-sdk'
8
9
import { CORE_APP_STARTED } from './api-core.events'
9
10
import { ApiCoreConfigService , NetworkClusterMap } from './config/api-core-config.service'
10
11
12
+ function heliusCluster ( cluster : NetworkCluster ) : HeliusCluster {
13
+ switch ( cluster ) {
14
+ case NetworkCluster . SolanaMainnet :
15
+ return 'mainnet-beta'
16
+ case NetworkCluster . SolanaDevnet :
17
+ return 'devnet'
18
+ default :
19
+ throw new Error ( `HeliusCluster: Unsupported cluster: ${ cluster } ` )
20
+ }
21
+ }
22
+
11
23
@Injectable ( )
12
24
export class ApiCoreNetworkService {
13
25
private readonly logger = new Logger ( ApiCoreNetworkService . name )
14
26
private readonly connectionMap = new Map < NetworkCluster , Connection > ( )
15
27
private readonly clusterMap : NetworkClusterMap = this . config . networkClusters
28
+ private readonly helius : Map < NetworkCluster , Helius > = new Map ( )
16
29
private readonly umis : Map < NetworkCluster , Umi > = new Map ( )
17
30
constructor ( readonly config : ApiCoreConfigService ) { }
18
31
@@ -26,9 +39,15 @@ export class ApiCoreNetworkService {
26
39
const connection = this . ensureConnection ( cluster as NetworkCluster )
27
40
try {
28
41
const version = await connection . getVersion ( )
29
- this . logger . debug ( `Connected to ${ cluster } cluster, version ${ version [ 'solana-core' ] } ` )
42
+ this . logger . debug ( `[ ${ cluster } ] Connected to cluster version ${ version [ 'solana-core' ] } ` )
30
43
} catch ( error ) {
31
- this . logger . error ( `Error connecting to ${ cluster } cluster, ${ error } ` )
44
+ this . logger . error ( `[${ cluster } ] Error connecting to cluster, ${ error } ` )
45
+ }
46
+ // Helius SDK only supports devnet and mainnet
47
+ if ( this . config . heliusApiKey && [ 'SolanaDevnet' , 'SolanaMainnet' ] . includes ( cluster . toString ( ) ) ) {
48
+ this . logger . debug ( `[${ cluster } ] Helius SDK enabled for cluster` )
49
+ this . helius . set ( cluster as NetworkCluster , this . configureHelius ( cluster as NetworkCluster ) )
50
+ this . listWebhooks ( cluster as NetworkCluster )
32
51
}
33
52
}
34
53
}
@@ -49,11 +68,26 @@ export class ApiCoreNetworkService {
49
68
return found
50
69
}
51
70
52
- getClusterEndpoint ( cluster : NetworkCluster ) : string {
71
+ ensureHelius ( cluster : NetworkCluster ) : Helius {
72
+ const found = this . getHelius ( cluster )
73
+ if ( ! found ) {
74
+ throw new Error ( `Connection ${ cluster } not found` )
75
+ }
76
+ return found
77
+ }
78
+
79
+ private configureHelius ( cluster : NetworkCluster ) {
80
+ if ( ! this . config . heliusApiKey ) {
81
+ throw new Error ( 'Helius API key not configured' )
82
+ }
83
+ return new Helius ( this . config . heliusApiKey as string , heliusCluster ( cluster as NetworkCluster ) )
84
+ }
85
+
86
+ private getClusterEndpoint ( cluster : NetworkCluster ) : string {
53
87
return this . clusterMap [ cluster ]
54
88
}
55
89
56
- getConnection ( cluster : NetworkCluster ) {
90
+ private getConnection ( cluster : NetworkCluster ) {
57
91
if ( ! this . connectionMap . has ( cluster ) ) {
58
92
const endpoint = this . ensureClusterEndpoint ( cluster )
59
93
this . connectionMap . set ( cluster , new Connection ( endpoint , 'confirmed' ) )
@@ -65,6 +99,23 @@ export class ApiCoreNetworkService {
65
99
return connection
66
100
}
67
101
102
+ private getHelius ( cluster : NetworkCluster ) {
103
+ if ( ! this . helius . has ( cluster ) ) {
104
+ this . helius . set ( cluster , new Helius ( this . config . heliusApiKey as string , heliusCluster ( cluster ) ) )
105
+ }
106
+ return this . helius . get ( cluster )
107
+ }
108
+
109
+ private listWebhooks ( cluster : NetworkCluster ) {
110
+ const helius = this . ensureHelius ( cluster )
111
+ helius . getAllWebhooks ( ) . then ( ( webhooks ) => {
112
+ this . logger . debug ( `[${ cluster } ] Helius Webhooks: ${ webhooks . length } configured` )
113
+ for ( const webhook of webhooks ) {
114
+ this . logger . debug ( `[${ cluster } ] - Webhook: ${ webhook . accountAddresses . length } addresses` )
115
+ }
116
+ } )
117
+ }
118
+
68
119
async getTokenAccountsByMint ( {
69
120
cluster,
70
121
wallet,
0 commit comments