-
Notifications
You must be signed in to change notification settings - Fork 0
/
compatibility.go
93 lines (75 loc) · 2.45 KB
/
compatibility.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright (C) 2022, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package vm
import (
"encoding/json"
"errors"
"strconv"
"github.com/lasthyphen/dijets-cli/pkg/application"
"github.com/lasthyphen/dijets-cli/pkg/binutils"
"github.com/lasthyphen/dijets-cli/pkg/constants"
"github.com/lasthyphen/dijets-cli/pkg/models"
"golang.org/x/mod/semver"
)
var ErrNoAvagoVersion = errors.New("unable to find a compatible dijetsnode version")
func GetRPCProtocolVersion(app *application.Avalanche, vmType models.VMType, vmVersion string) (int, error) {
var url string
switch vmType {
case models.SubnetEvm:
url = constants.SubnetEVMRPCCompatibilityURL
case models.SpacesVM:
url = constants.SpacesVMRPCCompatibilityURL
default:
return 0, errors.New("unknown VM type")
}
compatibilityBytes, err := app.Downloader.Download(url)
if err != nil {
return 0, err
}
var parsedCompat models.VMCompatibility
if err = json.Unmarshal(compatibilityBytes, &parsedCompat); err != nil {
return 0, err
}
version, ok := parsedCompat.RPCChainVMProtocolVersion[vmVersion]
if !ok {
return 0, errors.New("no RPC version found")
}
return version, nil
}
func GetLatestAvalancheGoByProtocolVersion(app *application.Avalanche, rpcVersion int, url string) (string, error) {
compatibilityBytes, err := app.Downloader.Download(url)
if err != nil {
return "", err
}
var parsedCompat models.AvagoCompatiblity
if err = json.Unmarshal(compatibilityBytes, &parsedCompat); err != nil {
return "", err
}
eligibleVersions, ok := parsedCompat[strconv.Itoa(rpcVersion)]
if !ok {
return "", ErrNoAvagoVersion
}
// versions are not necessarily sorted, so we need to sort them, tho this puts them in ascending order
semver.Sort(eligibleVersions)
// get latest avago release to make sure we're not picking a release currently in progress but not available for download
latestAvagoVersion, err := app.Downloader.GetLatestReleaseVersion(binutils.GetGithubLatestReleaseURL(
constants.AvaLabsOrg,
constants.AvalancheGoRepoName,
))
if err != nil {
return "", err
}
// we need to iterate in reverse order to start with latest version
var useVersion string
for i := len(eligibleVersions) - 1; i >= 0; i-- {
versionComparison := semver.Compare(eligibleVersions[i], latestAvagoVersion)
if versionComparison != 1 {
useVersion = eligibleVersions[i]
break
}
}
if useVersion == "" {
return "", ErrNoAvagoVersion
}
return useVersion, nil
}