Paradaux

PAR-147

0

DC Economy Profiles Linking Issue

CanceledHighrianBusinessBug

Symptom

A player has two DC economy profiles (two Treasury accounts); linking them to DC services reaches only one and the other is "unreachable". A staff $75k transfer had to be sent to the reachable profile.

Most likely cause (DC-specific — needs confirmation)

DC supports Bedrock via Floodgate, so one human can exist under two different UUIDs (their Java UUID and their Floodgate/Bedrock UUID). Each distinct owner_uuid_bin gets its own PERSONAL account, and the schema's uniqueness guard uq_one_personal_per_player (on owner_uuid_bin, economy-schema V1) is per-UUID, so two accounts under two UUIDs is permitted and presents as "two profiles". Explorer linking (explorer_identity: keycloak_sub → a single player_uuid_bin) binds to one UUID, so it can only reach one of them — exactly the report. (Less likely, but rule out: a genuine duplicate under the same UUID from a legacy import/race — the unique index should now prevent new ones.)

Investigate

  1. Identify the accounts and whether the two PERSONAL rows share a UUID or not:
SELECT account_id, account_type, HEX(owner_uuid_bin) AS uuid, display_name
FROM accounts WHERE display_name = ?;
  1. Dual-UUID (expected): decide the canonical policy — link both UUIDs to one identity and/or merge balances to a primary account, and make explorer linking Bedrock-aware (Floodgate exposes a linked-Java-account API).
  2. Same-UUID duplicate: merge (move balance + repoint ledger_postings to the surviving account, archive the other) and confirm the unique index is active in prod.

Acceptance

  • The player's economy profile is reachable as a single identity after remediation; a documented rule for dual-UUID (Bedrock) players going forward.
  • The specific $75k case reconciled.

Related: PAR-150 / PAR-149 (Bedrock name resolution), PAR-144 (account-identity collisions).

Comments

tesks · Jun 20, 2026, 11:11 PM

Decision: cancel the systematic remediation — handle stranded balances case-by-case

After a full prod investigation (read-only), a blanket merge is rejected as unsafe, and the systemic part isn't actually a fragmentation problem. We'll move money one-off, case-by-case (manual admin transfer, as already done for the $75k) when a player reports an unreachable balance. Findings below so the knowledge isn't lost.

Why the merge list was rejected (it would have combined strangers' money)

The "15 Class B" same-IGN dual-UUID list is mostly username reuse, not one human. Classifying all 30 accounts by UUID version:

  • 12 of 15 are two different Mojang (v4) UUIDs sharing one IGN. A Mojang UUID never changes, so two distinct v4 UUIDs on one name = the username was released by one account and claimed by another over time (e.g. Donkasaurous: one logged in 2020 @ $0, the other 2026 @ $1,215 — different people). Merging these would hand one stranger another's balance. Leave them alone.
  • Only 3 are genuine same-human (one offline v3 + one Mojang v4): bigpappa140 ($0/$0), lcn (v3 $0 / v4 $1,164.74), lawanoesepr (v3 $2,300 / v4 $1,314.80). Two have an empty duplicate — nothing to move.

The report's lawanoesepr primary was backwards

It picked the primary from firm_players, but that directory is corrupted for these players: firm_players.name_lower is UNIQUE, so when the player logs in under their second UUID the upsert hits the name collision and bumps the wrong row's last_seen. player_login_times (per-UUID) shows the truth — #17873 (v3) last logged in 2024, #57295 (v4, real Mojang) 2026-06-18. The live account is #57295. A merge following the report would have moved the $2,300 into the dead offline account. Reliable primary signal = UUID version (v4 Mojang = live, v3 offline = dead), never firm_players/last_seen.

Floodgate reality (the Class-A "two profiles" framing)

Linking is effectively not happening/adopted, and for most of the money it's the wrong lever. Floodgate (0000…-prefixed) PERSONAL accounts by last-seen (as of 2026-06-21):

last seenaccountsbalanceabove $1,200 grant
≤30d3,002$2,062,784$760,344
30–90d646$720,028$315,169
90–365d1,992$1,563,804$641,991
>365d6,942$1,211$0

3,002 Floodgate accounts active in 30 days holding $2.06M ($760k earned above grant) ⇒ a large population mains on Bedrock, unlinked. Most are Bedrock-only (no Java account) — nothing to link or merge; their Floodgate UUID is their correct, permanent identity, and the in-game economy already serves them (name resolution shipped in PAR-150). So this is not identity fragmentation.

What's actually left (carved out — not this ticket)

The only real systemic gap is web/explorer reachability for single-identity Bedrock players: 5,600 active Bedrock accounts ($4.3M) can't reach their wallet on the explorer because the link/auth flow effectively only accepts Java identities (10 of 437 links point at a Floodgate UUID). That's an explorer-authentication problem (how a Bedrock/Xbox identity proves itself to the web), independent of Treasury, linking, or merging. Recommend a separate ticket.

Case-by-case playbook (for the manual path)

When a player reports an unreachable / split balance:

  1. Resolve their account(s) by name → UUID via the directory; classify by UUID version (v4 = live Mojang, v3 = dead offline, 0000… = Floodgate).
  2. Confirm it's genuinely one human (UUID-version pattern, Floodgate link, or just ask the player/staff knowledge) — never merge two v4 accounts.
  3. Move funds into the live (v4 / current-login) account via a normal admin transfer (ledger-safe), archive the dead duplicate.

(lawanoesepr reference, if revisited: correct target is #57295, not #17873.)

Activity

  • tesks changed status to Status → Canceled
  • tesks commented
  • tesks description: Description updated
  • paradaux description: Description updated
  • paradaux changed status to Status → Planned
  • tesks created the issue