96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package bridge
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// Provider interface for bridge providers
|
|
type Provider interface {
|
|
GetQuote(ctx context.Context, req *BridgeRequest) (*BridgeQuote, error)
|
|
Name() string
|
|
SupportsRoute(fromChain, toChain int) bool
|
|
}
|
|
|
|
// BridgeRequest represents a bridge request
|
|
type BridgeRequest struct {
|
|
FromChain int
|
|
ToChain int
|
|
FromToken string
|
|
ToToken string
|
|
Amount string
|
|
Recipient string
|
|
}
|
|
|
|
// BridgeQuote represents a bridge quote
|
|
type BridgeQuote struct {
|
|
Provider string
|
|
FromChain int
|
|
ToChain int
|
|
FromAmount string
|
|
ToAmount string
|
|
Fee string
|
|
EstimatedTime string
|
|
Route []BridgeStep
|
|
}
|
|
|
|
// BridgeStep represents a step in bridge route
|
|
type BridgeStep struct {
|
|
Provider string
|
|
From string
|
|
To string
|
|
Type string // "bridge" or "swap"
|
|
}
|
|
|
|
// Aggregator aggregates quotes from multiple bridge providers
|
|
type Aggregator struct {
|
|
providers []Provider
|
|
}
|
|
|
|
// NewAggregator creates a new bridge aggregator with all providers
|
|
func NewAggregator() *Aggregator {
|
|
return &Aggregator{
|
|
providers: []Provider{
|
|
NewLiFiProvider(), // Li.Fi: 40+ chains, swap+bridge aggregation
|
|
NewSocketProvider(), // Socket/Bungee: 40+ chains
|
|
NewSquidProvider(), // Squid: Axelar-based, 50+ chains
|
|
NewSymbiosisProvider(), // Symbiosis: 30+ chains
|
|
NewRelayProvider(), // Relay.link: EVM chains
|
|
NewStargateProvider(), // Stargate: LayerZero
|
|
NewCCIPProvider(), // Chainlink CCIP (138 <-> 1)
|
|
NewHopProvider(), // Hop Protocol (ETH <-> L2)
|
|
},
|
|
}
|
|
}
|
|
|
|
// GetBestQuote gets the best quote from all providers
|
|
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
|
|
}
|
|
|
|
// CCIPProvider is implemented in ccip_provider.go
|
|
// HopProvider is implemented in hop_provider.go
|