PAR-147
DC Economy Profiles Linking Issue
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
- 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 = ?;
- 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).
- Same-UUID duplicate: merge (move balance + repoint
ledger_postingsto 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 seen | accounts | balance | above $1,200 grant |
|---|---|---|---|
| ≤30d | 3,002 | $2,062,784 | $760,344 |
| 30–90d | 646 | $720,028 | $315,169 |
| 90–365d | 1,992 | $1,563,804 | $641,991 |
| >365d | 6,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:
- Resolve their account(s) by name → UUID via the directory; classify by UUID version (v4 = live Mojang, v3 = dead offline,
0000…= Floodgate). - Confirm it's genuinely one human (UUID-version pattern, Floodgate link, or just ask the player/staff knowledge) — never merge two v4 accounts.
- 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