---
title: Morph Holesky Testnet Pre-launch Development Resources
lang: en-US
keywords: [morph,ethereum,rollup,layer2,validity proof,optimstic zk-rollup]
description: Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimstic zk-rollup solution. Try it now!
---
# Holesky Testnet:
## Network Configuration
Before you start, ensure you are connected to the following networks:
| Network Name | Morph Holesky Testnet | Holesky Testnet |
| --- | --- | --- |
| RPC URL | https://rpc-holesky.morphl2.io | https://ethereum-holesky-rpc.publicnode.com/ |
| Chain ID | 2810 | 17000 |
| Currency Symbol | ETH | ETH |
| Block Explorer URL | https://explorer-holesky.morphl2.io/| https://holesky.etherscan.io/ |
Websocket Connection:
wss://rpc-holesky.morphl2.io:8443/
## Testnet Bridge
bridge-holesky.morphl2.io
## Contract Address
### Main Contract
#### L1 Contract
[Staking](https://holesky.etherscan.io/address/0x868dd5d1c268277e331b726bb438edde8221d389):0x868dd5d1c268277e331b726bb438edde8221d389
[Rollup](https://holesky.etherscan.io/address/0xd8c5c541d56f59d65cf775de928ccf4a47d4985c):0xd8c5c541d56f59d65cf775de928ccf4a47d4985c
[L1MessageQueueWithGasPriceOracle](https://holesky.etherscan.io/address/0x778d1d9a4d8b6b9ade36d967a9ac19455ec3fd0b):0x778d1d9a4d8b6b9ade36d967a9ac19455ec3fd0b
[L1CrossDomainMessenger](https://holesky.etherscan.io/address/0xecc966ab425f3f5bd58085ce4ebdbf81d829126f):0xecc966ab425f3f5bd58085ce4ebdbf81d829126f
#### L2 Contract
[L2ToL1MessagePasser](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000001):0x5300000000000000000000000000000000000001
[L2Sequencer](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000003):0x5300000000000000000000000000000000000003
[L2Gov](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000004):0x5300000000000000000000000000000000000004
[L2Submitter](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000005):0x5300000000000000000000000000000000000005
[L2CrossDomainMessenger](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000007):0x5300000000000000000000000000000000000007
### Gateway
#### L1 Gateway
[L1GatewayRouter](https://holesky.etherscan.io/address/0xea593b730d745fb5fe01b6d20e6603915252c6bf):0xea593b730d745fb5fe01b6d20e6603915252c6bf
[L1ETHGateway](https://holesky.etherscan.io/address/0xcc3d455481967dc97346ef1771a112d7a14c8f12):0xcc3d455481967dc97346ef1771a112d7a14c8f12
[L1WETHGateway](https://holesky.etherscan.io/address/0xbbdb317b50313d96823eba0fc2c1d9e469dc1906):0xbbdb317b50313d96823eba0fc2c1d9e469dc1906
[L1StandardERC20Gateway](https://holesky.etherscan.io/address/0xb26dafdb434ae93e3b8efde4f0193934955d86cd):0xb26dafdb434ae93e3b8efde4f0193934955d86cd
#### L2 Gateway
[L2GatewayRouter](https://explorer-holesky.morphl2.io/address/https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000002):0x5300000000000000000000000000000000000002
[L2StandardERC20Gateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000008):0x5300000000000000000000000000000000000008
[L2ERC721Gateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000009):0x5300000000000000000000000000000000000009
[L2ERC1155Gateway](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000C):0x530000000000000000000000000000000000000C
[L2WETHGateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000010):0x5300000000000000000000000000000000000010
[L2ETHGateway](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000006):0x5300000000000000000000000000000000000006
### Other Layer 2 Predeploys
[L2TxFeeVault](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000A):0x530000000000000000000000000000000000000A
[ProxyAdmin](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000B):0x530000000000000000000000000000000000000B
[MorphStandardERC20](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000D):0x530000000000000000000000000000000000000D
[MorphStandardERC20Factory](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000E):0x530000000000000000000000000000000000000E
[GasPriceOracle](https://explorer-holesky.morphl2.io/address/0x530000000000000000000000000000000000000F):0x530000000000000000000000000000000000000F
[L2WETH](https://explorer-holesky.morphl2.io/address/0x5300000000000000000000000000000000000011):0x5300000000000000000000000000000000000011
## Node Deployment
## Run a Morph Node
This guide describes the approach to starting up a morph node. We create the folder `~/.morph` as our home directory for the following example.
### Hardware requirements
Running the morph node requires 2 processes to be started, which are `geth` and `node`.
`Geth` is the Morph execution layer which needs to meet the [go-ethereum hardware requirements](https://github.com/ethereum/go-ethereum#hardware-requirements), but with less storage, 500GB is enough so far.
`Node` is the Morph consensus layer embedded tendermint which needs to meet the [tendermint hardware requirements](https://docs.tendermint.com/v0.34/tendermint-core/running-in-production.html#processor-and-memory).
According to limitations of the current geth implementation, we only support archive mode for launching a Geth. So the storage size of Geth will constantly increase along with blocks produced.
### Build executable binary
#### Clone morph
```
mkdir -p ~/.morph
cd ~/.morph
git clone https://github.com/morph-l2/morph.git
```
Currently, we use tag v0.1.0-beta as our beta version.
```
cd morph
git checkout v0.1.0-beta
```
#### Build Geth
```
make nccc_geth
```
#### Build Node
```
cd ~/.morph/morph/node
make build
```
### Sync from genesis block
#### Config Preparation
Download the config files and make data dir
```
cd ~/.morph
wget https://raw.githubusercontent.com/morph-l2/config-template/main/holesky/data.zip
unzip data.zip
```
Create a shared secret with node
```
cd ~/.morph
openssl rand -hex 32 > jwt-secret.txt
```
#### Script to start the process
*Geth*
```
./morph/go-ethereum/build/bin/geth --morph-holesky \
--datadir "./geth-data" \
--http --http.api=web3,debug,eth,txpool,net,engine \
--authrpc.addr localhost \
--authrpc.vhosts="localhost" \
--authrpc.port 8551 \
--authrpc.jwtsecret=./jwt-secret.txt \
--miner.gasprice="100000000" \
--log.filename=./geth.log
```
*tail -f geth.log* to check if the Geth is running properly, or you can also exeucte the below curl command to check if you are connected to the peer.
```
curl -X POST -H 'Content-Type: application/json' --data
'{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}'
localhost:8545
{"jsonrpc":"2.0","id":74,"result":"0x3"}
```
*Node*
```
./morph/node/build/bin/morphnode --home ./node-data \
--l2.jwt-secret ./jwt-secret.txt \
--l2.eth http://localhost:8545 \
--l2.engine http://localhost:8551 \
--log.filename ./node.log
```
tail -f node.log to check if the node is running properly, and you can also execute the command curl to check your node connection status.
```
curl http://localhost:26657/net_info
{
"jsonrpc": "2.0",
"id": -1,
"result": {
"listening": true,
"listeners": [
"Listener(@)"
],
"n_peers": "3",
"peers": [
{
"node_info": {
"protocol_version": {
"p2p": "8",
"block": "11",
"app": "0"
},
"id": "0fb5ce425197a462a66de015ee5fbbf103835b8a",
"listen_addr": "tcp://0.0.0.0:26656",
"network": "chain-morph-holesky",
"version": "0.37.0-alpha.1",
"channels": "4020212223386061",
"moniker": "morph-dataseed-node-1",
"other": {
"tx_index": "on",
"rpc_address": "tcp://0.0.0.0:26657"
}
},
"is_outbound": true,
```
### Check sync status
curl http://localhost:26657/status to check the sync status of the node
```
{
"jsonrpc": "2.0",
"id": -1,
"result": {
"node_info": {
"protocol_version": {
"p2p": "8",
"block": "11",
"app": "0"
},
"id": "b3f34dc2ce9c4fee5449426992941aee1e09670f",
"listen_addr": "tcp://0.0.0.0:26656",
"network": "chain-morph-holesky",
"version": "0.37.0-alpha.1",
"channels": "4020212223386061",
"moniker": "my-morph-node",
"other": {
"tx_index": "on",
"rpc_address": "tcp://0.0.0.0:26657"
}
},
"sync_info": {
"latest_block_hash": "71024385DDBEB7B554DB11FD2AE097ECBD99B2AF826C11B2A74F7172F2DEE5D2",
"latest_app_hash": "",
"latest_block_height": "2992",
"latest_block_time": "2024-04-25T13:48:27.647889852Z",
"earliest_block_hash": "C7A73D3907C6CA34B9DFA043FC6D4529A8EAEC8F059E100055653E46E63F6F8E",
"earliest_app_hash": "",
"earliest_block_height": "1",
"earliest_block_time": "2024-04-25T09:06:30Z",
"catching_up": false
},
"validator_info": {
"address": "5FB3D3734640792F14B70E7A53FBBD39DB9787A8",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "rzN67ZJWsaLSGGpNj7HOWs8nrL5kr1n+w0OckWUCetw="
},
"voting_power": "0"
}
}
}
```
The returned "catching_up" indicates whether the node is in sync or not. True means it is in sync. Meanwhile, the returned latest_block_height indicates the latest block height this node synced.