Repository navigation
Fix NFT page showing only Ethereum: IPFS gateway fallback, show-more, Solana wallet changes - #16
Merged
Merged
Conversation
… Solana wallet changes After #12 every Cardano NFT image pointed at the public ipfs.io gateway, which now answers hot-linked images with a Cloudflare challenge (HTTP 403/429). All Cardano and Algorand images failed to load; Gallery Mode hides tiles whose image fails, so only Ethereum NFTs were left, and the grid showed placeholders for every Cardano card. - New services/nft_display_images.py: one metadata image URL becomes an ordered list of browser-safe URLs. IPFS content (ipfs://, bare CID, any /ipfs/<cid> gateway URL) is offered on every configured gateway (NFT_DISPLAY_IPFS_GATEWAYS, default ipfs.blockfrost.dev, Pinata, ipfs.io, dweb.link); other URLs pass only if https:// or data:image/. - /nfts (Cardano) and /nfts/algorand return image_url + image_fallbacks. - v2 NFT page: a failed image tries the next gateway before giving up (grid, Gallery Mode, detail modal); only https:// / data:image/ URLs are used (closes the raw http:// fallback from the #12 review); the All Chains grid is no longer capped at 100 cards (Show more), so Algorand/Solana are reachable; collection objects render by name and the collection count is per chain. - Solana NFTs: the cache stores a SHA-256 of the Solana wallet set and is refetched when a wallet is added or removed, instead of hiding a new wallet's NFTs for up to 24 h (memory) / 30 days (persistent cache). - 36 new unit tests (mocked HTTP/DB/cache, synthetic data, no live calls). Task: ABCT-NFT-DIAG2-2026-09-28 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Overview
Labels (5 changes)
org.opencontainers.image.authors=Chris Catalano
org.opencontainers.image.base.name=python:3.11-slim
-org.opencontainers.image.created=2026-09-29T01:04:27.039Z
-org.opencontainers.image.description=A Better Crypto Tracker
+org.opencontainers.image.description=Multi-chain cryptocurrency portfolio tracker supporting Cardano, Ethereum, Bitcoin, Solana, Polygon, and Base
org.opencontainers.image.documentation=https://github.com/Tarrant64/abct/blob/main/README.md
org.opencontainers.image.icon=https://raw.githubusercontent.com/Tarrant64/abct/main/frontend/static/apple-touch-icon.png
org.opencontainers.image.licenses=MIT
-org.opencontainers.image.revision=4f68c10493f540619781490d297f71ab1c211ce8
org.opencontainers.image.source=https://github.com/Tarrant64/abct
-org.opencontainers.image.title=abct
+org.opencontainers.image.title=ABCT - A Better Crypto Tracker
org.opencontainers.image.url=https://github.com/Tarrant64/abct
org.opencontainers.image.vendor=ABCT Project
-org.opencontainers.image.version=latest
+org.opencontainers.image.version=1.12.3 |
This was referenced Sep 29, 2026
Tarrant64
added a commit
that referenced
this pull request
Sep 29, 2026
Split out of PR #17 (fix/evm-multichain-fanout) after independent review found its balance/token fan-out half wrong (native coin double-counted, spam ERC-20s priced by raw on-chain symbol) while judging the NFT half correct: http://192.168.50.240/data/2026-09-28/ABCT-PR17-REVIEW-2026-09-28.html Wallets are stored one-row-per-(address, blockchain), and a bare 0x address is always filed as 'ethereum' (utils/address.detect_blockchain only assigns polygon/base from an explicit prefixed address). /nfts/polygon and /nfts/base only ever asked Alchemy about addresses whose own row already said that chain, so a real Polygon/Base holder registered as 'ethereum' was invisible. Every EVM-family wallet (ethereum/polygon/base/ bsc/arbitrum/avalanche) is now a candidate address for Ethereum, Polygon and Base NFT fetches, deduplicated by address, with the existing spam filter, persistent cache and wipe-guard-on-provider-failure behaviour (#11/#16) plus the #16 wallet-set-fingerprint cache invalidation extended to Ethereum/Polygon/Base. Excludes services/evm_balance_fanout.py and the routers/portfolio.py balance-total wiring entirely -- that half is being reworked separately. Totals are unaffected by this PR. 8 unit tests in tests/unit/test_evm_fanout.py (mocked HTTP/DB, fake addresses, no live calls or real keys). Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
After #11 + #12 were deployed, the NFT page appeared to show only Ethereum NFTs.
Reproduced in a real (headless) browser against the deployed build:
/nftsreturned 299 Cardano NFTs, 296 of them with an image URL. Ethereum returned 31, Algorand 1.https://ipfs.io/ipfs/<cid>, and the public ipfs.io gateway now answers hot-linked images with a Cloudflare challenge (HTTP 403, or 429 without a browser user agent).dweb.link,w3s.linkandnftstorage.linkanswer the same way.[object Object], and the collection count was inflated (331).Fix
services/nft_display_images.pyturns one metadata image URL into an ordered list of browser-safe URLs.ipfs://,ipfs://ipfs/, a bare CID, and any/ipfs/<cid>gateway URL, with the sub-path percent-encoded and..rejected.https://ordata:image/.NFT_DISPLAY_IPFS_GATEWAYS. The default order isipfs.blockfrost.dev, then Pinata,ipfs.io,dweb.link.ipfs.blockfrost.devserved the same content in under a second when this PR was made./nfts(Cardano) and/nfts/algorandreturnimage_urlplusimage_fallbacks.nftImgFallback()tries the next URL before showing the placeholder or hiding the tile. This applies to the grid, Gallery Mode and the detail modal.https://anddata:image/URLs are ever used. This closes the rawhttp://nft.imagefallback noted in the Show Cardano NFT images on the NFT page; load Algorand NFTs in /next #12 review.Tests
tests/unit/test_nft_display_images.py: URL parsing, gateway ordering, the https-only rules, routes carrying fallbacks, Solana wallet-set invalidation and static checks of the page. One assertion intest_cardano_nft_images.pywas updated for the gateway change.main, so no new failures.Not in this PR
No Docker, compose, schema, auth or
mobile/changes.🤖 Generated with Claude Code