Pay3 L1 is in active development — a single-node testnet prototype runs today, see Run It Yourself.
Pay3Pay3Docs
Testnet

Run It Yourself

l1_node is a real, running prototype of the Pay3 chain — not a simulation. This walks through running your own copy locally: start the chain, create a wallet, send a transaction, check balances and history.

This is a teaching/prototype skeleton, not a production chain. It's genuinely useful for exercising the full wallet → RPC → mempool → block → balance loop end to end — see Current Limitations for exactly what's simplified before treating anything here as durable.

Prerequisites

Two programs are involved, in two separate terminal windows — one stays running, one is where you type commands.

ProgramLanguageJob
l1_nodeRustThe actual blockchain — mempool, blocks, state. Listens on http://localhost:8080.
client/wallet.jsNode.jsA CLI wallet that talks to the node over that RPC.

You'll need cargo (Rust) and node installed. If cargo isn't available: apt-get install cargo rustc on Linux, or see rust-lang.org/tools/install.

Start the node

In terminal window #1:

bash
cd l1_node
cargo run

First run compiles everything (~1 minute). Once it's up, you'll see something like:

text
================  l1_node dev chain  ================
faucet address : 0xede5a99fe4860f75b23dfe4c55a824c3dddf7354
faucet privkey : 0xf1481336...  (dev only, do not reuse)
faucet balance : 1000000
block time     : 3s
rpc listening  : http://0.0.0.0:8080
=======================================================

Leave this running — it's now sealing a new block every 3 seconds and listening on port 8080. Copy the faucet address and private key: that account starts with 1,000,000 units and is the only funded account at genesis, so everything else gets funded from it.

The wallet CLI

In terminal window #2, set up the wallet tool (installs ethers, same library the Pay3 Wallet uses):

bash
cd l1_node/client
npm install

Create a wallet — a brand new, unfunded account. Save the private key, it's the only way to spend from it later.

bash
node wallet.js new

Check its balance (will be 0 — nothing received yet):

bash
node wallet.js balance <address>

Get funded from the faucet:

bash
node wallet.js send <faucet_privkey> <your_new_address> <amount>

Wait ~3–5 seconds for the next block to seal, then check the balance again to confirm it landed.

Send a transaction from your own wallet to any other address:

bash
node wallet.js send <your_privkey> <to_address> <amount>

View history — every transaction an address has been part of, either direction, oldest first:

bash
node wallet.js history <address>

Quick reference

What you wantCommand
Start the chaincargo run (from l1_node/)
Create a walletnode wallet.js new
Check a balancenode wallet.js balance <address>
View historynode wallet.js history <address>
Send fundsnode wallet.js send <privkey> <to> <amount>
Send with a specific noncenode wallet.js send <privkey> <to> <amount> <nonce>
Dump the whole chain (debug)curl http://localhost:8080/chain

All commands accept RPC_URL=http://otherhost:8080 before them if the node isn't on localhost — useful once it's deployed, see Deploying.

Troubleshooting

  • ECONNREFUSED from wallet.js — the node isn't running, or crashed. Check that terminal window for an error.
  • "bad nonce" on send — someone else's transaction from that address already used that nonce. Omit the nonce argument and let wallet.js auto-fill the current one.
  • "insufficient balance" — check wallet.js balance first; you're trying to send more than the account holds.
  • Balance/history not updated right after sending — normal, wait for the next block (every 3 seconds).
  • Restarted the node and balances reset to zero — expected. State is in-memory only, see Current Limitations.