Explorar el Código

Moonbeam to testnet (#1150)

* Moonbeam to testnet

* Fix typo

* Shouldn't touch the CLI with this PR

* Update SDK version
bruce-riley hace 3 años
padre
commit
c7ba459de8

+ 2 - 0
devnet/node.yaml

@@ -89,6 +89,8 @@ spec:
             - ws://eth-devnet:8545
             - --celoRPC
             - ws://eth-devnet:8545
+            - --moonbeamRPC
+            - ws://eth-devnet:8545
             - --terraWS
             - ws://terra-terrad:26657/websocket
             - --terraLCD

+ 14 - 0
ethereum/.env.moonbeam.testnet

@@ -0,0 +1,14 @@
+# Moonbeam testnet env
+# Rename to .env to use with truffle migrations
+
+# Wormhole Core Migrations
+INIT_SIGNERS=["0x13947Bd48b18E53fdAeEe77F3473391aC727C638"]
+INIT_CHAIN_ID=0x10
+INIT_GOV_CHAIN_ID=0x1
+INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004
+
+# Bridge Migrations
+BRIDGE_INIT_CHAIN_ID=0x10
+BRIDGE_INIT_GOV_CHAIN_ID=0x1
+BRIDGE_INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004
+BRIDGE_INIT_WETH=0xD909178CC99d318e4D46e7E66a972955859670E1  

+ 11 - 0
ethereum/truffle-config.js

@@ -232,6 +232,17 @@ module.exports = {
       },
       network_id: 44787,
     },
