github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/cli/bridge/vote-proposal.go (about) 1 package bridge 2 3 import ( 4 "fmt" 5 6 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/contracts/bridge" 7 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/evmtransaction" 8 "github.com/ChainSafe/chainbridge-core/chains/evm/calls/transactor" 9 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/flags" 10 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/initialize" 11 "github.com/ChainSafe/chainbridge-core/chains/evm/cli/logger" 12 "github.com/ChainSafe/chainbridge-core/chains/evm/executor/proposal" 13 "github.com/ChainSafe/chainbridge-core/util" 14 "github.com/ethereum/go-ethereum/common" 15 "github.com/rs/zerolog/log" 16 "github.com/spf13/cobra" 17 ) 18 19 var voteProposalCmd = &cobra.Command{ 20 Use: "vote-proposal", 21 Short: "Vote on proposal", 22 Long: "The vote-proposal subcommand votes on an on-chain proposal. Valid relayer private key required for transaction to be successful.", 23 PreRun: func(cmd *cobra.Command, args []string) { 24 logger.LoggerMetadata(cmd.Name(), cmd.Flags()) 25 }, 26 PersistentPreRunE: func(cmd *cobra.Command, args []string) error { 27 return util.CallPersistentPreRun(cmd, args) 28 }, 29 RunE: func(cmd *cobra.Command, args []string) error { 30 c, err := initialize.InitializeClient(url, senderKeyPair) 31 if err != nil { 32 return err 33 } 34 t, err := initialize.InitializeTransactor(gasPrice, evmtransaction.NewTransaction, c, prepare) 35 if err != nil { 36 return err 37 } 38 return VoteProposalCmd(cmd, args, bridge.NewBridgeContract(c, BridgeAddr, t)) 39 }, 40 Args: func(cmd *cobra.Command, args []string) error { 41 err := ValidateVoteProposalFlags(cmd, args) 42 if err != nil { 43 return err 44 } 45 46 err = ProcessVoteProposalFlags(cmd, args) 47 return err 48 }, 49 } 50 51 func BindVoteProposalCmdFlags(cmd *cobra.Command) { 52 cmd.Flags().StringVar(&Bridge, "bridge", "", "bridge contract address") 53 cmd.Flags().StringVar(&Data, "data", "", "hex proposal metadata") 54 cmd.Flags().Uint8Var(&DomainID, "domain", 0, "origin domain ID of proposal") 55 cmd.Flags().Uint64Var(&DepositNonce, "deposit-nonce", 0, "deposit nonce of proposal to vote on") 56 cmd.Flags().StringVar(&ResourceID, "resource", "", "resource id of asset") 57 flags.MarkFlagsAsRequired(cmd, "bridge", "deposit-nonce", "domain", "resource", "data") 58 } 59 60 func init() { 61 BindVoteProposalCmdFlags(voteProposalCmd) 62 } 63 64 func ValidateVoteProposalFlags(cmd *cobra.Command, args []string) error { 65 if !common.IsHexAddress(Bridge) { 66 return fmt.Errorf("invalid bridge address: %s", Bridge) 67 } 68 return nil 69 } 70 71 func ProcessVoteProposalFlags(cmd *cobra.Command, args []string) error { 72 var err error 73 BridgeAddr = common.HexToAddress(Bridge) 74 DataBytes = common.Hex2Bytes(Data) 75 76 ResourceIdBytesArr, err = flags.ProcessResourceID(ResourceID) 77 return err 78 } 79 80 type Voter interface { 81 SimulateVoteProposal(proposal *proposal.Proposal) error 82 VoteProposal(proposal *proposal.Proposal, opts transactor.TransactOptions) (*common.Hash, error) 83 } 84 85 func VoteProposalCmd(cmd *cobra.Command, args []string, voter Voter) error { 86 prop := &proposal.Proposal{ 87 Source: uint8(DomainID), 88 DepositNonce: DepositNonce, 89 Data: DataBytes, 90 ResourceId: ResourceIdBytesArr, 91 } 92 93 err := voter.SimulateVoteProposal(prop) 94 if err != nil { 95 return err 96 } 97 98 h, err := voter.VoteProposal(prop, transactor.TransactOptions{}) 99 if err != nil { 100 return err 101 } 102 103 log.Info().Msgf("Successfully voted on proposal with hash: %s", h.Hex()) 104 return nil 105 }