Prediction badge — local run at head 1ad3162c

buildShareDisplay() over the payload shapes the wallet sends after phantom/wallet#29343. Run locally in packages/services/share, backend PR #32370.

wallet PR #29343 shape — outcomeId sent, named competitor

Badge: Lewis Hamilton #1B4AC4

payload
{
  "kind": "new_position",
  "market": "prediction",
  "ticker": "KXF1DRIVER-26",
  "outcome": "Lewis Hamilton",
  "outcomeId": "driver-hamilton",
  "eventTitle": "F1 2026 Drivers' Champion",
  "chanceMultiplier": "4",
  "valueUsd": "25",
  "priceSeriesSet": [
    {
      "label": "Lewis Hamilton",
      "outcomeId": "driver-hamilton",
      "series": [
        "0.30",
        "0.28"
      ],
      "color": "#1B4AC4"
    },
    {
      "label": "Max Verstappen",
      "outcomeId": "driver-verstappen",
      "series": [
        "0.50",
        "0.52"
      ],
      "color": "#C41B4A"
    }
  ]
}
display (badge / heading / stats)
{
  "badge": {
    "text": "Lewis Hamilton",
    "colorHex": "#1B4AC4"
  },
  "heading": {
    "type": "multi_series",
    "title": "F1 2026 Drivers' Champion",
    "series": [
      {
        "text": "Lewis Hamilton"
      },
      {
        "text": "Max Verstappen"
      }
    ]
  },
  "stats": [
    {
      "label": "Outcome",
      "value": "Lewis Hamilton"
    },
    {
      "label": "Chance",
      "value": "25%"
    }
  ]
}

binary up/down — direction labels

Badge: Up #12B76A

payload
{
  "kind": "new_position",
  "market": "prediction",
  "ticker": "UpDownGe34",
  "outcome": "Up",
  "outcomeId": "up",
  "eventTitle": "BTC above $100k?",
  "chanceMultiplier": "2",
  "valueUsd": "10",
  "priceSeriesSet": [
    {
      "label": "Up",
      "outcomeId": "up",
      "series": [
        "0.60",
        "0.62"
      ],
      "color": "#12B76A"
    },
    {
      "label": "Down",
      "outcomeId": "down",
      "series": [
        "0.40",
        "0.38"
      ],
      "color": "#F04438"
    }
  ]
}
display (badge / heading / stats)
{
  "badge": {
    "text": "Up",
    "colorHex": "#12B76A"
  },
  "heading": {
    "type": "multi_series",
    "title": "BTC above $100k?",
    "series": [
      {
        "text": "Up"
      },
      {
        "text": "Down"
      }
    ]
  },
  "stats": [
    {
      "label": "Outcome",
      "value": "Up"
    },
    {
      "label": "Chance",
      "value": "50%"
    }
  ]
}

pre-id snapshot — old build, no outcomeId anywhere

Badge: — none —

payload
{
  "kind": "new_position",
  "market": "prediction",
  "ticker": "KXUSOPENW-26",
  "outcome": "Aryna Sabalenka \u2022 Yes",
  "eventTitle": "US Open 2026 Women's Singles Winner",
  "chanceMultiplier": "4",
  "valueUsd": "25",
  "priceSeriesSet": [
    {
      "label": "Aryna Sabalenka",
      "series": [
        "0.30",
        "0.28"
      ],
      "color": "#1B4AC4"
    }
  ]
}
display (badge / heading / stats)
{
  "badge": null,
  "heading": {
    "type": "multi_series",
    "title": "US Open 2026 Women's Singles Winner",
    "series": [
      {
        "text": "Aryna Sabalenka"
      }
    ]
  },
  "stats": [
    {
      "label": "Chance",
      "value": "25%"
    }
  ]
}

outcomeId naming no line

Badge: — none —

payload
{
  "kind": "new_position",
  "market": "prediction",
  "ticker": "KXUSOPENW-26",
  "outcome": "Aryna Sabalenka",
  "outcomeId": "missing-id",
  "eventTitle": "US Open 2026 Women's Singles Winner",
  "chanceMultiplier": "4",
  "valueUsd": "25",
  "priceSeriesSet": [
    {
      "label": "Aryna Sabalenka",
      "outcomeId": "sabalenka",
      "series": [
        "0.30"
      ],
      "color": "#1B4AC4"
    }
  ]
}
display (badge / heading / stats)
{
  "badge": null,
  "heading": {
    "type": "multi_series",
    "title": "US Open 2026 Women's Singles Winner",
    "series": [
      {
        "text": "Aryna Sabalenka"
      }
    ]
  },
  "stats": [
    {
      "label": "Chance",
      "value": "25%"
    }
  ]
}

Reading

Payloads carrying an outcomeId that identifies a line badge that line's label — no • Yes suffix — and take its color. Payloads identifying no line (old builds, or an id naming no line) carry no badge at all, which is the accepted break.

Note the series colour field is color, not colorHex; colorHex is the name on the served badge.