Same silent-drop class as 6b82731: main got the sharpened icons (fd9a9e4)
after master's compat revert had reverted them, and pending/post-fix-release
never touched them again - so the merge kept master's stale copies. Taken
verbatim from main.
The hardcoded-secret scan flags any 64-hex 0x value in JSON as a possible
private key. The restored balance-test fixtures store public 32-byte
account IDs under "account" fields - public data by definition, tripping
the scan as a false positive. Scope the exclusion to the exact field name
rather than loosening the pattern itself.
master's earlier compat-revert (e533923) deleted these paths; since pending/
post-fix-release never touched them again afterward, git's merge saw
'deleted on one side, untouched on the other' and silently kept them deleted
instead of conflicting. Restored verbatim from pending/post-fix-release:
test fixtures (tests/, pezkuwi-overlay/tests/), the pezkuwi-overlay TRX icon
copy, TAOapp dapp icon, and 7 preConfigured chain detail JSON files.
subquery-multisigs-prod.novasama-tech.org and subquery-proxy-prod.novasama-tech.org
never resolve in DNS - verified via getent/curl. Real upstream (novasamatech/nova-utils
global/config.json) uses subquery-accounts-prod.novasama-tech.org for both. Removed the
Pezkuwi overlay override entirely (it was never meant to diverge from Nova's own
multisig/proxy indexer) and corrected the merged output the Android app actually fetches.
Confirmed impact: the new Bridge Pending Signatures feature (feature-assets
BridgeMultisigInteractor.getPendingApprovals) calls this URL to decode arbitrary
pending multisig call content and silently returns nothing on failure (by design,
to avoid blind-signing) - this was the reason it never showed anything, verified by
submitting a real as_multi call on Polkadot Asset Hub and confirming the on-chain
approval existed but the app rendered nothing until this fix.
Both hardcoded a guessed subdomain (subquery-multisigs-prod, subquery-proxy-prod)
that never resolves in DNS. Real Nova indexer is subquery-accounts-prod - dropping
the override lets the merge pass through nova-base's own correct value instead.
Popular is a plain ordered array (app renders it verbatim, no sorting) -
reordered/added these 3 pezkuwi-owned dapps to the front in both the
release (dapps_full.json) and debug (dapps_dev.json) variants, keeping
the rest of the existing list in its prior relative order after them.
The solid #66F9A1 background was never Solana's actual brand color -
the real mark (and our own chain-icon gradient) uses a purple-to-teal
diagonal gradient (#9945FF -> #14F195), confirmed against Solana's own
official horizontal color logo. Same circle geometry/logomark as the
previous fix, only the fill changed from solid to gradient.
SOL.svg was a lone full-bleed 32x32 canvas with r=16 (the circle exactly
filled the icon bounds), while every other token icon (BTC, DOT, KSM,
HEZ, PEZ, LINK, TAO) uses a 48x48 canvas with an r=18 background circle,
leaving a margin so the app's dark background forms a consistent ring
around each token in the asset list. Reflowed the same logomark path
(unchanged) into that convention via a scale/translate group, matching
BTC.svg's own transform pattern.
The earlier PR (#55) only updated the pezkuwi-overlay source file, not
the generated chains/v*/[android/]chains*.json outputs the app actually
fetches at runtime (BuildConfig.CHAINS_URL points at
chains/v22/android/chains.json on this exact branch) - this is why a
real-device install still showed no Solana network/token. Mirrors
Bitcoin's own commit (78b0af9), which updated the overlay AND all 63
generated files in one change. Inserted right after the Bitcoin entry
in every v2-v22 chains.json/chains_dev.json/android/chains.json, using
ensure_ascii=False to avoid re-escaping unrelated non-ASCII chain names
already present in these files (caught and reverted a first attempt
that had done this by accident). Also copies the Solana icons into
pezkuwi-overlay/icons/ to match Bitcoin's dual-location icon pattern.
New pezkuwi-overlay chain entry mirroring the Tron/Bitcoin native-coin
config shape: solana:mainnet chainId, public mainnet-beta RPC endpoint,
Solana Explorer links, and a native SOL asset (9 decimals). New brand
icons (gradient chain icon + colored token icon) added alongside.
The previous commit added OnFinality's public-ws endpoint as a
failover, based on search results that turned out to be stale.
Direct WebSocket handshake test against
wss://aleph-zero.api.onfinality.io/public-ws returns HTTP 200 with an
"API Deprecated" HTML body, not a real upgrade - OnFinality has retired
free public access for this specific chain (their other chains'
public-ws endpoints, e.g. Altair/Bittensor, still work fine, so this
is Aleph-Zero-specific, not a platform-wide change). Keeping a
non-functional node in the config is worse than no fix, since it
masks the real failure mode. See conversation/memory for the fuller
investigation (dRPC's public endpoint completes a WS handshake but
rejects standard RPC methods; ws.azero.dev itself is a real, current,
likely-transient outage - the Foundation's main site is healthy).
Aleph Zero was configured with a single node (wss://ws.azero.dev,
the Foundation's own endpoint) and no nodeSelectionStrategy, so any
outage there fails the chain outright with no fallback - confirmed
live via direct curl (502 Bad Gateway from the endpoint's own nginx,
backend unreachable), which is what was timing out
BalancesIntegrationTest.testBalancesLoading/testFeeLoading[Aleph Zero]
in wallet-android CI. Aleph Zero itself is healthy and active (live
Foundation site/explorer, active aleph-node development, OnFinality/
Dwellir both offer public RPC for it) - this was a config gap, not a
dead chain. Added OnFinality's public endpoint as a second node with
roundRobin selection, matching the pattern already used for our own
Pezkuwi chain's 2-node setup.
Master never got the Bitcoin icon files (they landed only on
pending/post-fix-release, same branch CHAINS_URL is currently testing
against) - Tron's icon happened to already exist on master from an
earlier, unrelated commit, so it worked by coincidence while Bitcoin's
404'd. Confirmed live: master/icons/tokens/colored/BTC.svg -> 404,
pending/post-fix-release/... -> 200.
Same caveat as the CHAINS_URL override itself: revert to master once
this lands there in the coordinated release.
Adds a Bitcoin entry (assetId 0, type "bitcoinNative", precision 8) mirroring
Tron's chain-family shape: "bitcoinBased" + "noSubstrateRuntime" options, a
mempool.space REST API URL as the "node" (same role TronGrid's URL plays for
Tron), and mempool.space itself as the block explorer.
Adds gradient chain icon + colored token icon (orange #F7931A, built from
the existing white Bitcoin glyph already vendored from Nova, matching this
repo's established icon-construction pattern for every other coin).
Lands on pending/post-fix-release, not master - per the existing plan to
ship Tron and Bitcoin support together in one coordinated release once
wallet-android's corresponding send features are done.
icons/chains/gradient/Tron.svg is what NetworkFlowRvItem actually renders
per-row (chain.icon, not the token icon) - missed this one when restoring
the token-level TRX.svg earlier. Also restoring the pezkuwi-overlay copy
for consistency. Both are static assets, unrelated to the chains.json
parsing incompatibility that forced master back to 7a087cf.
Static asset, unrelated to the chains.json schema/parsing incompatibility
that forced master back to 7a087cf - the live app's chains.json doesn't
reference this file right now (no Tron chain config), so it's inert for
production, but pending/post-fix-release's config (and the eventual
coordinated release) already points at this exact path.
These two icon files are static assets unrelated to the chains.json
schema/parsing incompatibility that forced master/main back to
7a087cf - restoring just them doesn't reintroduce any of that risk.
Their URLs in chains.json are hardcoded to fetch from "main" regardless
of which branch/version served the chain list itself, so live users
(and this app's icon rendering, unrelated to the chain-sync issue) were
seeing the old blurry versions again once main got reverted.
The live Play Store release (wallet-android 85bde7e, published 2026-06-15)
was built against whatever was on this branch's HEAD at the time - which,
since master had received no commits between 2026-03-02 and this week, was
commit 7a087cf. This week's changes (nova-base sync, Tron config/icons,
balance test fixtures, etc.) are real and wanted, but they've made master
incompatible with that still-live app version, and live users installing
fresh right now get a completely empty tokens list because of it (the app's
chain sync silently fails whole-hog on any single malformed/incompatible
chain entry, leaving new installs with zero locally-cached chains).
This makes master's served content match 7a087cf exactly, stopping the
bleeding for current live users without needing an emergency app release.
None of this week's work is lost - it's all preserved on
pending/post-fix-release and will come back once wallet-android's Tron
send feature is complete and both repos can ship together in one
coordinated release.
auto-merge.yml only listened for the "Code Quality" workflow_run event.
Whenever "Security" (CodeQL etc., usually the slower of the two) finished
after Code Quality, the merge attempt fired too early, failed against the
still-pending required check, and nothing ever re-triggered it - the PR sat
open until someone noticed and merged it by hand. This is the actual cause
behind the recurring "master->main sync PR stuck" issue, not a one-off fluke.
Now listens for both workflows, and verifies every required check is
actually green (via `gh pr checks --required`) before merging rather than
trusting that the one workflow which fired us means everything is done -
whichever of the two finishes last will now successfully trigger the merge.
TRX.svg used a full-bleed r=24 circle (no margin) instead of the r=18
padded-circle frame every other token icon uses, making it visually
inconsistent in the token list. Scaled its icon path down to fit the
standard frame instead of redrawing it.
Also brings HEZ/PEZ's sharper re-render (already pushed to main in 962daf7)
onto master, since master and main currently serve different assets to the
app (main/master divergence is a known, separately-tracked issue) and this
keeps both consistent for now.
Both icons embedded a tiny (36-42px) raster PNG inside the badge - visibly
blurry at normal display sizes. Re-rendered from the original high-resolution
source artwork instead, and switched the background circle from r=24
(edge-to-edge, no margin) to r=18, matching the padded-circle framing every
other token icon (DOT, KSM, LINK, etc.) already uses.
sync-nova-base.yml checked out and PR'd against whatever branch GitHub
considers the repo default - which is 'main', a read-only mirror kept in
sync FROM master (auto-pr.yml/auto-merge.yml only flow master -> main,
never the reverse). master is what the live app actually fetches configs
from (see wallet-android's CHAINS_URL etc. all pointing at .../master/...).
Net effect: every one of the 29 accumulated 'Sync from Nova Base' PRs
(#1 through #36, 2026-02-09 through 2026-07-09) landed on a branch nothing
downstream ever reads, so 5 months of upstream Nova chain/RPC/asset
maintenance never reached production regardless of whether those PRs got
merged. Explicit ref/base: master makes future runs target the branch that
actually matters; the 29 stale main-targeted PRs are being closed as
superseded now that #36's content has been applied to master directly (see
next commit).
The FullSyncPaymentUpdater ordering-bug fix isn't Pezkuwi-specific - it
affects any chain's assets on a busy shared subscription connection.
'USDT on Polkadot Asset Hub not showing' was one of the 3 original
symptoms reported at the start of this investigation, alongside Tron
being disabled and Pezkuwi's own tokens missing. Add it to the fixture
so the fix's coverage is actually verified end to end, not assumed.
These 3 assetIds (1001/1002/1003) were added in 173f08a with icons
pointing at novasamatech/nova-utils (Nova's own repo, not Pezkuwi's)
and generic names/priceIds - clearly copied from a template rather than
verified against Pezkuwi's actual chain state.
Verified live via @pezkuwi/api against wss://asset-hub-rpc.pezkuwichain.io:
api.query.assets.asset(1) -> Live, real supply (PEZ, correct)
api.query.assets.asset(1000) -> Live, real supply (USDT, correct)
api.query.assets.asset(1001) -> None (DOT, does not exist)
api.query.assets.asset(1002) -> None (ETH, does not exist)
api.query.assets.asset(1003) -> None (BTC, does not exist)
This is what caused wallet-android's StatemineAssetBalance to silently
never complete a sync for these 3 assets - it was fetching details for
assets that were never created in pallet-assets, not a wallet bug. Also
removes them from the new pezkuwi_assets_for_testBalance.json fixture
so the test doesn't assert on assets that were never real.
chains_for_testBalance.json only has one entry per chain (native balance
via a raw RPC query, bypassing the app's real sync pipeline entirely -
this is why it couldn't catch the 2026-07-09 HEZ-on-Asset-Hub silent
sync failure). This new fixture covers individual assets (HEZ/PEZ/USDT/
DOT/ETH/BTC across Pezkuwi's 3 chains) and is meant to drive a test that
goes through the real BalancesUpdateSystem -> AssetCache pipeline, which
is what actually caught that bug.
chains_for_testBalance.json only has one entry per chain (native balance
via a raw RPC query, bypassing the app's real sync pipeline entirely -
this is why it couldn't catch the 2026-07-09 HEZ-on-Asset-Hub silent
sync failure). This new fixture covers individual assets (HEZ/PEZ/USDT/
DOT/ETH/BTC across Pezkuwi's 3 chains) and is meant to drive a test that
goes through the real BalancesUpdateSystem -> AssetCache pipeline, which
is what actually caught that bug.
The diagnostic (temporarily-remove-tron) didn't fix the live app -
confirmed the real cause was stale local app data on a specific test
device (large 98->68 chain diff against old cached state), resolved by
a clean reinstall on that device, and unrelated to Tron entirely.
Also fixes a real inconsistency found while restoring: Tron's USDT icon
pointed at the "main" branch while every other icon URL in this file
(including Tron's own chain icon and TRX's icon) points at "master" -
now consistent.
* test: add Pezkuwi's own chains to the balance test fixture
Nova's upstream fixture only covers chains it knows about - Pezkuwi (relay),
Pezkuwi Asset Hub, and Pezkuwi People never had test coverage at all, since
they don't exist in Nova's world. This adds them as a pure addition on top
of the existing filter+override pipeline, so the published
chains_for_testBalance.json now covers exactly what our merged chains.json
actually contains: Nova-inherited chains + our own ecosystem.
Test account is the mainnet Founder key, verified live via @pezkuwi/api on
2026-07-09 against all three chains: substantial non-zero, non-frozen free
balance and a high nonce (actively used) on each - not a guessed or reaped
account. See pezkuwi-overlay/tests/pezkuwi_chains_for_testBalance.json for
the exact verified figures.
* chore: retrigger CI now that master triggers are fixed
* diagnostic: temporarily remove Tron from published chains.json
Hypothesis: the live (already-published) Play Store app - unrelated to
any of today's wallet-android code changes, compiled months before Tron
support was ever added - stopped showing any tokens/networks around the
same time Tron was added to this shared chains.json (2026-07-07).
Tron's chainId ("tron:0x2b6653dc") is a third, previously-unseen format -
neither a 32-byte substrate genesis hash nor an "eip155:N" EVM id. If the
live app's pre-Tron code has any hardcoded assumption about chainId shape,
encountering this one malformed-from-its-perspective entry could throw
while processing the shared chain list - and per a related bug already
fixed on the wallet-android side today, a single chain's processing
failure can permanently kill sync for every chain, matching the observed
"completely empty" symptom.
This removes Tron from the published feed as a live, falsifiable test: if
the already-installed live app recovers after this goes out, the
hypothesis is confirmed and Tron needs a compatibility fix (in wallet-utils
and/or wallet-android) before being reintroduced. If it does NOT recover,
the hypothesis is wrong and the real cause is elsewhere.
Tron entry preserved for restoration once the compatibility issue (if
confirmed) is fixed - see pezkuwi-overlay/chains/pezkuwi-chains.json git
history (this commit's parent) for the full entry.
* chore: retrigger CI now that master triggers are fixed
master is where real development happens and gets pushed to directly
(main is the auto-synced mirror) - branch protection was just added to
master requiring these exact check contexts, but the workflows only
fired for PRs/pushes targeting main, so the required checks could never
actually run for a master PR, permanently blocking every future merge.