@@ -17,6 +17,7 @@ import (
1717 ethrpcminer "github.com/chainsafe/canton-middleware/pkg/ethrpc/miner"
1818 ethrpc "github.com/chainsafe/canton-middleware/pkg/ethrpc/service"
1919 ethrpcstore "github.com/chainsafe/canton-middleware/pkg/ethrpc/store"
20+ indexerclient "github.com/chainsafe/canton-middleware/pkg/indexer/client"
2021 "github.com/chainsafe/canton-middleware/pkg/keys"
2122 "github.com/chainsafe/canton-middleware/pkg/log"
2223 "github.com/chainsafe/canton-middleware/pkg/pgutil"
@@ -31,6 +32,7 @@ import (
3132
3233 "github.com/go-chi/chi/v5"
3334 "github.com/go-chi/chi/v5/middleware"
35+ "github.com/uptrace/bun"
3436 "go.uber.org/zap"
3537)
3638
@@ -106,6 +108,58 @@ func (s *Server) Run() error {
106108 // Keep this defer as a safety net.
107109 defer stopReconcile ()
108110
111+ svcs , err := initServices (ctx , cfg , dbBun , cantonClient , cipher , logger )
112+ if err != nil {
113+ return err
114+ }
115+
116+ router := s .setupRouter (svcs .evmStore , cantonClient , svcs .tokenService , svcs .regSvc , svcs .transferSvc , logger )
117+
118+ err = apphttp .ServeAndWait (ctx , router , logger , cfg .Server )
119+
120+ // Stop background work before deferred DB/client closes kick in.
121+ stopReconcile ()
122+
123+ return err
124+ }
125+
126+ // buildTokenProvider constructs the token data provider according to the
127+ // configured mode. canton is the default; indexer reads from the indexer's
128+ // pre-materialized HTTP API instead of issuing live gRPC ACS scans.
129+ func buildTokenProvider (cfg * config.APIServer , cantonToken cantontkn.Token ) (token.Provider , error ) {
130+ switch cfg .TokenProvider .Mode {
131+ case config .TokenProviderIndexer :
132+ ic := cfg .TokenProvider .Indexer
133+ if ic == nil {
134+ return nil , fmt .Errorf ("token_provider.indexer config is required when mode is %q" , config .TokenProviderIndexer )
135+ }
136+ c , err := indexerclient .New (ic .URL , nil )
137+ if err != nil {
138+ return nil , fmt .Errorf ("create indexer client: %w" , err )
139+ }
140+ return tokenprovider .NewIndexer (c , ic .Instruments ), nil
141+ default : // TokenProviderCanton
142+ return tokenprovider .NewCanton (cantonToken ), nil
143+ }
144+ }
145+
146+ type services struct {
147+ evmStore ethrpc.Store
148+ tokenService * token.Service
149+ regSvc userservice.Service
150+ transferSvc transfer.Service
151+ }
152+
153+ func initServices (
154+ ctx context.Context ,
155+ cfg * config.APIServer ,
156+ dbBun * bun.DB ,
157+ cantonClient * canton.Client ,
158+ cipher keys.KeyCipher ,
159+ logger * zap.Logger ,
160+ ) (* services , error ) {
161+ userStore := userstore .NewStore (dbBun )
162+
109163 topologyCache := userservice .NewTopologyCache (topologyCacheTTL )
110164 go topologyCache .Start (ctx )
111165
@@ -118,29 +172,27 @@ func (s *Server) Run() error {
118172 topologyCache ,
119173 )
120174
121- tokenDataProvider := tokenprovider .NewCanton (cantonClient .Token )
122- tokenService := token .NewTokenService (cfg .Token , tokenDataProvider , userStore , cantonClient .Token )
175+ tokenDataProvider , err := buildTokenProvider (cfg , cantonClient .Token )
176+ if err != nil {
177+ return nil , fmt .Errorf ("build token provider: %w" , err )
178+ }
179+
123180 evmStore := ethrpcstore .NewStore (dbBun )
124181
125182 transferCache := transfer .NewPreparedTransferCache (transferCacheTTL , transferCacheMaxSize )
126183 go transferCache .Start (ctx )
127- transferSvc := transfer .NewTransferService (cantonClient .Token , userStore , transferCache , tokenSymbols (cfg .Token ))
128- regSvcLog := userservice .NewLog (registrationService , logger )
129- transferSvcLog := transfer .NewLog (transferSvc , logger )
130184
131185 if cfg .EthRPC .Enabled {
132186 m := ethrpcminer .New (evmStore , cfg .EthRPC .ChainID , cfg .EthRPC .GasLimit , cfg .EthRPC .MinerMaxTxsPerBlock , cfg .EthRPC .MinerInterval , logger )
133187 go m .Start (ctx )
134188 }
135189
136- router := s .setupRouter (evmStore , cantonClient , tokenService , regSvcLog , transferSvcLog , logger )
137-
138- err = apphttp .ServeAndWait (ctx , router , logger , cfg .Server )
139-
140- // Stop background work before deferred DB/client closes kick in.
141- stopReconcile ()
142-
143- return err
190+ return & services {
191+ evmStore : evmStore ,
192+ tokenService : token .NewTokenService (cfg .Token , tokenDataProvider , userStore , cantonClient .Token ),
193+ regSvc : userservice .NewLog (registrationService , logger ),
194+ transferSvc : transfer .NewLog (transfer .NewTransferService (cantonClient .Token , userStore , transferCache , tokenSymbols (cfg .Token )), logger ),
195+ }, nil
144196}
145197
146198func (s * Server ) getMasterKey () ([]byte , error ) {
0 commit comments