diff --git a/bridge/cmd/guardiand/bridge.go b/bridge/cmd/guardiand/bridge.go index 7c3e192d9..67f4bb493 100644 --- a/bridge/cmd/guardiand/bridge.go +++ b/bridge/cmd/guardiand/bridge.go @@ -57,6 +57,9 @@ var ( ethRPC *string ethContract *string + bscRPC *string + bscContract *string + terraWS *string terraLCD *string terraChainID *string @@ -93,6 +96,9 @@ func init() { ethRPC = BridgeCmd.Flags().String("ethRPC", "", "Ethereum RPC URL") ethContract = BridgeCmd.Flags().String("ethContract", "", "Ethereum bridge contract address") + bscRPC = BridgeCmd.Flags().String("bscRPC", "", "Binance Smart Chain RPC URL") + bscContract = BridgeCmd.Flags().String("bscContract", "", "Binance Smart Chain bridge contract address") + terraWS = BridgeCmd.Flags().String("terraWS", "", "Path to terrad root for websocket connection") terraLCD = BridgeCmd.Flags().String("terraLCD", "", "Path to LCD service root for http calls") terraChainID = BridgeCmd.Flags().String("terraChainID", "", "Terra chain ID, used in LCD client initialization") @@ -231,6 +237,7 @@ func runBridge(cmd *cobra.Command, args []string) { // Deterministic ganache ETH devnet address. *ethContract = devnet.GanacheBridgeContractAddress.Hex() + *bscContract = devnet.GanacheBridgeContractAddress.Hex() // Use the hostname as nodeName. For production, we don't want to do this to // prevent accidentally leaking sensitive hostnames. @@ -261,6 +268,12 @@ func runBridge(cmd *cobra.Command, args []string) { if *ethContract == "" { logger.Fatal("Please specify --ethContract") } + if *bscRPC == "" { + logger.Fatal("Please specify --bscRPC") + } + if *bscContract == "" { + logger.Fatal("Please specify --bscContract") + } if *nodeName == "" { logger.Fatal("Please specify --nodeName") } @@ -289,6 +302,7 @@ func runBridge(cmd *cobra.Command, args []string) { } ethContractAddr := eth_common.HexToAddress(*ethContract) + bscContractAddr := eth_common.HexToAddress(*bscContract) solBridgeAddress, err := solana_types.PublicKeyFromBase58(*solanaBridgeAddress) if err != nil { logger.Fatal("invalid Solana bridge address", zap.Error(err)) @@ -378,6 +392,11 @@ func runBridge(cmd *cobra.Command, args []string) { return err } + if err := supervisor.Run(ctx, "bscwatch", + ethereum.NewEthBridgeWatcher(*bscRPC, bscContractAddr, "bsc", vaa.ChainIDBSC, lockC, nil).Run); err != nil { + return err + } + // Start Terra watcher only if configured logger.Info("Starting Terra watcher") if err := supervisor.Run(ctx, "terrawatch", diff --git a/bridge/pkg/vaa/structs.go b/bridge/pkg/vaa/structs.go index 6de9b4c43..94f4038f7 100644 --- a/bridge/pkg/vaa/structs.go +++ b/bridge/pkg/vaa/structs.go @@ -69,6 +69,8 @@ func (c ChainID) String() string { return "ethereum" case ChainIDTerra: return "terra" + case ChainIDBSC: + return "bsc" default: return fmt.Sprintf("unknown chain ID: %d", c) } @@ -81,6 +83,8 @@ const ( ChainIDEthereum = 2 // ChainIDTerra is the ChainID of Terra ChainIDTerra = 3 + // ChainIDBSC is the ChainID of Binance Smart Chain + ChainIDBSC = 4 minVAALength = 1 + 4 + 52 + 4 + 1 + 1 SupportedVAAVersion = 0x01 diff --git a/devnet/bridge.yaml b/devnet/bridge.yaml index b1793ed6c..3ed5e2332 100644 --- a/devnet/bridge.yaml +++ b/devnet/bridge.yaml @@ -63,6 +63,8 @@ spec: - bridge - --ethRPC - ws://eth-devnet:8545 + - --bscRPC + - ws://eth-devnet:8545 - --terraWS - ws://terra-terrad:26657/websocket - --terraLCD