Browser wallets accept JSON whose strings carry lone UTF-16 surrogate escapes
("\ud83d" without its pair); serde does not, so a page whose keyID or data
happened to contain one got 400 Failed to parse the request body as JSON: keyID: lone leading surrogate from this wallet while MetaNet Desktop served
the same call (beta soak, 2026-09-02, two logins lost). A browser’s encoder
turns such a code unit into U+FFFD when it hashes the string, so the same
substitution here yields the same bytes the JS wallet would derive from.