@@ -5,7 +5,7 @@ package upgradecmd
5
5
import (
6
6
"encoding/json"
7
7
"fmt"
8
- "math/big "
8
+ "os "
9
9
"time"
10
10
11
11
"github.com/ava-labs/avalanche-cli/pkg/cobrautils"
@@ -17,8 +17,6 @@ import (
17
17
"github.com/ava-labs/avalanche-cli/pkg/vm"
18
18
avalancheSDK "github.com/ava-labs/avalanche-cli/sdk/vm"
19
19
"github.com/ava-labs/avalanchego/utils/logging"
20
- "github.com/ava-labs/avalanchego/utils/units"
21
- "github.com/ava-labs/coreth/ethclient"
22
20
"github.com/ava-labs/subnet-evm/commontype"
23
21
"github.com/ava-labs/subnet-evm/params"
24
22
"github.com/ava-labs/subnet-evm/precompile/contracts/deployerallowlist"
@@ -30,7 +28,6 @@ import (
30
28
"github.com/ethereum/go-ethereum/common"
31
29
"github.com/ethereum/go-ethereum/common/math"
32
30
"github.com/spf13/cobra"
33
- "go.uber.org/zap"
34
31
)
35
32
36
33
const (
@@ -47,8 +44,6 @@ const (
47
44
RewardManager = "Customize Fees Distribution"
48
45
)
49
46
50
- var blockchainName string
51
-
52
47
// avalanche blockchain upgrade generate
53
48
func newUpgradeGenerateCmd () * cobra.Command {
54
49
cmd := & cobra.Command {
@@ -63,7 +58,7 @@ guides the user through the process using an interactive wizard.`,
63
58
}
64
59
65
60
func upgradeGenerateCmd (_ * cobra.Command , args []string ) error {
66
- blockchainName = args [0 ]
61
+ blockchainName : = args [0 ]
67
62
if ! app .GenesisExists (blockchainName ) {
68
63
ux .Logger .PrintToUser ("The provided blockchain name %q does not exist" , blockchainName )
69
64
return nil
@@ -118,8 +113,8 @@ func upgradeGenerateCmd(_ *cobra.Command, args []string) error {
118
113
return err
119
114
}
120
115
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 {
123
118
return err
124
119
} else if cancelled {
125
120
continue
@@ -143,12 +138,47 @@ func upgradeGenerateCmd(_ *cobra.Command, args []string) error {
143
138
}
144
139
}
145
140
146
- jsonBytes , err := json .Marshal (& precompiles )
141
+ upgradeBytes , err := json .Marshal (& precompiles )
147
142
if err != nil {
148
143
return err
149
144
}
150
145
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 )
152
182
}
153
183
154
184
func queryActivationTimestamp () (time.Time , error ) {
@@ -189,7 +219,7 @@ func queryActivationTimestamp() (time.Time, error) {
189
219
return date , nil
190
220
}
191
221
192
- func promptParams (precomp string , precompiles * []params.PrecompileUpgrade ) (bool , error ) {
222
+ func promptParams (blockchainName string , precomp string , precompiles * []params.PrecompileUpgrade ) (bool , error ) {
193
223
sc , err := app .LoadSidecar (blockchainName )
194
224
if err != nil {
195
225
return false , err
@@ -529,71 +559,6 @@ func promptTxAllowListParams(
529
559
return false , nil
530
560
}
531
561
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
-
597
562
func promptAdminManagerAndEnabledAddresses (
598
563
sc * models.Sidecar ,
599
564
action string ,
@@ -602,11 +567,5 @@ func promptAdminManagerAndEnabledAddresses(
602
567
if cancelled || err != nil {
603
568
return nil , nil , nil , cancelled , err
604
569
}
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
- }
611
570
return allowList .AdminAddresses , allowList .ManagerAddresses , allowList .EnabledAddresses , false , nil
612
571
}
0 commit comments