+    moonbeam_testnet: {
+      provider: () => {
+        return new HDWalletProvider(
+          process.env.MNEMONIC,
+          "https://rpc.api.moonbase.moonbeam.network"
+        );
+      },
+      network_id: 1287,
+      gasPrice: 3000000000, // 3.0 gwei
+      timeoutBlocks: 15000,
+    },    
   },
 
   compilers: {

+ 1 - 0
node/cmd/guardiand/adminnodes.go

@@ -113,6 +113,7 @@ func runListNodes(cmd *cobra.Command, args []string) {
 		networks = append(networks, network{"Acala", vaa.ChainIDAcala})
 		networks = append(networks, network{"Klaytn", vaa.ChainIDKlaytn})
 		networks = append(networks, network{"Celo", vaa.ChainIDCelo})
+		networks = append(networks, network{"Moonbeam", vaa.ChainIDMoonbeam})
 	}
 
 	if len(only) > 0 {

+ 27 - 1
node/cmd/guardiand/node.go

@@ -99,13 +99,16 @@ var (
 	celoRPC      *string
 	celoContract *string
 
+	moonbeamRPC      *string
+	moonbeamContract *string
+
 	terraWS       *string
 	terraLCD      *string
 	terraContract *string
 
 	algorandIndexerRPC   *string
 	algorandIndexerToken *string
-	algorandAppID *uint64
+	algorandAppID        *uint64
 
 	solanaWsRPC *string
 	solanaRPC   *string
@@ -191,6 +194,9 @@ func init() {
 	celoRPC = NodeCmd.Flags().String("celoRPC", "", "Celo RPC URL")
 	celoContract = NodeCmd.Flags().String("celoContract", "", "Celo contract address")
 
+	moonbeamRPC = NodeCmd.Flags().String("moonbeamRPC", "", "Moonbeam RPC URL")
+	moonbeamContract = NodeCmd.Flags().String("moonbeamContract", "", "Moonbeam contract address")
+
 	terraWS = NodeCmd.Flags().String("terraWS", "", "Path to terrad root for websocket connection")
 	terraLCD = NodeCmd.Flags().String("terraLCD", "", "Path to LCD service root for http calls")
 	terraContract = NodeCmd.Flags().String("terraContract", "", "Wormhole contract address on Terra blockchain")
@@ -324,6 +330,7 @@ func runNode(cmd *cobra.Command, args []string) {
 		readiness.RegisterComponent(common.ReadinessAcalaSyncing)
 		readiness.RegisterComponent(common.ReadinessKlaytnSyncing)
 		readiness.RegisterComponent(common.ReadinessCeloSyncing)
+		readiness.RegisterComponent(common.ReadinessMoonbeamSyncing)
 	}
 
 	if *statusAddr != "" {
@@ -373,6 +380,7 @@ func runNode(cmd *cobra.Command, args []string) {
 		*acalaContract = devnet.GanacheWormholeContractAddress.Hex()
 		*klaytnContract = devnet.GanacheWormholeContractAddress.Hex()
 		*celoContract = devnet.GanacheWormholeContractAddress.Hex()
+		*moonbeamContract = devnet.GanacheWormholeContractAddress.Hex()
 	}
 
 	// Verify flags
@@ -456,6 +464,12 @@ func runNode(cmd *cobra.Command, args []string) {
 		if *celoContract == "" {
 			logger.Fatal("Please specify --celoContract")
 		}
+		if *moonbeamRPC == "" {
+			logger.Fatal("Please specify --moonbeamRPC")
+		}
+		if *moonbeamContract == "" {
+			logger.Fatal("Please specify --moonbeamContract")
+		}
 	} else {
 		if *ethRopstenRPC != "" {
 			logger.Fatal("Please do not specify --ethRopstenRPC in non-testnet mode")
@@ -481,6 +495,12 @@ func runNode(cmd *cobra.Command, args []string) {
 		if *celoContract != "" && !*unsafeDevMode {
 			logger.Fatal("Please do not specify --celoContract")
 		}
+		if *moonbeamRPC != "" && !*unsafeDevMode {
+			logger.Fatal("Please do not specify --moonbeamRPC")
+		}
+		if *moonbeamContract != "" && !*unsafeDevMode {
+			logger.Fatal("Please do not specify --moonbeamContract")
+		}
 	}
 	if *nodeName == "" {
 		logger.Fatal("Please specify --nodeName")
@@ -569,6 +589,7 @@ func runNode(cmd *cobra.Command, args []string) {
 	acalaContractAddr := eth_common.HexToAddress(*acalaContract)
 	klaytnContractAddr := eth_common.HexToAddress(*klaytnContract)
 	celoContractAddr := eth_common.HexToAddress(*celoContract)
+	moonbeamContractAddr := eth_common.HexToAddress(*moonbeamContract)
 	solAddress, err := solana_types.PublicKeyFromBase58(*solanaContract)
 	if err != nil {
 		logger.Fatal("invalid Solana contract address", zap.Error(err))
@@ -662,6 +683,7 @@ func runNode(cmd *cobra.Command, args []string) {
 		chainObsvReqC[vaa.ChainIDAcala] = make(chan *gossipv1.ObservationRequest)
 		chainObsvReqC[vaa.ChainIDKlaytn] = make(chan *gossipv1.ObservationRequest)
 		chainObsvReqC[vaa.ChainIDCelo] = make(chan *gossipv1.ObservationRequest)
+		chainObsvReqC[vaa.ChainIDMoonbeam] = make(chan *gossipv1.ObservationRequest)
 		chainObsvReqC[vaa.ChainIDEthereumRopsten] = make(chan *gossipv1.ObservationRequest)
 	}
 
@@ -830,6 +852,10 @@ func runNode(cmd *cobra.Command, args []string) {
 				ethereum.NewEthWatcher(*celoRPC, celoContractAddr, "celo", common.ReadinessCeloSyncing, vaa.ChainIDCelo, lockC, nil, 1, chainObsvReqC[vaa.ChainIDCelo], *unsafeDevMode).Run); err != nil {
 				return err
 			}
+			if err := supervisor.Run(ctx, "moonbeamwatch",
+				ethereum.NewEthWatcher(*moonbeamRPC, moonbeamContractAddr, "moonbeam", common.ReadinessMoonbeamSyncing, vaa.ChainIDMoonbeam, lockC, nil, 1, chainObsvReqC[vaa.ChainIDMoonbeam], *unsafeDevMode).Run); err != nil {
+				return err
+			}
 		}
 
 		// Start Terra watcher only if configured

+ 1 - 0
node/pkg/common/readiness.go

@@ -18,4 +18,5 @@ const (
 	ReadinessAcalaSyncing      readiness.Component = "acalaSyncing"
 	ReadinessKlaytnSyncing     readiness.Component = "klaytnSyncing"
 	ReadinessCeloSyncing       readiness.Component = "celoSyncing"
+	ReadinessMoonbeamSyncing   readiness.Component = "moonbeamSyncing"
 )

+ 6 - 0
node/pkg/vaa/structs.go

@@ -114,6 +114,8 @@ func (c ChainID) String() string {
 		return "klaytn"
 	case ChainIDCelo:
 		return "celo"
+	case ChainIDMoonbeam:
+		return "moonbeam"
 	default:
 		return fmt.Sprintf("unknown chain ID: %d", c)
 	}
@@ -153,6 +155,8 @@ func ChainIDFromString(s string) (ChainID, error) {
 		return ChainIDKlaytn, nil
 	case "celo":
 		return ChainIDCelo, nil
+	case "moonbeam":
+		return ChainIDMoonbeam, nil
 	default:
 		return ChainIDUnset, fmt.Errorf("unknown chain ID: %s", s)
 	}
@@ -188,6 +192,8 @@ const (
 	ChainIDKlaytn ChainID = 13
 	// ChainIDCelo is the ChainID of Celo
 	ChainIDCelo ChainID = 14
+	// ChainIDMoonbeam is the ChainID of Moonbeam
+	ChainIDMoonbeam ChainID = 16
 
 	// ChainIDEthereumRopsten is the ChainID of Ethereum Ropsten
 	ChainIDEthereumRopsten ChainID = 10001

+ 3 - 0
node/pkg/vaa/structs_test.go

@@ -36,6 +36,7 @@ func TestChainIDFromString(t *testing.T) {
 		{input: "acala", output: ChainIDAcala},
 		{input: "klaytn", output: ChainIDKlaytn},
 		{input: "celo", output: ChainIDCelo},
+		{input: "moonbeam", output: ChainIDMoonbeam},
 		{input: "ethereum-ropsten", output: ChainIDEthereumRopsten},
 
 		{input: "Solana", output: ChainIDSolana},
@@ -52,6 +53,7 @@ func TestChainIDFromString(t *testing.T) {
 		{input: "Acala", output: ChainIDAcala},
 		{input: "Klaytn", output: ChainIDKlaytn},
 		{input: "Celo", output: ChainIDCelo},
+		{input: "Moonbeam", output: ChainIDMoonbeam},
 		{input: "Ethereum-ropsten", output: ChainIDEthereumRopsten},
 	}
 
@@ -134,6 +136,7 @@ func TestChainId_String(t *testing.T) {
 		{input: 12, output: "acala"},
 		{input: 13, output: "klaytn"},
 		{input: 14, output: "celo"},
+		{input: 16, output: "moonbeam"},
 		{input: 10001, output: "ethereum-ropsten"},
 	}
 

+ 1 - 0
proto/publicrpc/v1/publicrpc.proto

@@ -24,6 +24,7 @@ enum ChainID {
   CHAIN_ID_KLAYTN = 13;
   CHAIN_ID_CELO = 14;
   CHAIN_ID_NEAR = 15;
+  CHAIN_ID_MOONBEAM = 16;
   // Special case - Eth has two testnets. CHAIN_ID_ETHEREUM is Goerli,
   // but we also want to connect to Ropsten, so we add a separate chain.
   CHAIN_ID_ETHEREUM_ROPSTEN = 10001;

+ 6 - 0
sdk/js/CHANGELOG.md

@@ -1,5 +1,11 @@
 # Changelog
 
+## 0.3.1
+
+### Added
+
+Moonbeam support
+
 ## 0.3.0
 
 ### Added

+ 1 - 1
sdk/js/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@certusone/wormhole-sdk",
-  "version": "0.3.0",
+  "version": "0.3.1",
   "description": "SDK for interacting with Wormhole",
   "homepage": "https://wormholenetwork.com",
   "main": "./lib/cjs/index.js",

+ 0 - 6
sdk/js/src/bridge/parseSequenceFromLog.ts

@@ -47,7 +47,6 @@ export function parseSequenceFromLogTerra(info: TxInfo): string {
       });
     });
   });
-  console.log("Terra Sequence: ", sequence);
   return sequence.toString();
 }
 
@@ -91,11 +90,8 @@ export function parseSequenceFromLogAlgorand(
   result: Record<string, any>
 ): string {
   let sequence = "";
-  console.log(result);
   if (result["inner-txns"]) {
-    console.log("Got inner txns.  Looking for logs...");
     const innerTxns: [] = result["inner-txns"];
-    console.log("innerTxns:", innerTxns);
     class iTxn {
       "local-state-delta": [[Object]];
       logs: Buffer[] | undefined;
@@ -103,10 +99,8 @@ export function parseSequenceFromLogAlgorand(
       txn: { txn: [Object] } | undefined;
     }
     innerTxns.forEach((txn: iTxn) => {
-      console.log("txn:", txn.logs);
       if (txn.logs) {
         sequence = BigNumber.from(txn.logs[0].slice(0, 8)).toString();
-        console.log("sequence:", sequence);
       }
     });
   }

+ 20 - 1
sdk/js/src/utils/consts.ts

@@ -15,6 +15,7 @@ export const CHAINS = {
   klaytn: 13,
   celo: 14,
   near: 15,
+  moonbeam: 16,
   ropsten: 10001,
 } as const;
 
@@ -37,6 +38,7 @@ export type EVMChainName =
   | "acala"
   | "klaytn"
   | "celo"
+  | "moonbeam"
   | "ropsten";
 
 export type Contracts = {
@@ -130,6 +132,11 @@ const MAINNET = {
     token_bridge: undefined,
     nft_bridge: undefined,
   },
+  moonbeam: {
+    core: undefined,
+    token_bridge: undefined,
+    nft_bridge: undefined,
+  },  
   ropsten: {
     core: undefined,
     token_bridge: undefined,
@@ -216,8 +223,13 @@ const TESTNET = {
   near: {
     core: undefined,
     token_bridge: undefined,
-    nft_bridge: undefined,
+    nft_bridge: undefined,    
   },
+  moonbeam: {
+    core: "0xa5B7D85a8f27dd7907dc8FdC21FA5657D5E2F901",
+    token_bridge: "0xbc976D4b9D57E57c3cA52e1Fd136C45FF7955A96",
+    nft_bridge: "0x98A0F4B96972b32Fcb3BD03cAeB66A44a6aB9Edb",
+  },    
   ropsten: {
     core: "0x210c5F5e2AF958B4defFe715Dc621b7a3BA888c5",
     token_bridge: "0xF174F9A837536C449321df1Ca093Bb96948D5386",
@@ -306,6 +318,11 @@ const DEVNET = {
     token_bridge: undefined,
     nft_bridge: undefined,
   },
+  moonbeam: {
+    core: undefined,
+    token_bridge: undefined,
+    nft_bridge: undefined,
+  },  
   ropsten: {
     core: undefined,
     token_bridge: undefined,
@@ -367,6 +384,7 @@ export const CHAIN_ID_ACALA = CHAINS["acala"];
 export const CHAIN_ID_KLAYTN = CHAINS["klaytn"];
 export const CHAIN_ID_CELO = CHAINS["celo"];
 export const CHAIN_ID_NEAR = CHAINS["near"];
+export const CHAIN_ID_MOONBEAM = CHAINS["moonbeam"];
 export const CHAIN_ID_ETHEREUM_ROPSTEN = CHAINS["ropsten"];
 
 // This inverts the [[CHAINS]] object so that we can look up a chain by id
@@ -474,6 +492,7 @@ export function isEVMChain(
     chainId === CHAIN_ID_ACALA ||
     chainId === CHAIN_ID_KLAYTN ||
     chainId === CHAIN_ID_CELO ||
+    chainId === CHAIN_ID_MOONBEAM ||
     chainId === CHAIN_ID_ETHEREUM_ROPSTEN
   ) {
     return isEVM(chainId);