Security#crypto_base_asset only stripped a fiat suffix — "BTCUSD" gave "BTC" —
so it answered nil for the "CRYPTO:BTC" form, which is the form every crypto
integration writes: the on-chain wallets, Kraken, CoinStats and Binance all
store the prefix. display_logo_url feeds that nil to the crypto branch, so none
of those securities carried a logo at all.
Provider::BinancePublic already parses every shape it accepts — the pair form,
the prefixed pair, the bare base asset and the USD stablecoins — so this
delegates instead of growing a second parser next to it. The parsing moves to a
class method for that; the private instance method stays as a delegator, so its
own callers and their tests are untouched.
Verified across the four documented forms: CRYPTO:BTC and BTCUSD both give BTC,
CRYPTO:ETH gives ETH, CRYPTO:USDT gives USDT.
A logo still needs BRAND_FETCH_CLIENT_ID configured — this fixes the parsing,
not the hosting requirement.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>