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.
Prerequisites
Two programs are involved, in two separate terminal windows — one stays running, one is where you type commands.
| Program | Language | Job |
|---|---|---|
l1_node | Rust | The actual blockchain — mempool, blocks, state. Listens on http://localhost:8080. |
client/wallet.js | Node.js | A 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:
cd l1_node
cargo runFirst run compiles everything (~1 minute). Once it's up, you'll see something like:
================ 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):
cd l1_node/client
npm installCreate a wallet — a brand new, unfunded account. Save the private key, it's the only way to spend from it later.
node wallet.js newCheck its balance (will be 0 — nothing received yet):
node wallet.js balance <address>Get funded from the faucet:
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:
node wallet.js send <your_privkey> <to_address> <amount>View history — every transaction an address has been part of, either direction, oldest first:
node wallet.js history <address>Quick reference
| What you want | Command |
|---|---|
| Start the chain | cargo run (from l1_node/) |
| Create a wallet | node wallet.js new |
| Check a balance | node wallet.js balance <address> |
| View history | node wallet.js history <address> |
| Send funds | node wallet.js send <privkey> <to> <amount> |
| Send with a specific nonce | node 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.jsauto-fill the current one. - "insufficient balance" — check
wallet.js balancefirst; 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.
Pay3