forked from miraclesu/uniswap-sdk-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
route.go
74 lines (63 loc) · 1.59 KB
/
route.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package entities
import (
"fmt"
"github.com/liweimin90/uniswap-sdk-golang/constants"
)
var (
ErrInvalidPairs = fmt.Errorf("invalid pairs")
ErrInvalidPairsChainIDs = fmt.Errorf("invalid pairs chainIDs")
ErrInvalidInput = fmt.Errorf("invalid token input")
ErrInvalidOutput = fmt.Errorf("invalid token output")
ErrInvalidPath = fmt.Errorf("invalid pairs for path")
)
type Route struct {
Pairs []*Pair
Path []*Token
Input *Token
Output *Token
MidPrice *Price
}
func NewRoute(pairs []*Pair, input, output *Token) (*Route, error) {
if len(pairs) == 0 {
return nil, ErrInvalidPairs
}
for i := range pairs {
if pairs[i].ChainID() != pairs[0].ChainID() {
return nil, ErrInvalidPairsChainIDs
}
}
if !pairs[0].InvolvesToken(input) {
return nil, ErrInvalidInput
}
if !(output == nil || pairs[len(pairs)-1].InvolvesToken(output)) {
return nil, ErrInvalidOutput
}
path := make([]*Token, len(pairs)+1)
path[0] = input
for i := range pairs {
currentInput := path[i]
if !(currentInput.Equals(pairs[i].Token0()) || currentInput.Equals(pairs[i].Token1())) {
return nil, ErrInvalidPath
}
currentOutput := pairs[i].Token0()
if currentInput.Equals(pairs[i].Token0()) {
currentOutput = pairs[i].Token1()
}
path[i+1] = currentOutput
}
if output == nil {
output = path[len(pairs)]
}
route := &Route{
Pairs: pairs,
Path: path,
Input: input,
Output: output,
}
var err error
route.MidPrice, err = NewPriceFromRoute(route)
return route, err
}
func (r *Route) ChainID() constants.ChainID {
return r.Pairs[0].ChainID()
}