Skip to content

Commit ff59daa

Browse files
authored
Make upgradecmd to work (#2764)
* make upgrade to work * missing file * make import to rename current upgrade * staff automatically being updated * nit * nit
1 parent 9194d3c commit ff59daa

File tree

17 files changed

+513
-238
lines changed

17 files changed

+513
-238
lines changed

cmd/blockchaincmd/configure.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"path/filepath"
99
"strings"
1010

11+
"github.com/ava-labs/avalanche-cli/cmd/blockchaincmd/upgradecmd"
1112
"github.com/ava-labs/avalanche-cli/pkg/cobrautils"
1213
"github.com/ava-labs/avalanche-cli/pkg/constants"
1314
"github.com/ava-labs/avalanche-cli/pkg/utils"
@@ -118,6 +119,8 @@ func configure(_ *cobra.Command, args []string) error {
118119
}
119120
}
120121

122+
upgradecmd.PrintHowToApplyConfChangesMessage(blockchainName)
123+
121124
return nil
122125
}
123126

cmd/blockchaincmd/convert.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fmt"
88
"math/big"
99
"os"
10-
"strings"
1110
"time"
1211

1312
"github.com/ava-labs/avalanche-cli/pkg/dependencies"
@@ -126,8 +125,7 @@ func StartLocalMachine(
126125
if network.Kind == models.Local {
127126
useLocalMachine = true
128127
}
129-
networkNameComponent := strings.ReplaceAll(strings.ToLower(network.Name()), " ", "-")
130-
clusterName := fmt.Sprintf("%s-local-node-%s", blockchainName, networkNameComponent)
128+
clusterName := localnet.LocalClusterName(network, blockchainName)
131129
if clusterNameFlagValue != "" {
132130
clusterName = clusterNameFlagValue
133131
if localnet.LocalClusterExists(app, clusterName) {
@@ -209,12 +207,6 @@ func StartLocalMachine(
209207
return false, err
210208
}
211209
nodeConfig := map[string]interface{}{}
212-
if app.AvagoNodeConfigExists(blockchainName) {
213-
nodeConfig, err = utils.ReadJSON(app.GetAvagoNodeConfigPath(blockchainName))
214-
if err != nil {
215-
return false, err
216-
}
217-
}
218210
if partialSync {
219211
nodeConfig[config.PartialSyncPrimaryNetworkKey] = true
220212
}

cmd/blockchaincmd/deploy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,7 @@ func deployBlockchain(cmd *cobra.Command, args []string) error {
935935
AllowPrivateIPs: relayerAllowPrivateIPs,
936936
}
937937
if network.Kind == models.Local {
938-
blockchains, err := localnet.GetLocalNetworkBlockchainInfo(app)
938+
blockchains, err := localnet.GetLocalNetworkBlockchainsInfo(app)
939939
if err != nil {
940940
return err
941941
}

cmd/blockchaincmd/upgradecmd/generate.go

Lines changed: 42 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package upgradecmd
55
import (
66
"encoding/json"
77
"fmt"
8-
"math/big"
8+
"os"
99
"time"
1010

1111
"github.com/ava-labs/avalanche-cli/pkg/cobrautils"
@@ -17,8 +17,6 @@ import (
1717
"github.com/ava-labs/avalanche-cli/pkg/vm"
1818
avalancheSDK "github.com/ava-labs/avalanche-cli/sdk/vm"
1919
"github.com/ava-labs/avalanchego/utils/logging"
20-
"github.com/ava-labs/avalanchego/utils/units"
21-
"github.com/ava-labs/coreth/ethclient"
2220
"github.com/ava-labs/subnet-evm/commontype"
2321
"github.com/ava-labs/subnet-evm/params"
2422
"github.com/ava-labs/subnet-evm/precompile/contracts/deployerallowlist"
@@ -30,7 +28,6 @@ import (
3028
"github.com/ethereum/go-ethereum/common"
3129
"github.com/ethereum/go-ethereum/common/math"
3230
"github.com/spf13/cobra"
33-
"go.uber.org/zap"
3431
)
3532

3633
const (
@@ -47,8 +44,6 @@ const (
4744
RewardManager = "Customize Fees Distribution"
4845
)
4946

50-
var blockchainName string
51-
5247
// avalanche blockchain upgrade generate
5348
func newUpgradeGenerateCmd() *cobra.Command {
5449
cmd := &cobra.Command{
@@ -63,7 +58,7 @@ guides the user through the process using an interactive wizard.`,
6358
}
6459

6560
func upgradeGenerateCmd(_ *cobra.Command, args []string) error {
66-
blockchainName = args[0]
61+
blockchainName := args[0]
6762
if !app.GenesisExists(blockchainName) {
6863
ux.Logger.PrintToUser("The provided blockchain name %q does not exist", blockchainName)
6964
return nil
@@ -118,8 +113,8 @@ func upgradeGenerateCmd(_ *cobra.Command, args []string) error {
118113
return err
119114
}
120115

121-
ux.Logger.PrintToUser(fmt.Sprintf("Set parameters for the %q precompile", precomp))
122-
if cancelled, err := promptParams(precomp, &precompiles.PrecompileUpgrades); err != nil {
116+
ux.Logger.PrintToUser("Set parameters for the %q precompile", precomp)
117+
if cancelled, err := promptParams(blockchainName, precomp, &precompiles.PrecompileUpgrades); err != nil {
123118
return err
124119
} else if cancelled {
125120
continue
@@ -143,12 +138,47 @@ func upgradeGenerateCmd(_ *cobra.Command, args []string) error {
143138
}
144139
}
145140

146-
jsonBytes, err := json.Marshal(&precompiles)
141+
upgradeBytes, err := json.Marshal(&precompiles)
147142
if err != nil {
148143
return err
149144
}
150145

151-
return app.WriteUpgradeFile(blockchainName, jsonBytes)
146+
return writeUpgrade(blockchainName, upgradeBytes)
147+
}
148+
149+
func writeUpgrade(blockchainName string, upgradeBytes []byte) error {
150+
upgradeBytesFilePath := app.GetUpgradeBytesFilePath(blockchainName)
151+
if utils.FileExists(upgradeBytesFilePath) {
152+
timestamp := time.Now().UTC().Format("20060102150405")
153+
renamedUpgradeBytesFilePath := upgradeBytesFilePath + "_" + timestamp
154+
ux.Logger.PrintToUser("")
155+
ux.Logger.PrintToUser("A previous upgrade is found. Renaming it to %s", renamedUpgradeBytesFilePath)
156+
if err := os.Rename(upgradeBytesFilePath, renamedUpgradeBytesFilePath); err != nil {
157+
return err
158+
}
159+
}
160+
ux.Logger.PrintToUser("")
161+
ux.Logger.PrintToUser("Writing upgrade into %s", upgradeBytesFilePath)
162+
if err := app.WriteUpgradeFile(blockchainName, upgradeBytes); err != nil {
163+
return err
164+
}
165+
PrintHowToApplyConfChangesMessage(blockchainName)
166+
return nil
167+
}
168+
169+
func PrintHowToApplyConfChangesMessage(blockchainName string) {
170+
ux.Logger.PrintToUser("")
171+
ux.Logger.PrintToUser("To apply the change on Local Network:")
172+
ux.Logger.PrintToUser(" avalanche network stop")
173+
ux.Logger.PrintToUser(" avalanche network start")
174+
ux.Logger.PrintToUser("")
175+
ux.Logger.PrintToUser("To apply the change to local validators on Fuji:")
176+
ux.Logger.PrintToUser(" avalanche node local stop %s-local-node-fuji", blockchainName)
177+
ux.Logger.PrintToUser(" avalanche node local start %s-local-start-fuji", blockchainName)
178+
ux.Logger.PrintToUser("")
179+
ux.Logger.PrintToUser("To apply the change to local validators on Mainnet:")
180+
ux.Logger.PrintToUser(" avalanche node local stop %s-local-node-mainnet", blockchainName)
181+
ux.Logger.PrintToUser(" avalanche node local start %s-local-start-mainnet", blockchainName)
152182
}
153183

154184
func queryActivationTimestamp() (time.Time, error) {
@@ -189,7 +219,7 @@ func queryActivationTimestamp() (time.Time, error) {
189219
return date, nil
190220
}
191221

192-
func promptParams(precomp string, precompiles *[]params.PrecompileUpgrade) (bool, error) {
222+
func promptParams(blockchainName string, precomp string, precompiles *[]params.PrecompileUpgrade) (bool, error) {
193223
sc, err := app.LoadSidecar(blockchainName)
194224
if err != nil {
195225
return false, err
@@ -529,71 +559,6 @@ func promptTxAllowListParams(
529559
return false, nil
530560
}
531561

532-
func getCClient(apiEndpoint string, blockchainID string) (ethclient.Client, error) {
533-
cClient, err := ethclient.Dial(fmt.Sprintf("%s/ext/bc/%s/rpc", apiEndpoint, blockchainID))
534-
if err != nil {
535-
return nil, err
536-
}
537-
return cClient, nil
538-
}
539-
540-
func ensureHaveBalanceLocalNetwork(which string, addresses []common.Address, blockchainID string) error {
541-
cClient, err := getCClient(constants.LocalAPIEndpoint, blockchainID)
542-
if err != nil {
543-
return err
544-
}
545-
for _, address := range addresses {
546-
// we can break at the first address who has a non-zero balance
547-
accountBalance, err := getAccountBalance(cClient, address.String())
548-
if err != nil {
549-
return err
550-
}
551-
if accountBalance > float64(0) {
552-
return nil
553-
}
554-
}
555-
return fmt.Errorf("at least one of the %s addresses requires a positive token balance", which)
556-
}
557-
558-
func ensureHaveBalance(
559-
sc *models.Sidecar,
560-
which string,
561-
addresses []common.Address,
562-
) error {
563-
if len(addresses) < 1 {
564-
return nil
565-
}
566-
switch sc.VM {
567-
case models.SubnetEvm:
568-
// Currently only checking if admins have balance for subnets deployed in Local Network
569-
if networkData, ok := sc.Networks["Local Network"]; ok {
570-
blockchainID := networkData.BlockchainID.String()
571-
if err := ensureHaveBalanceLocalNetwork(which, addresses, blockchainID); err != nil {
572-
return err
573-
}
574-
}
575-
default:
576-
app.Log.Warn("Unsupported VM type", zap.Any("vm-type", sc.VM))
577-
}
578-
return nil
579-
}
580-
581-
func getAccountBalance(cClient ethclient.Client, addrStr string) (float64, error) {
582-
addr := common.HexToAddress(addrStr)
583-
ctx, cancel := utils.GetAPIContext()
584-
balance, err := cClient.BalanceAt(ctx, addr, nil)
585-
defer cancel()
586-
if err != nil {
587-
return 0, err
588-
}
589-
// convert to nAvax
590-
balance = balance.Div(balance, big.NewInt(int64(units.Avax)))
591-
if balance.Cmp(big.NewInt(0)) == 0 {
592-
return 0, nil
593-
}
594-
return float64(balance.Uint64()) / float64(units.Avax), nil
595-
}
596-
597562
func promptAdminManagerAndEnabledAddresses(
598563
sc *models.Sidecar,
599564
action string,
@@ -602,11 +567,5 @@ func promptAdminManagerAndEnabledAddresses(
602567
if cancelled || err != nil {
603568
return nil, nil, nil, cancelled, err
604569
}
605-
if err := ensureHaveBalance(sc, adminLabel, allowList.AdminAddresses); err != nil {
606-
return nil, nil, nil, false, err
607-
}
608-
if err := ensureHaveBalance(sc, managerLabel, allowList.ManagerAddresses); err != nil {
609-
return nil, nil, nil, false, err
610-
}
611570
return allowList.AdminAddresses, allowList.ManagerAddresses, allowList.EnabledAddresses, false, nil
612571
}

cmd/blockchaincmd/upgradecmd/import.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ func upgradeImportCmd(_ *cobra.Command, args []string) error {
5252
return err
5353
}
5454

55-
fileBytes, err := os.ReadFile(upgradeBytesFilePath)
55+
upgradeBytes, err := os.ReadFile(upgradeBytesFilePath)
5656
if err != nil {
5757
return fmt.Errorf("failed to read the provided upgrade file: %w", err)
5858
}
5959

60-
return app.WriteUpgradeFile(blockchainName, fileBytes)
60+
return writeUpgrade(blockchainName, upgradeBytes)
6161
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright (C) 2022, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
package upgradecmd
4+
5+
import (
6+
"fmt"
7+
"math/big"
8+
9+
"github.com/ava-labs/avalanche-cli/pkg/constants"
10+
"github.com/ava-labs/avalanche-cli/pkg/models"
11+
"github.com/ava-labs/avalanche-cli/pkg/utils"
12+
"github.com/ava-labs/avalanchego/utils/units"
13+
"github.com/ava-labs/coreth/ethclient"
14+
"github.com/ethereum/go-ethereum/common"
15+
"go.uber.org/zap"
16+
)
17+
18+
func getCClient(apiEndpoint string, blockchainID string) (ethclient.Client, error) {
19+
cClient, err := ethclient.Dial(fmt.Sprintf("%s/ext/bc/%s/rpc", apiEndpoint, blockchainID))
20+
if err != nil {
21+
return nil, err
22+
}
23+
return cClient, nil
24+
}
25+
26+
func ensureHaveBalanceLocalNetwork(which string, addresses []common.Address, blockchainID string) error {
27+
cClient, err := getCClient(constants.LocalAPIEndpoint, blockchainID)
28+
if err != nil {
29+
return err
30+
}
31+
for _, address := range addresses {
32+
// we can break at the first address who has a non-zero balance
33+
accountBalance, err := getAccountBalance(cClient, address.String())
34+
if err != nil {
35+
return err
36+
}
37+
if accountBalance > float64(0) {
38+
return nil
39+
}
40+
}
41+
return fmt.Errorf("at least one of the %s addresses requires a positive token balance", which)
42+
}
43+
44+
func ensureHaveBalance(
45+
sc *models.Sidecar,
46+
which string,
47+
addresses []common.Address,
48+
) error {
49+
if len(addresses) < 1 {
50+
return nil
51+
}
52+
switch sc.VM {
53+
case models.SubnetEvm:
54+
// Currently only checking if admins have balance for subnets deployed in Local Network
55+
if networkData, ok := sc.Networks["Local Network"]; ok {
56+
blockchainID := networkData.BlockchainID.String()
57+
if err := ensureHaveBalanceLocalNetwork(which, addresses, blockchainID); err != nil {
58+
return err
59+
}
60+
}
61+
default:
62+
app.Log.Warn("Unsupported VM type", zap.Any("vm-type", sc.VM))
63+
}
64+
return nil
65+
}
66+
67+
func getAccountBalance(cClient ethclient.Client, addrStr string) (float64, error) {
68+
addr := common.HexToAddress(addrStr)
69+
ctx, cancel := utils.GetAPIContext()
70+
balance, err := cClient.BalanceAt(ctx, addr, nil)
71+
defer cancel()
72+
if err != nil {
73+
return 0, err
74+
}
75+
// convert to nAvax
76+
balance = balance.Div(balance, big.NewInt(int64(units.Avax)))
77+
if balance.Cmp(big.NewInt(0)) == 0 {
78+
return 0, nil
79+
}
80+
return float64(balance.Uint64()) / float64(units.Avax), nil
81+
}

0 commit comments

Comments
 (0)