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.
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.
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.
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.
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.
Real user hit a stuck "Connecting..." state on the Crab chain on a
live build. Root cause: the ORIGINAL blacklist (before today's
cleanup) correctly listed this chain as "Darwinia Crab" with chain_id
86e49c...c3a - I dropped that entry during the 2026-07-08 blacklist ID
correction, having concluded it "no longer exists upstream" based on
a name search for "darwinia"/"crab" that didn't match because the
chain's actual name field is just "Crab", not "Darwinia Crab" - a
search-term miss, not evidence the chain or its chain_id had changed.
It's been in chains.json all along with the same id and the same dead
RPC (crab-rpc.darwinia.network, confirmed unreachable again live
2026-07-08).
Re-verified against live chains.json before re-adding - it's really
there, and the RPC is really dead.
Every account_overrides.json/chains_for_testBalance.json entry has a
32-byte hex "account" field - a public AccountId32 (Substrate's public
account identifier), not a private key. The two share the same byte
length/hex format, but are fundamentally different: one is meant to be
public (it's literally how you address a chain account), the other
must stay secret. The scanner's regex can't tell them apart and flags
every single one, which just triggered a false "Possible private key
found" failure on PR #33 (the master->main sync).
This isn't a one-off - it'll fire on every future sync PR too, since
chains_for_testBalance.json always has these fields. Left as "FAILURE"
long-term, it trains reviewers to ignore this specific check, which is
exactly the alarm-fatigue failure mode that would let a real leaked
secret slip through unnoticed.
Last remaining balances-test failures (2 of 112): both Polkadot and
Kusama's fixture account (inherited from upstream nova-utils) had
zero balance - reaped since the fixture was last updated, causing
"Balance was null" assertion failures. Not a CI/infra bug, not
related to Tron - genuinely stale test data.
Replaced with the Treasury pallet account (py/trsry) for both chains
- protocol-owned, continuously replenished from fees/inflation, never
reaped. This matches the fixture's own existing pattern (Moonbeam and
Moonriver both already use their crowdloan pallet account, not a
personal wallet).
The account (0x6d6f646c70792f74727372790000000000000000000000000000000000000000)
was independently verified two ways before use: derived by hand
(modl + py/trsry + zero padding) and cross-checked against
@polkadot/api's own derivation - both matched exactly - then its
balance was queried live against wss://rpc.polkadot.io (22,527,885,189,670
free) and wss://kusama-rpc.polkadot.io (25,368,610,181,623 free) to
confirm it's genuinely funded, not just plausible-looking.
Applied via a new pezkuwi-overlay/tests/account_overrides.json,
applied by sync_from_nova.py after the existing chain-filtering step,
rather than hand-editing the generated fixture output (which would be
overwritten on the next sync).
Latest CI run confirmed all remaining balances-test failures (50 of
160) were java.util.NoSuchElementException for chain ids no longer in
the app's config - both newly-blacklisted chains and a handful of
retired testnets (Westmint, Moonbase Alpha/Relay, Aleph Zero Testnet,
an old Xode id, RegionX) that the raw Nova fixture still references.
None were real balance/fee assertion failures - the app itself is
working correctly for every chain it actually has configured.
sync_tests() now filters chains_for_testBalance.json down to entries
whose chainId exists in the latest merged chains.json (v22, 80 -> 56
entries) instead of publishing Nova's fixture verbatim, so the test
only ever exercises chains the app can actually resolve - and stays
correct automatically as chains.json changes, instead of needing
separate manual upkeep alongside blocked-chains.json.
Follow-up to the previous stale-blacklist fix: with that fix live,
Android's balances_test.yml CI job progressed much further but still
hung for the full 25-minute job timeout. Live logcat + a full-log
retry analysis (grouping by host, comparing first/last timestamp
against the ~23 minute test window) showed 27 more chains whose nodes
were retried continuously for the ENTIRE run duration with zero
successful connections - as opposed to the ~90 other chains, which
connect once (or retry once or twice in the first ~2 minutes) and
then go quiet, i.e. genuinely healthy.
Every one of these 27 is a real, currently-dead third-party RPC
(Kusama Asset Hub, KILT, Crust Shadow, Phala, Mangata X, Joystream,
Mythos, Base, and 19 others) - not anything related to Tron or this
session's other changes. Each was matched to its current chain_id by
node URL against live chains.json, not guessed.
sync_from_nova.py's new stale-blacklist warning confirms all 33
entries (6 previous + 27 new) now match something in Nova's current
chain data - zero silently-ineffective entries this time.
This is inherently a moving target (third-party community RPC uptime
changes over time) - the warning added in the previous commit is what
makes that maintainable going forward instead of silently rotting for
another five months.
Root cause of the balances-test hang in pezkuwi-wallet-android (silent
for over an hour, cancelled multiple times before finding this):
every single chain_id in blocked-chains.json was stale - none matched
anything in Nova's current chains.json (last_updated 2026-02-11, ~5
months of upstream chain-id drift since). The blacklist mechanism
silently no-opped for all 6 entries, so none of the chains it was
meant to exclude were actually excluded.
With the blacklist ineffective, several chains with genuinely dead RPC
endpoints (confirmed live 2026-07-08: 3DPass, Curio, Quartz, Subsocial
- 502s, timeouts, SSL failures) stayed in the merged output. The
Android app's ChainConnection/NodeAutobalancer has no backoff/circuit
breaker for dead endpoints, so it retried them in an extremely tight
loop (~1 attempt/second, 1500-1800+ attempts observed in a 25 minute
window per chain) - burning resources indefinitely and starving the
app's actual chain-sync/test work, which is what made the Android CI
job hang for over an hour with zero progress.
Fix: re-verified and corrected all chain_ids (matching by current
name against live chains.json), added 3DPass/Curio/Subsocial which
weren't blacklisted before, dropped entries for chains no longer
present upstream at all (Passet Hub Testnet, Darwinia Crab, DeepBrain,
Exosama - nothing to block, kept them as historical noise otherwise).
Also added a stale-blacklist warning to sync_from_nova.py: it now
tracks which blocked chain_ids actually matched something in Nova's
current chains across all versions, and prints a warning listing any
that didn't - so this exact silent drift is caught at sync time going
forward instead of rotting unnoticed for another five months.
Android's BalancesIntegrationTest CI fetches this fixture directly
from raw.githubusercontent.com/.../master/tests/chains_for_testBalance.json,
but it never existed in this repo's output - only chains/, xcm/,
icons/, and staking/ were ever synced from nova-base by
sync_from_nova.py. This is why "Run balances tests" in
pezkuwi-wallet-android has been failing (FileNotFoundException) even
after fixing its CI infra and instrumentation-runner issues.
Only this one fixture is published from nova-base/tests/, not the
rest of that directory (upstream's own pytest suite for validating
its chains.json output, unused by anything in this repo or its
consumers).
- pezkuwi-overlay/chains/pezkuwi-chains.json: add Tron mainnet
(native TRX + USDT-TRC20) chain entry, plus new TRX/Tron icons
under pezkuwi-overlay/icons/ (the correct source location - synced
into the top-level icons/ output by sync_from_nova.py).
- Regenerate all chains/*, xcm/*, staking/* merged output via
sync_from_nova.py against the current nova-base submodule state.
- Also picks up previously-uncommitted local fixes: canonical
Telegram/Twitter links (t.me/kurdishmedya, x.com/bizinikiwi) in
README/docs/banners, and Pezkuwi mainnet + People chain SubQuery
staking overrides.
Staking pallet lives on Asset Hub, not Relay Chain.
- RC HEZ staking set to null
- AH HEZ staking enabled with relaychain and nomination-pools
- AH externalApi staking subquery URL added
- Removed RC staking override from global configs
The staking dashboard was showing INACTIVE because all Pezkuwi chains
(including Asset Hub) were routed to the relay chain SubQuery for
staking stats. The relay SubQuery only has relay chain activeStakers,
not AH pool stash accounts. Split the override so Asset Hub queries
its own SubQuery endpoint which has the pool stash data.