public interface IAccountGrainOne account's own state, which is not one character's. Doc 28 § Collections.
Remarks
Doc 27 § Grains does not have this one, and G8 is what showed it was missing. IPlayerGrain is keyed by account and character, and doc 28 says a collection is "account-wide" — a mount earned on one character is owned by all of them. There is no key on IPlayerGrain that can own that, so the alternative to this grain is the same rows written by five characters at once, which is the one thing the single-writer discipline exists to prevent.
What stays per character is what the character shows. Doc 28's wardrobe — transmog overrides, hidden slots, the worn title — is per character and rides in PlayerRecord.Profile. That split is the one G8 already built, and it happens to land exactly on the grain boundary.
⚠ It knows nothing about collectibles. The vocabulary is AccountUnlock — an address, a source and an order — because that is all doc 28's mechanism is, and because a game that declined the gameplay libraries still has accounts. Turning one into a CollectionRecord is Vixen.Live.Gameplay's.
⚠ No lease. A character's durable state is fenced by ADR-021's lease because two realms can each believe they hold the character. An account is written from wherever its characters happen to be, so the single writer is the grain's own turn and nothing else — which is why Unlock is idempotent on the address rather than on an epoch.
Methods (4)
Task<AccountHoldings> Holdings()Everything this account owns.
Task<bool> Unlock(AccountUnlock unlock)Gives the account something.
Task<bool> Earn(string address, int points)Records an achievement and what it is worth.
Task<bool> Revoke(string address)Takes something back — a refund, a season ending, a mistake.
Used by (1)
- AccountGrainVixen.Live.Orchestrator