Releases: tribulnation/catalogue
Release list
python-v0.3.11
Published to PyPI as tribulnation-catalogue==0.3.11.
Python 0.3.11
Treat CoinMarketCap null quote prices as unavailable without discarding valid prices in the same batch. Keep full decimal precision and real zero prices; skip null current quotes and return None for null historical quotes. Malformed non-null prices still fail. Preserve ValidationError details instead of constructing an empty ApiError from its empty args.
Related: #230; Terminal integration tribulnation/terminal#148. Keep issues open for owner acceptance. Includes the already-released 0.3.10 CoinGecko 100-ID fix through main.
Evidence
Production VM, existing CMC key: HTTP 200, but the previous parser failed on null prices (including Raider Aurum, SOUNI and pSTAKE Finance). BTC/ETH-only requests already worked. This is a parsing bug, not a credential rejection.
Read-only diagnostic process loaded the proposed adapter source in memory, without editing installed files or writing production data. Full current mapping probe: 1,152 requested, 1,104 usable prices returned, including BTC and ETH. The other 48 IDs had no usable quote; they no longer reject the successful rows.
Validation
- 82 Python tests pass, including dictionary/list quote representations, mixed good/null/zero prices, full precision, historical null, and meaningful malformed-value errors.
- Full lib Pyright: 0 errors/warnings using explicit repository Python and PYTHONPATH=lib/src.
- Catalogue validation passes (1,599 assets, 254 platforms).
- Python 0.3.11 sdist and wheel build pass; whitespace check passes.
A HUMAN merge of release/python triggers the existing PyPI workflow. CONTRIBUTING.md prohibits agent merges/releases. No production dependency or data has changed; Terminal pinning, rollout and hosted freshness validation remain after publication. Missing-asset handling stays visible to Terminal's collection grading. This does not fix separate TwelveData credentials or establish the shared CoinGecko account allowance.
What's Changed
- Release Python 0.3.11: preserve valid CMC prices alongside null quotes by @marciclabas in #231
Full Changelog: python-v0.3.10...python-v0.3.11
python-v0.3.10
Published to PyPI as tribulnation-catalogue==0.3.10.
Python 0.3.10
Restore CoinGecko current-price batches to 100 IDs, reversing the batch-size increase in 31d759a. Keep explicit per_page=100 and precision=full. Update the HTTP-transport regression to reject oversized requests and verify that all 251 fixture IDs survive across 100/100/51 batches.
Related: #228; Terminal integration tribulnation/terminal#148. Keep issues open for owner acceptance.
Live evidence
Same production Azure VM, same existing Demo key:
- 250 requested IDs returned CloudFront 403.
- The exact same IDs succeeded in batches of 100/100/50.
- A read-only diagnostic process with the proposed constant fetched the full current 1,216 mapped IDs: 1,215 returned, including BTC and ETH. Only drunk-chicken-centipede was absent. No installed files, production data or schedules were changed.
The exact CloudFront rule is unknown. The tests establish a working bounded request shape, not a universal provider maximum.
Validation
- Full Python unit suite: 79 passed.
- Catalogue validation: passed (1,599 assets, 254 platforms).
- Pyright lib with the explicit repository Python interpreter and PYTHONPATH=lib/src: 0 errors/warnings.
- Python sdist and wheel build: passed for 0.3.10.
- git diff --check: passed.
Initial Pyright invocation without the correct interpreter/source path failed import resolution; the correctly configured full check passed.
Operational follow-up
At current mappings and two-hour cadence, 12 normal-ID requests plus 42 currency-reference requests = 54 calls/run, approximately 19,440 calls per 30 days before portfolio traffic/retries. This is a count projection, not confirmation of the account's plan or remaining allowance. Shared quota qualification and currency-request reduction remain separate follow-up work.
This is branch release/python: a HUMAN merge triggers the existing PyPI release workflow. CONTRIBUTING.md prohibits agent merges and releases; no merge or publication has been performed. Terminal remains on the old dependency until the published release is pinned, tested, deployed and fresh observation timestamps are verified end to end.
What's Changed
- CONTRIBUTING: only humans merge (GitHub UI); agents never merge or release by @marciclabas in #218
- catalogue-ops: resolve the 2026-10-02 findings (#210) by @marciclabas in #219
- plasma: map Aave v3 aPlaUSDT0 and aPlaXAUt0 by @marciclabas in #220
- Restore missing gradient in wrapped-eeth icon by @marciclabas in #222
- catalogue-ops: resolve the 2026-10-03 findings (#221) by @marciclabas in #223
- Release Python 0.3.10: restore 100-ID CoinGecko batches by @marciclabas in #229
Full Changelog: python-v0.3.9...python-v0.3.10
python-v0.3.9
Published to PyPI as tribulnation-catalogue==0.3.9.
0.3.9
- New optional protocol field
channels(network to its channel identifier to the network at the other end) andCatalogue.network_for_channel; theibcentry lists the dydx, noble, osmosis and axelar transfer channels of the dYdX -> noble -> osmosis -> axelar route, both directions. - New protocol
axelar: keyaxelar:{command_id}, the command id Axelar approves a call under and the destination gateway states inContractCallExecuted.
🤖 Generated with Claude Code
What's Changed
- Axelar protocol and an IBC channel table by @marciclabas in #216
- Release tribulnation-catalogue 0.3.9 by @marciclabas in #217
Full Changelog: python-v0.3.8...python-v0.3.9
python-v0.3.8
Published to PyPI as tribulnation-catalogue==0.3.8.
0.3.8
- Protocols may omit
correlationwhen no key can be derived by both sides;format_correlationandparse_correlationraiseCorrelationErrorfor them. - New optional protocol fields
chains(protocol chain name to network),assets(protocol asset name to asset) anddeposits(DepositLookupwithDepositFields, including an optional operationtime): a public per-address operations API for protocols that assign per-user deposit addresses. Catalogue.network_for_chainandCatalogue.asset_for_protocol.- New protocol
hyperunit.
🤖 Generated with Claude Code
What's Changed
- Resolve catalogue-ops findings for 2026-09-28 by @marciclabas in #199
- Resolve catalogue-ops findings for 2026-09-29 by @marciclabas in #202
- Add relay and lighter protocols (correlation keys) by @marciclabas in #205
- Resolve catalogue-ops findings for 2026-09-30 by @marciclabas in #206
- feat(noble): map uusdc to usd-coin by @marciclabas in #208
- Resolve catalogue-ops findings for 2026-10-01 by @marciclabas in #209
- Add Hyperliquid MAX; require a recorded search for unlisted providers by @marciclabas in #211
- Add Hyperunit protocol with a per-user deposit lookup by @marciclabas in #212
- Deposit lookups: optional operation time field by @marciclabas in #214
- Release tribulnation-catalogue 0.3.8 by @marciclabas in #213
- Protocol tests: guard optional keys for pyright by @marciclabas in #215
Full Changelog: python-v0.3.7...python-v0.3.8
python-v0.3.7
Published to PyPI as tribulnation-catalogue==0.3.7.
tribulnation-catalogue 0.3.7
Fixed
- Yahoo quotes in other currencies are now converted to USD.
YahooPricingnever read Yahoo'scurrencyfield, so non-US listings came back as local-currency values labelled USD. TSMC (2330.TW) was reported at a TWD 2,475 price and a ~64T market cap.current_statsnow multiplies price and market cap by Yahoo's{CCY}USD=Xrate (USD per one unit ofCCY, e.g.TWDUSD=X≈ 0.0314). The rates are fetched in one extra batch, and only when a batch has non-USD listings. Affected catalogue assets:taiwan-semiconductor,mediatek,delta-electronics,united-microelectronics(TWD),kokusai-electric(JPY) andlenovo-group(HKD). - Yahoo minor-unit currencies (
GBp/GBX,ZAc/ZAC,ILA) scale the price by 1/100. Yahoo already reports market cap in the major unit, e.g.VOD.Lat 123.9 GBp has a ~28.6B GBP market cap, so market cap is converted without scaling. - Yahoo
historical_priceconverts a non-USD close with the same day's close of the{CCY}USD=Xseries. Bars are now matched by exchange-local date, so FX series line up: their daily bars start at London midnight, which is 23:00 UTC the previous day in summer. The same change fixeshistorical_pricefor FX assets such asEURUSD=X, which used to return the next day's close. - TwelveData never relabels a currency. Current prices come from
/quote, which states the listing currency, instead of/price, which does not. Both cost one credit per symbol. Listings not in the requested quote are omitted, e.g.kokusai-electric's bare Tokyo code6525. Pairs such asEUR/USDare treated as quoted in their second leg.historical_priceapplies the same rule to the time seriesmeta.currency. This also stops USD listings from being returned as EUR whenquote='eur'.
Behaviour
- The adapters never return a value in another currency labelled as the quote currency. If a quote has no stated currency or its FX rate is unavailable, the symbol is left out of
current_statsorhistorical_pricereturnsNone, and a warning goes to thetribulnation.cataloguelogger. A failed FX request omits only the non-USD listings, and USD listings in the same call keep their prices. - USD listings are unchanged: they return the provider's exact
Decimalvalues and trigger no extra request. Conversions stay inDecimal.
Compatibility
- No public API changes. For the six non-USD assets above, consumers that stored these values will see a step change: prices and market caps drop by the FX rate (about ×1/32 for TWD, ×1/157 for JPY and ×1/7.8 for HKD).
Verification
- New
lib/tests/test_market_data_currency.py(14 tests, using Yahoo/TwelveData payloads recorded on 2026-09-29) covers USD passthrough, TWD/JPY/HKD conversion, minor units, a missing or non-USD rate, a failed FX request, a missing currency, historical conversion, and TwelveData non-USD/EUR handling. 12 of the 14 fail on 0.3.6.python -m unittest discover -s lib/tests: 73 tests OK.pyright lib(CI install): 0 errors.python -m build lib: OK.scripts/validate.py: 1528 assets, 254 platforms. Id stability: OK. - Live run on 2026-09-29 against all 156 catalogue
yahooids: all 156 were priced, so no USD listing was lost.2330.TW77.80 USD with a 2.017T market cap (TSM ADR 457.50 ≈ 5 shares plus the ADR premium),2454.TW154.33 / 246.5B,2308.TW57.68 / 149.8B,2303.TW4.82 / 60.5B,6525.T59.24 / 13.8B,0992.HK4.52 / 56.1B.historical_price('2330.TW', 2026-09-24)= 77.86.
Refs #201 and tribulnation/terminal#104.
What's Changed
- Add Lighter perpetuals for already-catalogued assets by @marciclabas in #197
- Release python 0.3.7 by @marciclabas in #203
Full Changelog: python-v0.3.6...python-v0.3.7
python-v0.3.6
Published to PyPI as tribulnation-catalogue==0.3.6.
tribulnation-catalogue 0.3.6
Changed
CoingeckoPricing.current_statsbatches/coins/marketsrequests at 250 ids (was 100) and sendsper_page=250, so each batch fits one full page. A full refresh makes about 2.5x fewer CoinGecko calls against the provider's monthly quota.
Compatibility
- No API changes. Results are unchanged; only the number of requests goes down.
Context
Terminal's prices_latest sampler makes 12 market batches every 30 minutes. Together with portfolio snapshots, that used up a 10,000-call CoinGecko Demo quota. Note that per_page has to change with the batch size: without it, the provider returns 100 rows and drops the rest of the batch. The new regression test checks this against the real SDK query.
What's Changed
- Map Lighter markets to existing assets by @marciclabas in #188
- Resolve catalogue-ops findings (2026-09-26) by @marciclabas in #190
- Add icons for 57 recently added assets; bStock house style by @marciclabas in #191
- Resolve catalogue-ops findings for 2026-09-27 by @marciclabas in #193
- Add xyz:EUR perpetual on Hyperliquid by @marciclabas in #194
- Release python 0.3.6 by @marciclabas in #195
Full Changelog: python-v0.3.5...python-v0.3.6
python-v0.3.5
Published to PyPI as tribulnation-catalogue==0.3.5.
tribulnation-catalogue 0.3.5
Added
protocolscollection: one entry per cross-chain protocol with a typed correlation key template (correlation: {key, fields}) and protocol data (CCTPdomains). Entries:cctp,ibc,hlbridge,gofast.Catalogue.protocols,protocol(id),network_for_domain(protocol, domain),domain_for_network(protocol, network).format_correlation(protocol, **fields)andparse_correlation(key), validated against the protocol entry; errors raiseCorrelationError(aValueError).- Validation of protocol entries: template placeholders equal the fields, known field types, domain networks exist, stable ids.
Compatibility
- Additive. 0.3.4 clients ignore
protocols/in the archive; 0.3.5 loads older archives with no protocols.
What's Changed
- Release js 0.2.2 by @marciclabas in #179
- Resolve catalogue-ops findings (2026-09-24) by @marciclabas in #181
- Resolve catalogue-ops findings (2026-09-25) by @marciclabas in #183
- Add Aster asset translations and trading instruments by @marciclabas in #184
- Map remaining Aster markets to existing assets by @marciclabas in #185
- Add protocols collection with cross-chain correlation keys by @marciclabas in #186
- Release python 0.3.5 by @marciclabas in #187
Full Changelog: python-v0.3.4...python-v0.3.5
python-v0.3.4
Published to PyPI as tribulnation-catalogue==0.3.4.
tribulnation-catalogue 0.3.4
Added
Catalogue.load()keeps a cacheddata.zipand refreshes it at most once permax_age(default 1 day) with a conditional request; keeps the last good copy when the site is unavailable. Newdigestandloaded_at, plusmaybe_refresh()/refresh()for long-running processes.- Lookups:
asset_for(platform, raw_id),perpetual_for(platform, id),debt_for(platform, address),network_for(platform, code),canonical_id(asset_id),asset(asset_id),translation_key,is_evm. - Optional
Asset.replaced_byaliases, followed by every lookup and validated. - Blockchain categories (incl.
substrate) and CAIP-2 chain ids — needed to load the currently published data.
Changed
- Asset tags that duplicated the category were removed.
- Loads from the live archive skip files the installed schema rejects, with a warning, instead of failing.
What's Changed
- Map Bitget's 96 highest-volume Reality rTokens by @marciclabas in #158
- Complete Bybit earn identities and expand market/transfer mappings by @marciclabas in #149
- Add icons for 50 new assets by @marciclabas in #159
- Expand Kraken market and transfer identity coverage by @marciclabas in #150
- Add icons for 465 new assets and all 57 icon-less platforms by @marciclabas in #161
- Expand KuCoin market, earn and transfer coverage by @marciclabas in #151
- Add icons for 270 new assets and the remaining 36 platforms by @marciclabas in #163
- Add icons for the fourth batch of new assets and platforms by @marciclabas in #164
- Repoint Dog (Bitcoin) at its own CoinGecko id by @marciclabas in #166
- Map the new Bybit ETF perps and three MEXC listings by @marciclabas in #167
- Remove asset tags that duplicate the category by @marciclabas in #171
- Paginate the site's big lists and add a dev deployment by @marciclabas in #173
- Fix the dev deploy workflow's invalid YAML by @marciclabas in #174
- Add official website links to assets and platforms missing one by @marciclabas in #172
- Release dev: paginated lists and dev deployment by @marciclabas in #176
- Add blockchain categories and CAIP-2 chain ids by @marciclabas in #175
- Live catalogue: daily conditional refresh, native-id lookups, id stability check by @marciclabas in #177
- Release python 0.3.4 by @marciclabas in #178
Full Changelog: python-v0.3.3...python-v0.3.4
js-v0.2.2
Published to npm as @tribulnation/catalogue@0.2.2.
@tribulnation/catalogue 0.2.2
Added
- Optional
replaced_byon assets (id aliases), matching the data and the Python library 0.3.4.
What's Changed
- Release python 0.3.3 by @marciclabas in #156
- Map Bitget's 96 highest-volume Reality rTokens by @marciclabas in #158
- Complete Bybit earn identities and expand market/transfer mappings by @marciclabas in #149
- Add icons for 50 new assets by @marciclabas in #159
- Expand Kraken market and transfer identity coverage by @marciclabas in #150
- Add icons for 465 new assets and all 57 icon-less platforms by @marciclabas in #161
- Expand KuCoin market, earn and transfer coverage by @marciclabas in #151
- Add icons for 270 new assets and the remaining 36 platforms by @marciclabas in #163
- Add icons for the fourth batch of new assets and platforms by @marciclabas in #164
- Repoint Dog (Bitcoin) at its own CoinGecko id by @marciclabas in #166
- Map the new Bybit ETF perps and three MEXC listings by @marciclabas in #167
- Remove asset tags that duplicate the category by @marciclabas in #171
- Paginate the site's big lists and add a dev deployment by @marciclabas in #173
- Fix the dev deploy workflow's invalid YAML by @marciclabas in #174
- Add official website links to assets and platforms missing one by @marciclabas in #172
- Release dev: paginated lists and dev deployment by @marciclabas in #176
- Add blockchain categories and CAIP-2 chain ids by @marciclabas in #175
- Live catalogue: daily conditional refresh, native-id lookups, id stability check by @marciclabas in #177
- Release python 0.3.4 by @marciclabas in #178
- Release js 0.2.2 by @marciclabas in #179
Full Changelog: js-v0.2.1...js-v0.2.2
python-v0.3.3
Published to PyPI as tribulnation-catalogue==0.3.3.
Bumps tribulnation-catalogue to 0.3.3.
Changes
AssetCategorygainsfund, for exchange-traded funds and other pooled vehicles (#155).
Why this needs a release
The catalogue data itself already shipped — the package downloads data.zip at runtime, so the five ETFs that moved stock → fund (SPY, QQQ, SOXL, EWY, DRAM) went live with the deploy on merge.
What is stale is the type. api/schema/assets.py declares category: AssetCategory | None, and pydantic validates that Literal at runtime, so 0.3.2 raises ValidationError on those five assets when parsing API responses. The data/schema.py TypedDicts are not runtime-validated, so users of the data layer see only a type-checker complaint.
Patch rather than minor: the change is a widened literal, matching how rwa was released in aeea8ab.
Generated by Claude Code
What's Changed
- icons: add icons for 154 assets that had none by @marciclabas in #115
- Fix Berachain external IDs and add external-ID checking by @marciclabas in #116
- Separate FRAX governance token from the legacy stablecoin by @marciclabas in #117
- Correct Bybit PURR, drop dated futures, delist stale markets by @marciclabas in #118
- Add JPYC and Monerium EURe, correct bCSPX and USDM by @marciclabas in #119
- Add official JPYC and Monerium EURe icons by @marciclabas in #120
- Repoint Kraken LIT to Heima, add Binance GoPro and Reddit bStocks by @marciclabas in #124
- skills: add batch_icons by @marciclabas in #125
- fix: mark Bitget Classic coin futures delisted by @marciclabas in #126
- Add icons for the five assets added in #124 by @marciclabas in #127
- Map missing Bit2Me earn asset identities by @marciclabas in #128
- Complete Deribit asset and network translations by @marciclabas in #129
- Complete KuCoin asset and network translations by @marciclabas in #131
- Add icons for frax-share and hyperliquid-strategies by @marciclabas in #132
- Add Twelve Data and Alpha Vantage IDs to hyperliquid-strategies by @marciclabas in #133
- assets: add nine fiat currencies, and peg the fiat stablecoins that wanted them by @marciclabas in #134
- Repoint Bybit SONIC to Sonic SVM by @marciclabas in #136
- fix(kucoin): declare exact perpetual exchange identity by @marciclabas in #137
- fix: add Coinbase ETH and CBETH translations by @marciclabas in #138
- fix: map Kraken native assets and add verified Spot pairs by @marciclabas in #140
- Map Deribit public markets and distinct yield fund assets by @marciclabas in #141
- Expand verified KuCoin spot and perpetual mappings by @marciclabas in #142
- Expand Kraken market, earn and transfer mappings by @marciclabas in #143
- Expand Bybit earn and transfer asset and network mappings by @marciclabas in #144
- Add ZetaChain (ZETA) and its Hyperliquid perpetual by @marciclabas in #153
- Complete verified Deribit crypto and equity perpetual mappings by @marciclabas in #148
- Add a fund asset category for exchange-traded funds by @marciclabas in #155
- Release js 0.2.1 by @marciclabas in #157
- Release python 0.3.3 by @marciclabas in #156
Full Changelog: python-v0.3.2...python-v0.3.3