2020-11-19 03:53:19 -08:00
|
|
|
package guardiand
|
|
|
|
|
|
|
|
import (
|
2021-10-29 08:17:11 -07:00
|
|
|
"encoding/hex"
|
2020-11-19 03:53:19 -08:00
|
|
|
"fmt"
|
2021-10-29 08:17:11 -07:00
|
|
|
"github.com/btcsuite/btcutil/bech32"
|
|
|
|
"github.com/certusone/wormhole/node/pkg/vaa"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/mr-tron/base58"
|
|
|
|
"github.com/spf13/pflag"
|
2021-09-30 11:57:44 -07:00
|
|
|
"github.com/tendermint/tendermint/libs/rand"
|
2020-11-19 03:53:19 -08:00
|
|
|
"log"
|
2021-10-29 08:17:11 -07:00
|
|
|
"strconv"
|
|
|
|
"strings"
|
2020-11-19 03:53:19 -08:00
|
|
|
|
|
|
|
"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
|
2021-10-29 08:17:11 -07:00
|
|
|
var chainID *string
|
|
|
|
var address *string
|
|
|
|
var module *string
|
2020-11-19 03:53:19 -08:00
|
|
|
|
|
|
|
func init() {
|
2021-10-29 08:17:11 -07:00
|
|
|
governanceFlagSet := pflag.NewFlagSet("governance", pflag.ExitOnError)
|
|
|
|
chainID = governanceFlagSet.String("chain-id", "", "Chain ID")
|
|
|
|
address = governanceFlagSet.String("new-address", "", "New address (hex, base58 or bech32)")
|
|
|
|
|
|
|
|
moduleFlagSet := pflag.NewFlagSet("module", pflag.ExitOnError)
|
|
|
|
module = moduleFlagSet.String("module", "", "Module name")
|
|
|
|
|
2021-10-29 09:52:12 -07:00
|
|
|
templateGuardianIndex = TemplateCmd.PersistentFlags().Int("idx", 1, "Default current guardian set index")
|
2021-10-29 08:17:11 -07:00
|
|
|
|
2021-01-19 04:01:45 -08:00
|
|
|
setUpdateNumGuardians = AdminClientGuardianSetTemplateCmd.Flags().Int("num", 1, "Number of devnet guardians in example file")
|
2022-03-15 23:36:36 -07:00
|
|
|
TemplateCmd.AddCommand(AdminClientGuardianSetTemplateCmd)
|
2021-01-19 04:01:45 -08:00
|
|
|
|
2021-10-29 08:17:11 -07:00
|
|
|
AdminClientContractUpgradeTemplateCmd.Flags().AddFlagSet(governanceFlagSet)
|
2021-01-19 04:01:45 -08:00
|
|
|
TemplateCmd.AddCommand(AdminClientContractUpgradeTemplateCmd)
|
2021-10-29 08:17:11 -07:00
|
|
|
|
|
|
|
AdminClientTokenBridgeRegisterChainCmd.Flags().AddFlagSet(governanceFlagSet)
|
|
|
|
AdminClientTokenBridgeRegisterChainCmd.Flags().AddFlagSet(moduleFlagSet)
|
2021-09-30 11:57:44 -07:00
|
|
|
TemplateCmd.AddCommand(AdminClientTokenBridgeRegisterChainCmd)
|
2021-10-29 08:17:11 -07:00
|
|
|
|
|
|
|
AdminClientTokenBridgeUpgradeContractCmd.Flags().AddFlagSet(governanceFlagSet)
|
|
|
|
AdminClientTokenBridgeUpgradeContractCmd.Flags().AddFlagSet(moduleFlagSet)
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
TemplateCmd.AddCommand(AdminClientTokenBridgeUpgradeContractCmd)
|
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-10-29 08:17:11 -07:00
|
|
|
Use: "guardian-set-update",
|
|
|
|
Short: "Generate an empty guardian set template",
|
2020-11-19 03:53:19 -08:00
|
|
|
Run: runGuardianSetTemplate,
|
|
|
|
}
|
|
|
|
|
2021-01-19 04:01:45 -08:00
|
|
|
var AdminClientContractUpgradeTemplateCmd = &cobra.Command{
|
2021-10-29 08:17:11 -07:00
|
|
|
Use: "contract-upgrade",
|
|
|
|
Short: "Generate an empty contract upgrade template",
|
2021-01-19 04:01:45 -08:00
|
|
|
Run: runContractUpgradeTemplate,
|
|
|
|
}
|
|
|
|
|
2021-09-30 11:57:44 -07:00
|
|
|
var AdminClientTokenBridgeRegisterChainCmd = &cobra.Command{
|
2021-10-29 08:17:11 -07:00
|
|
|
Use: "token-bridge-register-chain",
|
|
|
|
Short: "Generate an empty token bridge chain registration template at specified path",
|
2021-09-30 11:57:44 -07:00
|
|
|
Run: runTokenBridgeRegisterChainTemplate,
|
|
|
|
}
|
|
|
|
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
var AdminClientTokenBridgeUpgradeContractCmd = &cobra.Command{
|
2021-10-29 08:17:11 -07:00
|
|
|
Use: "token-bridge-upgrade-contract",
|
|
|
|
Short: "Generate an empty token bridge contract upgrade template at specified path",
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
Run: runTokenBridgeUpgradeContractTemplate,
|
|
|
|
}
|
|
|
|
|
2020-11-19 03:53:19 -08:00
|
|
|
func runGuardianSetTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
// 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-10-29 08:50:46 -07:00
|
|
|
Messages: []*nodev1.GovernanceMessage{
|
|
|
|
{
|
|
|
|
Sequence: rand.Uint64(),
|
|
|
|
Nonce: rand.Uint32(),
|
|
|
|
Payload: &nodev1.GovernanceMessage_GuardianSet{
|
|
|
|
GuardianSet: &nodev1.GuardianSetUpdate{Guardians: guardians},
|
|
|
|
},
|
|
|
|
},
|
2021-01-19 04:01:45 -08:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-10-29 08:17:11 -07:00
|
|
|
fmt.Print(string(b))
|
|
|
|
}
|
2021-01-19 04:01:45 -08:00
|
|
|
|
2021-10-29 08:17:11 -07:00
|
|
|
func runContractUpgradeTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
address, err := parseAddress(*address)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
chainID, err := parseChainID(*chainID)
|
2021-01-19 04:01:45 -08:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
m := &nodev1.InjectGovernanceVAARequest{
|
2020-11-19 03:53:19 -08:00
|
|
|
CurrentSetIndex: uint32(*templateGuardianIndex),
|
2021-10-29 08:50:46 -07:00
|
|
|
Messages: []*nodev1.GovernanceMessage{
|
|
|
|
{
|
|
|
|
Sequence: rand.Uint64(),
|
|
|
|
Nonce: rand.Uint32(),
|
|
|
|
Payload: &nodev1.GovernanceMessage_ContractUpgrade{
|
|
|
|
ContractUpgrade: &nodev1.ContractUpgrade{
|
|
|
|
ChainId: uint32(chainID),
|
|
|
|
NewContract: address,
|
|
|
|
},
|
|
|
|
},
|
2021-01-19 04:01:45 -08:00
|
|
|
},
|
|
|
|
},
|
2020-11-19 03:53:19 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-10-29 08:17:11 -07:00
|
|
|
fmt.Print(string(b))
|
|
|
|
}
|
|
|
|
func runTokenBridgeRegisterChainTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
address, err := parseAddress(*address)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
chainID, err := parseChainID(*chainID)
|
2020-11-19 03:53:19 -08:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2021-09-30 11:57:44 -07:00
|
|
|
|
|
|
|
m := &nodev1.InjectGovernanceVAARequest{
|
|
|
|
CurrentSetIndex: uint32(*templateGuardianIndex),
|
2021-10-29 08:50:46 -07:00
|
|
|
Messages: []*nodev1.GovernanceMessage{
|
|
|
|
{
|
|
|
|
Sequence: rand.Uint64(),
|
|
|
|
Nonce: rand.Uint32(),
|
|
|
|
Payload: &nodev1.GovernanceMessage_BridgeRegisterChain{
|
|
|
|
BridgeRegisterChain: &nodev1.BridgeRegisterChain{
|
|
|
|
Module: *module,
|
|
|
|
ChainId: uint32(chainID),
|
|
|
|
EmitterAddress: address,
|
|
|
|
},
|
|
|
|
},
|
2021-09-30 11:57:44 -07:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-10-29 08:17:11 -07:00
|
|
|
fmt.Print(string(b))
|
|
|
|
}
|
2021-09-30 11:57:44 -07:00
|
|
|
|
2021-10-29 08:17:11 -07:00
|
|
|
func runTokenBridgeUpgradeContractTemplate(cmd *cobra.Command, args []string) {
|
|
|
|
address, err := parseAddress(*address)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
chainID, err := parseChainID(*chainID)
|
2021-09-30 11:57:44 -07:00
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
|
|
|
|
m := &nodev1.InjectGovernanceVAARequest{
|
|
|
|
CurrentSetIndex: uint32(*templateGuardianIndex),
|
2021-10-29 08:50:46 -07:00
|
|
|
Messages: []*nodev1.GovernanceMessage{
|
|
|
|
{
|
|
|
|
Sequence: rand.Uint64(),
|
|
|
|
Nonce: rand.Uint32(),
|
|
|
|
Payload: &nodev1.GovernanceMessage_BridgeContractUpgrade{
|
|
|
|
BridgeContractUpgrade: &nodev1.BridgeUpgradeContract{
|
|
|
|
Module: *module,
|
|
|
|
TargetChainId: uint32(chainID),
|
|
|
|
NewContract: address,
|
|
|
|
},
|
|
|
|
},
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
b, err := prototext.MarshalOptions{Multiline: true}.Marshal(m)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-10-29 08:17:11 -07:00
|
|
|
fmt.Print(string(b))
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseAddress parses either a hex-encoded address and returns
|
|
|
|
// a left-padded 32 byte hex string.
|
|
|
|
func parseAddress(s string) (string, error) {
|
|
|
|
// try base58
|
|
|
|
b, err := base58.Decode(s)
|
|
|
|
if err == nil {
|
|
|
|
return leftPadAddress(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// try bech32
|
|
|
|
_, b, err = bech32.Decode(s)
|
|
|
|
if err == nil {
|
|
|
|
return leftPadAddress(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
// try hex
|
|
|
|
if len(s) > 2 && strings.ToLower(s[:2]) == "0x" {
|
|
|
|
s = s[2:]
|
|
|
|
}
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
|
2021-10-29 08:17:11 -07:00
|
|
|
a, err := hex.DecodeString(s)
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
if err != nil {
|
2021-10-29 08:17:11 -07:00
|
|
|
return "", fmt.Errorf("invalid hex address: %v", err)
|
|
|
|
}
|
|
|
|
return leftPadAddress(a)
|
|
|
|
}
|
|
|
|
|
|
|
|
func leftPadAddress(a []byte) (string, error) {
|
|
|
|
if len(a) > 32 {
|
|
|
|
return "", fmt.Errorf("address longer than 32 bytes")
|
|
|
|
}
|
|
|
|
return hex.EncodeToString(common.LeftPadBytes(a, 32)), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parseChainID parses a human-readable chain name or a chain ID.
|
|
|
|
func parseChainID(name string) (vaa.ChainID, error) {
|
|
|
|
s, err := vaa.ChainIDFromString(name)
|
|
|
|
if err == nil {
|
|
|
|
return s, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// parse as uint32
|
|
|
|
i, err := strconv.ParseUint(name, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
return 0, fmt.Errorf("failed to parse as name or uint32: %v", err)
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
}
|
2021-10-29 08:17:11 -07:00
|
|
|
|
|
|
|
return vaa.ChainID(i), nil
|
node: add BridgeUpgradeContract governance VAA
Example VAA produced by the template:
(*vaa.VAA)(0xc0004f4510)({
Version: (uint8) 1,
GuardianSetIndex: (uint32) 0,
Signatures: ([]*vaa.Signature) (len=1 cap=1) {
(*vaa.Signature)(0xc0003b0370)({
Index: (uint8) 0,
Signature: (vaa.SignatureData) (len=65 cap=65) 0f97ec9093c21ccc4ce544898ed5c21b66ab4c90be894642fbb43474ed9fb48a26d6e12f3397b9fdab160fee64e797d26599a2a9d81a4bf4bc98970b5fa5122501
})
},
Timestamp: (time.Time) 1970-01-01 00:00:00 +0000 UTC,
Nonce: (uint32) 1375049878,
Sequence: (uint64) 3557202656914991802,
ConsistencyLevel: (uint8) 32,
EmitterChain: (vaa.ChainID) solana,
EmitterAddress: (vaa.Address) (len=32 cap=32) 0000000000000000000000000000000000000000000000000000000000000004,
Payload: ([]uint8) (len=67 cap=1000) {
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 54 6f 6b 65 6e 42 72 69 64 67 65 |.....TokenBridge|
00000020 02 00 05 00 00 00 00 00 00 00 00 00 00 00 00 02 |................|
00000030 90 fb 16 72 08 af 45 5b b1 37 78 01 63 b7 b7 a9 |...r..E[.7x.c...|
00000040 a1 0c 16 |...|
}
})
Change-Id: Ibe95db01e1bc0a9c36e1be06920a389db886fdd1
2021-10-08 10:41:43 -07:00
|
|
|
}
|