46 lines
988 B
Go
46 lines
988 B
Go
package bridge
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
type Aggregator struct {
|
|
providers []Provider
|
|
}
|
|
|
|
func NewAggregator(cfg *Config) *Aggregator {
|
|
if cfg == nil {
|
|
cfg = DefaultConfig()
|
|
}
|
|
return &Aggregator{
|
|
providers: []Provider{
|
|
NewLiFiProvider(cfg), NewSocketProvider(), NewSquidProvider(cfg),
|
|
NewSymbiosisProvider(), NewRelayProvider(), NewStargateProvider(),
|
|
NewCCIPProvider(cfg), NewHopProvider(),
|
|
},
|
|
}
|
|
}
|
|
|
|
func (a *Aggregator) GetBestQuote(ctx context.Context, req *BridgeRequest) (*BridgeQuote, error) {
|
|
var bestQuote *BridgeQuote
|
|
var bestAmount string
|
|
for _, provider := range a.providers {
|
|
if !provider.SupportsRoute(req.FromChain, req.ToChain) {
|
|
continue
|
|
}
|
|
quote, err := provider.GetQuote(ctx, req)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
if bestQuote == nil || quote.ToAmount > bestAmount {
|
|
bestQuote = quote
|
|
bestAmount = quote.ToAmount
|
|
}
|
|
}
|
|
if bestQuote == nil {
|
|
return nil, fmt.Errorf("no bridge quotes available")
|
|
}
|
|
return bestQuote, nil
|
|
}
|