ADDITION_FINAL - Final Command Surface

RPC Endpoints

Each TCP request is one command line and returns one response line.

Public read RPC

Enable with --public-rpc or ADDITION_ENABLE_PUBLIC_RPC=1:

./build/additiond --network testnet --public-rpc
# or
ADDITION_ENABLE_PUBLIC_RPC=1 ./build/additiond --network testnet

Allowlist (everything else returns error: command disabled on public RPC):

Not on the public port: mine, sendtx*, createwallet, wallet_*, identity rotation, admin, contract/token writes.

TCP and a tiny HTTP adapter share the same port:

curl 'https://rpc.additionblockchain.com/rpc?cmd=getinfo'
curl 'http://34.27.30.115/rpc?cmd=getinfo'
curl 'http://34.27.30.115:38545/rpc?cmd=getinfo'
curl 'http://34.27.30.115:38545/jsonrpc?method=getinfo'

Those curls succeed only when the operator seed answers. If they timeout, run a local --public-rpc node or scripts/start_two_node_testnet.sh. Do not treat a timeout as a secret second seed.

Path is /rpc?cmd=getinfo or /jsonrpc?method=getinfo, not /getinfo. :80 works when 38545 is filtered.

Public-read JSON API (same allowlist, no writes). Not Ethereum JSON-RPC.

GET  http://HOST:38545/jsonrpc?method=getinfo
GET  http://HOST:38545/jsonrpc?method=getblock&params=0
GET  http://HOST:38545/jsonrpc?method=getblockraw&params=0
POST http://HOST:38545/jsonrpc
{"jsonrpc":"2.0","id":1,"method":"monetary_info","params":[]}

Join the operator testnet: --bootstrap 34.27.30.115:28545. sync uses HTTP :80 then :38545 (getblockraw). HTTP :80 is the reliable path; public TCP 28545 can timeout or be filtered. Seed operators set ADDITION_ADVERTISED_P2P=34.27.30.115:28545 so public getinfo / peers do not list self. Write RPC stays 127.0.0.1.

Override bind/port with --public-rpc-bind, --public-rpc-port, ADDITION_PUBLIC_RPC_BIND, or ADDITION_PUBLIC_RPC_PORT. HTTP replies send Access-Control-Allow-Origin: * (read-only allowlist, no cookies), Access-Control-Allow-Methods: GET, OPTIONS, OPTIONS 204, and Cache-Control: no-store. curl /rpc?cmd=getinfo is unchanged.

Two-node local testnet (write RPC stays loopback):

./scripts/start_two_node_testnet.sh

Node A: --public-rpc on 38545, P2P 28545, write 127.0.0.1:8545.

Node B: --data-dir second tree, write 8546, P2P 28546, --bootstrap 127.0.0.1:28545.

Operator public P2P (IPv4 only): --bootstrap 34.27.30.115:28545. Write RPC stays loopback.

See TWO_NODE_TESTNET.md.

Website PUBLIC_RPC_HTTP is a Worker secret, not a committed wrangler.toml value. Missing secret → RPC offline. Set it only to a real public-rpc HTTP URL you operate. Do not commit trycloudflare URLs.

Core chain

P2P + Consensus

P2P transport payload protocol

### Controlled node identity rotation

### Rotation gossip messages

Both messages are signature-verified before being accepted.

Rotation messages are auto-relayed to connected peers after handshake, with deduplication to limit relay loops.

### P2P inbound rate limits

### Transport hardening

### Parser field bounds (security)

Inbound HELLO/HELLO_ACK, IDROTATE, and IDVOTE exceeding these bounds are rejected and penalized.

### PQ key/signature validation hardening

Privacy pool

Verifier notes:

Staking

Smart-contract runtime

Leftover contract_call aliases (ML-DSA wrap, not a ZK circuit)

Notes:

Token & NFT runtime

Swap (in-process pool math)

Bridge runtime

Notes

Wallet (local / testnet only)

Website

MetaMask (local EVM JSON-RPC only)

Run:

This is local testnet bootstrap. Bind is 127.0.0.1:9545 (refuses 0.0.0.0).

eth_sendRawTransaction is disabled. Not Ethereum mainnet. Not a live Uniswap / ETH / XMR bridge.

MetaMask/Trust/Binance cannot list this as a public network.

Custom network values (Add-to-MetaMask helper on /evm/ uses only these):

Supported local methods (bridge 0.2-local):

Limitations:

Local mining pool (coordinator)

Source file in the repository: docs/FINAL_COMMANDS.md