← docs

DogecoinArcade — what it does

Everything the application can do, what each thing costs, and what it deliberately does not do. Written against the code; where a number appears it was measured rather than estimated.


The shape of it

DogecoinArcade is a sidecar: it runs beside Pepecoin Core (or Dogecoin Core) on your own machine and reads the chain the node already has. It never holds your keys — the node's wallet does — and it never asks for a passphrase. Everything it knows, it learned by replaying blocks, which means two installations reading the same chain agree without talking to each other.

Interface http://127.0.0.1:8420, bound to loopback because it can spend
Chains Pepecoin and Dogecoin, mainnet and testnet
Messaging testnet only, by design (D-010)
Tokens, inscriptions, @tags mainnet and testnet
Storage your node's datadir for the chain; ~/.dogecoinarcade for what the app remembers

Messages

Private messages between two people, encrypted end to end and carried on the chain.

Costs a transaction fee, and for a file, dust in the outputs that carry it. Both are shown before anything is sent.


The public board

Channels anybody can read. Nothing here is encrypted and nothing can be deleted — that is the point of them.


Tokens

An Omni-style token ledger, indexed from the chain.


NFTs

A file written onto the chain in full and uncompressed, owned by an address. Called an inscription in the code and on the wire, and NFTs in the interface, because that is the word people arrive with.

What it costs, measured:

File Transactions Chain Fee Dust Total After sweeping
100 KB 14 205 KB 2.1 18.1 20.1 2.1
1 MB 138 2.0 MB 20.2 178.0 198.3 20.2
5 MB 688 10.1 MB 100.9 887.5 988.4 100.9

The dust is not lost: every data output is a 1-of-3 including your own key, so it is spendable again by whoever made the inscription.

What an inscribed page can call

An inscription can be an HTML page, and that page can ask this node questions — the same idea as ordinals' recursive endpoints, with the same paths where the meaning matches.

Endpoint Returns
/content/<id> the bytes, with the type its creator gave it
/r/inscription/<id> owner, creator, number, type, length, hash
/r/metadata/<id> the JSON field, parsed
/r/inscriptions a page of them, newest first
/r/inscriptions/<address> what an address owns
/r/collections the collections on the chain, newest first
/r/collection/<creator>/<name> one collection: its items in edition order, and its traits
/r/blockheight, /r/blocktime where the chain is
/r/balances/<address> token balances at any address
/r/tag/<name>, /r/address/<address> who holds a @tag, and the other way
/r/wallet which wallet is looking — can be switched off
/r/send asks the wallet to send coins, tokens or an inscription; the person approves
/r/tx/<txid> whether a transaction is confirmed, and how deep
/r/storage.js arcade.storage: what the wallet remembers for the page, since a sandbox has no localStorage
/r/node.js arcade.node: node-to-node messages sent as the wallet the page runs in, and the replies to them
/r/swap.js arcade.swap: a shop page's listings, and a buy button that ends in one transaction both sides signed
/r/owner.js arcade.owner: a page sending, unasked, from the wallet that created it and holds it

An inscription is <id> by its number or its creating transaction id.

Why this is safe to serve. Inscribed code is written by strangers and runs in the browser of a wallet that can spend. It is loaded into a frame with sandbox and no allow-same-origin, so it has an opaque origin: no cookies, no access to the page around it, no navigating the top window. These endpoints are the only URLs in the application that answer a cross-origin request — every other page says nothing about CORS, so an inscription cannot read them. Content is served with sandbox in its own policy and nosniff, and a type we will not render is handed over as a download rather than guessed at.


Collections

A set of inscriptions that belong together — a HashLips build, or anything that names itself the same way.


Shops and swaps

A shop is an inscription. Its JSON lists what it sells and where its owner's node listens; the page inscribed with it is the storefront.

Testnet only, like the messages it travels on (D-010). Swaps are read from a starting height per chain (swaps_from), so a swap in a block before it is recorded as unread rather than as an old transaction meaning something new.


The exchange

Everything for sale on a chain, read from the chain itself. Four tabs, four questions.

Charts of what actually traded. Tokens and NFTs both get candles, built from the swaps on the chain — there is no order book to draw, so what is drawn is what people paid. A day with no trade is a dot on the axis, never a line ruled to the next price. One chart per collection, and one currency to a chart: what a Goofball goes for says nothing about what a Doge Punk goes for, and coins and tokens on one axis is adding pounds to metres. Drawn as SVG in the page: no charting library is fetched from anywhere, and the page's CSP would stop it if it tried.

An offer is made with what you have. The form lists the tokens this wallet holds with their balances, and the coin balance beside the coins option; it does not draw a token picker when the wallet holds none. The door checks again when the form comes back. Offering something you do not hold is a fee spent to be told no by somebody else, a block later, for something your own wallet could see at once.

A wallet is told before it pays. A buyer's side of a swap is two transactions — the half they sign and the message that carries it — so it needs two confirmed outputs. A wallet with one is refused before the order goes out, not three transactions later, and told to split the address.

An offer can be made on any NFT, listed or not: open one you do not own and press Make offer. It is said on the chain, not sent to anybody: somebody holding an NFT never asked to be reachable, and most have published no key at all, so the holder's own wallet finds the offer by watching its own things — any address, no announcement needed. It fits one OP_RETURN, so it costs a flat fee and locks nothing.

An offer already accepted says so, and says who it is waiting for and until when, rather than offering to accept it again.

It is not a PSBT — the buyer cannot build the transaction, because the seller's own output has to be its first input. The holder's Accept builds the seller's half and sends it to the buyer, whose wallet signs its half automatically only if it names the same item and the same price that was offered. Which is why making an offer needs your key published: you are the one asking for an answer. An offer on something of yours is never answered without you.


Approvals

A page or a program can ask this wallet to send something. It cannot send.


@tags

A handle that belongs to an address. @martin.

A claim is 13 bytes, so it fits an OP_RETURN: naming yourself costs one small transaction. Claim or change one from the address book, in two steps like a send: the transaction is shown before anything is broadcast, and a name that is malformed, reserved, already yours or already somebody's is refused before it costs anything.


The address book

Who is who, and where to pay them. Stored only on this computer — not published, not on any chain, and not visible to anyone you message.


Remote

Reach the wallet from your phone, from anywhere, for a while.

Press Open the tunnel, choose 4 hours, 12 hours or a day, and scan the QR code. No account, no port forwarding, nothing to change on your router.

What protects it — not the random hostname, which is a URL and therefore not a secret:

A key The QR carries a key as well as the address. The address alone opens a locked page.
A deadline It closes itself. A door left open by accident is the failure this exists to prevent.
No bot RPC /rpc/* is refused through the tunnel outright. It has its own key and it can spend.
A door for the pages An inscribed page runs in a sandbox that can carry no cookie, so it gets a second hostname of its own, opened alongside and never shown: it serves only the page's content and the page API (/content/*, /r/*), and answers 404 to everything else.

It tells a phone from this machine by Cloudflare's own headers, not by address — cloudflared runs on your machine and connects to 127.0.0.1, so a phone in another country arrives from localhost.


The bot RPC

A JSON-RPC endpoint for programs: airdrop bots, faucets, leaderboards, anything that reads balances or moves tokens without a person clicking.

See Bot RPC for the full method list.


Node-to-node messages

An encrypted channel for one arcade to talk to another — for marketplaces, bots and anything built on top.

On the chain rather than peer-to-peer because a custom P2P message does not propagate — Pepecoin tolerates an unknown command and drops it without forwarding. The mempool already gossips to every node in seconds.


Wallets, keys and backup


What it does not do