#7 · 2026-09-15 04:03 · Windows x64 open
I'll query the pepecoin-qt node on port 44873 directly using the arcade's RPC code (read-only) to trace what the sign-request message spent versus the buyer's coins, while also checking if the wallet can decrypt its own sealed message to recover the swap half. This is a bug in DogecoinArcade itself, on the buyer's side. The wallet spent its own swap coin to pay for the message that delivered the swap. The node and the inscription are both fine. ## What happened You ordered listing 1 from shop #79: 1,000 Arcade Test tokens for 8 coins. 1. The shop's node replied with an offer in block 1,488,874. 2. You approved it. The wallet signed its half of the swap and used your only coin output, `1e524550…:7` (4,999.66 coins at `nafri1qjJP3e…`). 3. The wallet then sent that half to the shop in message tx `aaa0a281…`. To pay the message fee, it picked the same output `1e524550…:7`. 4. When the shop's node checked the swap, input 1 had already been spent by that message. It replied "input 1 is spent or unknown" in block 1,488,877. ## Why, in the code - [swap.py:884](C:/Users/danie/.dogecoinarcade/src/arcade/swap.py:884): `build()` picks your coins with `listunspent` and never locks them. - [app.py:3112](C:/Users/danie/.dogecoinarcade/src/arcade/web/app.py:3112): `_hand_to_shop` calls `_page_send`, which pays for the message from the same address. It calls `sender.prepare()` without `exclude=`, even though that parameter exists. - Every message sends its change back to that same address, so it almost always has a single coin output. Both steps pick it every time. It will fail the same way if you retry now. Your address again has exactly one output (`aaa0a281…:14`) and nothing is locked. The offer has also expired (they last 15 minutes). The **Make an offer** flow for NFTs has the same bug. In [shopkeeper.py:205](C:/Users/danie/.dogecoinarcade/src/arcade/shopkeeper.py:205), `_bid` builds the swap half and `_reply` pays for the message from the same coins. ## Node and inscription check - **Node:** `pepecoin-qt` testnet is synced (1,488,898 of 1,488,898 blocks) with 2 peers. - **Inscription #79:** it's a valid shop. Its node key matches the key that sent both replies, and the shop answered within 1–3 blocks each time. Its own coin passed the check. ## Fix 1. When paying for the sign message, exclude the swap's inputs and lock them with `lockunspent` until the offer settles or expires. Do this in both `_hand_to_shop` and the shopkeeper's bid reply. 2. If the buyer's address has only one output, split it first (`MessageSender.split_outputs` already exists). Otherwise refuse at approval, instead of sending a message that can never work. **Workaround for now:** send about 5 coins to `nafri1qjJP3eRgjpDh62hmmaiTsZppaNqK` from another address in the wallet. Use Coin Control in Pepecoin-Qt so it doesn't spend nafri1's existing coin. Wait one confirmation, then order again. The swap picks the largest coin and the message picks the smallest one that covers it, so they won't collide. ## Smaller issues - [shopkeeper.py:210](C:/Users/danie/.dogecoinarcade/src/arcade/shopkeeper.py:210): a bid is marked "signed" before the reply is sent. If sending fails, it stays "signed" and nothing went out. - The server runs from a regular copy in `venv\Lib\site-packages\arcade`, not an editable install. Changes to `src\` won't take effect until you reinstall.