@@ -5,14 +5,27 @@ import { Injectable, Logger } from '@nestjs/common'
55import { OnEvent } from '@nestjs/event-emitter'
66import { NetworkCluster } from '@prisma/client'
77import { AccountInfo , Connection , ParsedAccountData , PublicKey } from '@solana/web3.js'
8+ import { Helius , HeliusCluster } from 'helius-sdk'
89import { CORE_APP_STARTED } from './api-core.events'
910import { ApiCoreConfigService , NetworkClusterMap } from './config/api-core-config.service'
1011
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+
1123@Injectable ( )
1224export class ApiCoreNetworkService {
1325 private readonly logger = new Logger ( ApiCoreNetworkService . name )
1426 private readonly connectionMap = new Map < NetworkCluster , Connection > ( )
1527 private readonly clusterMap : NetworkClusterMap = this . config . networkClusters
28+ private readonly helius : Map < NetworkCluster , Helius > = new Map ( )
1629 private readonly umis : Map < NetworkCluster , Umi > = new Map ( )
1730 constructor ( readonly config : ApiCoreConfigService ) { }
1831
@@ -26,9 +39,15 @@ export class ApiCoreNetworkService {
2639 const connection = this . ensureConnection ( cluster as NetworkCluster )
2740 try {
2841 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' ] } ` )
3043 } 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 )
3251 }
3352 }
3453 }
@@ -49,11 +68,26 @@ export class ApiCoreNetworkService {
4968 return found
5069 }
5170
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 {
5387 return this . clusterMap [ cluster ]
5488 }
5589
56- getConnection ( cluster : NetworkCluster ) {
90+ private getConnection ( cluster : NetworkCluster ) {
5791 if ( ! this . connectionMap . has ( cluster ) ) {
5892 const endpoint = this . ensureClusterEndpoint ( cluster )
5993 this . connectionMap . set ( cluster , new Connection ( endpoint , 'confirmed' ) )
@@ -65,6 +99,23 @@ export class ApiCoreNetworkService {
6599 return connection
66100 }
67101
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+
68119 async getTokenAccountsByMint ( {
69120 cluster,
70121 wallet,
0 commit comments