# Item sales / buy value — static map of the model (for tracking across updates)

Goal: locate an item's **sell value / buy price** in the static files.

**Status:** same situation as [weapon damage](WEAPON_DAMAGE.md). The price *model* is fully
mapped statically (below). The actual *numbers* are **not** in any client asset — they live in
the **PlayFab Economy catalog** (server-side) and reach the client as network DTOs. See
[BACKEND_PLAYFAB.md](BACKEND_PLAYFAB.md) for how to acquire them at runtime without touching the
game process (BattlEye-safe).

## Price model (all static, in `il2cpp/dump.cs`)

A price is **"N units of a currency item"**, not a bare number:

| Type | Fields | Role |
|---|---|---|
| `PriceDto` | `string ItemDefinition`, `int Amount` | one price leg = *Amount* of currency-item *ItemDefinition* |
| `ItemDto` | `List<PriceDto> SellPrice` | what the item **sells** for |
| `ShopItemDto` | `string DefinitionName`, `int Amount`, `List<PriceDto> BuyPrice` | what a shop **sells** to you / its **buy** cost |
| `ShopItemSlotModel` (UI) | `int price`, `int requiredCurrencyAmount`, `string priceCurrencyItemName`, `bool isForSale`, `bool hasPrice`, `bool isTradable` | tooltip values, read off the DTO |
| `PriceDataComponent : BaseLongValueComponent` (TypeDefIndex 5822, `IItemContextComponent`) | `long value @+0x10` | per-item price as an Entitas component — structurally identical to the `DamageXxxDataComponent` pattern |
| `TransactionCurrencyData` | `Sprite sprite`, `int balance`, `Color color` | the wallet/currency shown in the store UI |
| `PawnShopDeliveryRewardDataComponent` | `string rewardItem`, `int rewardCount` | pawn-shop turn-in reward |

The currency item is **Crowns** (`item_coinCrown`) — the in-game money (the test conveyor
`1x item_wineBox → 1000x item_coinCrown` mints it). *(Currency identity inferred from the item
registry + that it's the only "coin" item; not yet confirmed against a live `PriceDto`.)*

Store plumbing: `StoreBuyContainer`, `StoreSellContainer`, `LobbyStoreModule`, `StoreData`,
`ShopInventoryContainer` — all under `Hologryph.Sand.Client.MainMenu.Ui.Store` (the **lobby**
store, i.e. between-runs, not in-world).

## The numbers are not in any asset (verified, same three ways as damage)

| Check | Result |
|---|---|
| `PriceDataComponent` across all 1446 EntityBlueprints (`bundle/component_census.py Price`) | **0** — not authored on any item |
| `PawnShop*` across all 1446 blueprints | 0 |
| `configuration_assets_all.bundle` MonoBehaviour classes (15 total) | no store/price/economy/shop config — only world/biome/loot/contract configs |
| `CheatItemDefinitionsData` item defs | `{Name, Type, StorageStack}` — no price field |

The giveaway is the naming: prices travel as **`...Dto`** (data-transfer objects) through
`LobbyStoreModule` — they are delivered by the backend, not baked into the client. So sales value
is **server-authoritative**, exactly like weapon damage.

## Re-deriving / tracking

- Diff the model across patches: re-locate `PriceDto`, `ItemDto.SellPrice`, `ShopItemDto.BuyPrice`,
  `PriceDataComponent` by signature.
- Get the actual numbers: query the PlayFab catalog — see
  [BACKEND_PLAYFAB.md](BACKEND_PLAYFAB.md). The catalog's `PriceOptions` are the source of these
  `PriceDto`s.

One adjacent thing that **is** static: `WorldContractsConfig` (delivery-contract rewards) is
authored in `configuration_assets_all.bundle`, so those reward amounts are extractable from the
bundle directly (a different economy than the store sell price).
