2020-11-19 03:53:19 -08:00
|
|
|
package guardiand
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2021-09-30 11:57:44 -07:00
|
|
|
"github.com/tendermint/tendermint/libs/rand"
|
2020-11-19 03:53:19 -08:00
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"google.golang.org/protobuf/encoding/prototext"
|
|
|
|
|
2021-08-26 01:35:09 -07:00
|
|
|
"github.com/certusone/wormhole/node/pkg/devnet"
|
|
|
|
nodev1 "github.com/certusone/wormhole/node/pkg/proto/node/v1"
|
2020-11-19 03:53:19 -08:00
|
|
|
)
|
|
|
|
|
2021-01-19 04:01:45 -08:00
|
|
|
var setUpdateNumGuardians *int
|
2020-11-19 03:53:19 -08:00
|
|
|
var templateGuardianIndex *int
|
|
|
|
|
|
|
|
func init() {
|
2021-01-19 04:01:45 -08:00
|
|
|
templateGuardianIndex = TemplateCmd.PersistentFlags().Int("idx", 0, "Default current guardian set index")
|
|
|
|
setUpdateNumGuardians = AdminClientGuardianSetTemplateCmd.Flags().Int("num", 1, "Number of devnet guardians in example file")
|
|
|
|
|
|
|
|
TemplateCmd.AddCommand(AdminClientGuardianSetTemplateCmd)
|
|
|
|
TemplateCmd.AddCommand(AdminClientContractUpgradeTemplateCmd)
|
2021-09-30 11:57:44 -07:00
|
|
|
TemplateCmd.AddCommand(AdminClientTokenBridgeRegisterChainCmd)
|
2021-01-19 04:01:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
var TemplateCmd = &cobra.Command{
|
|
|
|
Use: "template",
|
|
|
|
Short: "Guardian governance VAA template commands ",
|
2020-11-19 03:53:19 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
var AdminClientGuardianSetTemplateCmd = &cobra.Command{
|
2021-01-20 15:01:34 -08:00
|
|
|
Use: "guardian-set-update [FILENAME]",
|
2020-11-19 03:53:19 -08:00
|
|
|
Short: "Generate an empty guardian set template at specified path (offline)",
|
|
|
|
Run: runGuardianSetTemplate,
|
|
|
|
Args: cobra.ExactArgs(1),
|
|
|
|
}
|
|
|
|
|
2021-01-19 04:01:45 -08:00
|
|
|
var AdminClientContractUpgradeTemplateCmd = &cobra.Command{
|
2021-01-20 15:01:34 -08:00
|
|
|
Use: "contract-upgrade [FILENAME]",
|
2021-01-19 04:01:45 -08:00
|
|
|
Short: "Generate an empty contract upgrade template at specified path (offline)",
|
|
|
|
Run: runContractUpgradeTemplate,
|
|
|
|
Args: cobra.ExactArgs(1),
|
|
|
|
}
|
|
|
|
|
2021-09-30 11:57:44 -07:00
|
|
|
var AdminClientTokenBridgeRegisterChainCmd = &cobra.Command{
|
|
|
|
Use: "token-bridge-register-chain [FILENAME]",
|
|
|
|
Short: "Generate an empty token bridge chain registration template at specified path (offline)",
|
|
|
|
Run: runTokenBridgeRegisterChainTemplate,
|
|
|
|
Args: cobra.ExactArgs(1),
|
|
|
|
}
|
|
|
|
|
2020-11-19 03:53:19 -08:00
|
|
|
func runGuardianSetTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
path := args[0]
|
|
|
|
|
|
|
|
// Use deterministic devnet addresses as examples in the template, such that this doubles as a test fixture.
|
2021-01-19 04:01:45 -08:00
|
|
|
guardians := make([]*nodev1.GuardianSetUpdate_Guardian, *setUpdateNumGuardians)
|
|
|
|
for i := 0; i < *setUpdateNumGuardians; i++ {
|
2020-11-19 03:53:19 -08:00
|
|
|
k := devnet.DeterministicEcdsaKeyByIndex(crypto.S256(), uint64(i))
|
|
|
|
guardians[i] = &nodev1.GuardianSetUpdate_Guardian{
|
|
|
|
Pubkey: crypto.PubkeyToAddress(k.PublicKey).Hex(),
|
|
|
|
Name: fmt.Sprintf("Example validator %d", i),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-19 04:01:45 -08:00
|
|
|
m := &nodev1.InjectGovernanceVAARequest{
|
|
|
|
CurrentSetIndex: uint32(*templateGuardianIndex),
|
2021-09-30 11:57:44 -07:00
|
|
|
Sequence: 1234,
|
|
|
|
Nonce: rand.Uint32(),
|
2021-01-19 04:01:45 -08:00
|
|
|
Payload: &nodev1.InjectGovernanceVAARequest_GuardianSet{
|
|
|
|
GuardianSet: &nodev1.GuardianSetUpdate{Guardians: guardians},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ioutil.WriteFile(path, b, 0640)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func runContractUpgradeTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
path := args[0]
|
|
|
|
|
|
|
|
m := &nodev1.InjectGovernanceVAARequest{
|
2020-11-19 03:53:19 -08:00
|
|
|
CurrentSetIndex: uint32(*templateGuardianIndex),
|
2021-09-30 11:57:44 -07:00
|
|
|
Sequence: 1234,
|
|
|
|
Nonce: rand.Uint32(),
|
2021-01-19 04:01:45 -08:00
|
|
|
Payload: &nodev1.InjectGovernanceVAARequest_ContractUpgrade{
|
|
|
|
ContractUpgrade: &nodev1.ContractUpgrade{
|
|
|
|
ChainId: 1,
|
|
|
|
NewContract: make([]byte, 32),
|
|
|
|
},
|
|
|
|
},
|
2020-11-19 03:53:19 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ioutil.WriteFile(path, b, 0640)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
2021-09-30 11:57:44 -07:00
|
|
|
func runTokenBridgeRegisterChainTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
path := args[0]
|
|
|
|
|
|
|
|
m := &nodev1.InjectGovernanceVAARequest{
|
|
|
|
CurrentSetIndex: uint32(*templateGuardianIndex),
|
|
|
|
Sequence: rand.Uint64(),
|
|
|
|
Nonce: rand.Uint32(),
|
|
|
|
Payload: &nodev1.InjectGovernanceVAARequest_TokenBridgeRegisterChain{
|
|
|
|
TokenBridgeRegisterChain: &nodev1.TokenBridgeRegisterChain{
|
|
|
|
ChainId: 5,
|
|
|
|
EmitterAddress: "0000000000000000000000000290FB167208Af455bB137780163b7B7a9a10C16",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ioutil.WriteFile(path, b, 0640)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|