Join the public testnet
Install a current modal binary, create a joiner with a new key, and mine
(or observe) against the public hybrid testnet.
Bootstrap nodes are Foundation-operated. Anyone may join by mining. This is
not mainnet. It runs predicate theory v3. MOD is the asset of the genesis
MOD contract: 50 MOD per block (8 decimals), halving every 10080
blocks (about 7 days). That is a development mint, not the mainnet 21M
schedule. The three bootstrappers also run as a named
validator set (min stake 0) so dest REPOST and dest RECV can
consume a prefix-cert quorum certificate. That named set is a testnet
bootstrap, not the mainnet stake-gated membership rule. Join remains by
mining; run-validator runs that prefix-cert role and is not how you join.
If modal node ping to a published bootstrapper times out, the testnet is not
currently joinable. Check the description on the bundled testnet network
(modal net info testnet) before treating it as live. Public names:
- Status:
https://testnet.modality.network - Explorer:
https://node0.testnet.modality.network(observer-served contract inspect / history; anyrun-observercan serve the same HTTP on itsstatus_port) - Bootstrappers:
node1.testnet.modality.network,node2.testnet.modality.network,node3.testnet.modality.network(TCP 4040/ws)
Those names replace the old *.testnet.modal.money hosts. Packages still
install from get.modality.org.
Install
curl -fsSL https://get.modality.org/testnet/latest/install.sh | sh
Use a build that includes node commands (modal node). A language-only
modality CLI on PATH is not enough.
Create a joiner
modal node create --dir ./my-node --testnet
--testnet writes:
network_config_path:modality-networks://testnetlisteners:/ip4/0.0.0.0/tcp/4040/wshybrid_consensus: true- bootstrappers from the bundled testnet list
- autoupgrade from
https://get.modality.org(branchtestnet)
Do not use --from-template testnet/node1 (or node2 / node3 / node0) as a joiner.
Those identities are the Foundation bootstrap and explorer nodes.
Open TCP 4040 if you want other peers to dial you.
Run
modal node run-miner --dir ./my-node --no-tui
# or, miner + sequencer in one process:
modal node run-hybrid --dir ./my-node --no-tui
Ping a bootstrapper from a second node directory (same-dir ping opens the live datastore):
modal node ping --dir ./ping-node --target /dns4/node1.testnet.modality.network/tcp/4040/ws/p2p/<peer-id>
Post a contract
After sequencers are running (hybrid nominates sequencers from mining epoch N−2, so sequencing starts at epoch 2):
modal contract create --dir ./my-contract
modal checkout --dir ./my-contract
modal commit --path /data/message.text --value hello --dir ./my-contract --message hello
modal contract push --dir ./my-contract --remote /dns4/node1.testnet.modality.network/tcp/4040/ws/p2p/<peer-id>
Paths must be typed (/data/message.text). Push with --remote <multiaddr>.
Take your MOD
Each block you mine nominates your node's peer id, and the network's mint sends that block's MOD there once the chain is two epochs past it. Your node's status page shows it under MOD Held by Node, with what waits to be received. Make the wallet at your node's key and receive:
modal wallet create --key ./my-node/node.modal_passfile --dir ./my-node-wallet
modal wallet recv --dir ./my-node-wallet
modal wallet balance --dir ./my-node-wallet
To start without mining, take 10 MOD from the faucet, once per key:
modal wallet create
modal wallet faucet
See Wallet Commands.
See Mine on the public testnet for RandomX mining,
operator checks, and sequencer nomination. See Node Commands
for create, run-miner, run-hybrid, and ping.