Files
pezkuwi-wallet-android/CHANGELOG_PEZKUWI.md
T
pezkuwichain 22422c85da Redesign: brand-book alignment + forbidden-color purge (v1.1.0) (#3)
* redesign(colors): purge forbidden magenta/purple from palette

Brand book permits only the Kurdistan palette (kesk/sor/zer/fire) + navy.
Replace the four Nova-legacy violations in common colors.xml (names preserved,
so no references break):
- crowdloan_banner_gradient_start  #BD387F -> #009639 (kesk)
- networks_banner_gradient_end     #661D78 -> #017A2F (kesk-700)
- chip_on_card_background           #443679 -> #3D999EC7 (frosted periwinkle)
- button_wallet_connect_background  #353D67 -> #1F2A4D (neutral navy)

Repo-wide grep confirmed no other hardcoded magenta/purple literals or
purple/pink-named resources remain.

* redesign(type): adopt brand fonts (Space Grotesk / Plus Jakarta Sans / JetBrains Mono)

Brand book typography. Add OFL static fonts under common/res/font and repoint
the theme font attrs (consumed app-wide via ?attr/font* in styles.xml):
- fontRegular     -> Plus Jakarta Sans Regular (body/UI)
- fontSemiBold    -> Plus Jakarta Sans SemiBold
- fontBold/ExtraBold -> Space Grotesk Bold (display: balances, titles)
- fontExtraLight  -> Plus Jakarta Sans Light
- Monospace text appearance (addresses/hashes) -> JetBrains Mono

Static TTFs chosen (minSdk 24 < variable-font API 26). All five verified to
cover Turkish + Kurdish Kurmancî glyphs (ş ğ ı İ ê î û ç …).

* redesign(splash): replace map+wordmark logo with Newroz flame brand mark

The first-launch splash logo (ic_loading_screen_logo) showed a Kurdistan map
with a baked-in wordmark. Per the brand book the mark is the Newroz flame.
Rasterized assets/nevroz-fire-flame.svg into the existing 6 density slots
(same pixel dimensions = drop-in, no bg_splash.xml change, transparent WebP so
it composites cleanly over the splash background).

* redesign(onboarding): welcome hero -> Global United States of Pezkuwi

Replace the legacy onboarding hero (ic_create_wallet_background, whose six
density PNGs had inconsistent broken dimensions) with the brand 'Global United
States of Pezkuwi' infographic. Consolidate to a single high-res WebP in
drawable-nodpi (1408x768, 204K vs 1.75MB PNG) and switch the welcome ImageView
scaleType centerCrop -> fitCenter so it shows full and uncropped above the
CTA buttons, per the brand book.

* redesign(assets): purge magenta/purple from raster illustrations

colors.xml only covers named colors; these raster drawables still carried
forbidden magenta/purple/pink pixels. Selectively rotate the 255-350 deg hue
band (purple-magenta-pink) toward kesk green/teal across all densities,
preserving gradients, shapes and the on-brand blues:
- ic_pink_siri, ic_networks_banner_image, ic_no_added_networks,
  ic_import_option_hardware, tinder_gov (6 densities each).
Third-party ic_powered_by_oak (OAK Network trademark) left untouched.
crowdloan_banner_image is being handled separately.

* redesign(assets): de-pink crowdloan banner across all densities

The crowdloan banner's magenta sphere was recolored to brand sor red (xxxhdpi).
Propagate that fix to the other five densities by downscaling the corrected
xxxhdpi master (LANCZOS), so every device shows the same brand-clean banner.
Pink-pixel scan now 0% on all six variants.

* chore: remove pre-production debug code (release-blocker)

CHANGELOG_PEZKUWI listed debug code to strip before production; two items were
still live:
- FeeLoaderV2Provider: the fee-retry dialog showed a raw "DEBUG: <err> | Runtime:
  <diagnostics>" string to users -> reverted to the localized resource string and
  dropped the diagnostics lookup.
- RuntimeFactory: removed the companion lastDiagnostics field and its assignment
  (plus the now-dangling diagnostic vars), and the matching log line in the
  PezkuwiLiveTransferTest androidTest.
Items #3-#6 were already clean. Repo now has no 'DEBUG:' literals or
lastDiagnostics references. CHANGELOG marked cleaned.

* docs: add BRAND.md — enforceable wallet brand rules

Kurdistan-only palette (no pink/magenta/purple), brand fonts, Newroz flame mark,
a PR brand checklist with a raster pink-scan snippet, the third-party-logo
exception, and the Apache-2.0 attribution rule (keep LICENSE/NOTICE). Points to
the canonical brand book at wiki.pezkuwichain.io/brand.

* release: bump versionName to 1.1.0 (brand-book UI redesign)

Live Play version is 1.0.4; minor bump for the UI redesign. versionCode stays
CI-managed (CI_BUILD_ID). Add the v1.1.0 entry to CHANGELOG_PEZKUWI.
2026-06-14 22:20:33 -07:00

16 KiB
Raw Blame History

PezWallet Android - Pezkuwi Uyumluluk Değişiklikleri

Bu dosya, Pezkuwi chain uyumluluğu için yapılan tüm değişiklikleri takip eder. Context sıfırlanması durumunda referans olarak kullanılmalıdır.


v1.1.0 — Brand-book UI redesign (2026-06-15)

Görsel kimlik Pezkuwi marka kitabına hizalandı; iş mantığına dokunulmadı.

  • Renkler: colors.xml'deki yasak magenta/mor değerleri marka renkleriyle değiştirildi (isimler korundu). Raster illustration'lardaki pembe/mor pikseller (siri, networks banner, no-added-networks, hardware import, tinder-gov, crowdloan) kesk/teal'e retint edildi. Üçüncü-taraf OAK logosuna dokunulmadı.
  • Tipografi: Public Sans → Space Grotesk (display) + Plus Jakarta Sans (gövde) + JetBrains Mono (adres/hash). TR + Kurmancî glifleri doğrulandı.
  • Splash: Kurdistan-haritalı logo → Newroz alevi marka işareti.
  • Onboarding: welcome hero → "Global United States of Pezkuwi" infografiği (tam/kırpılmadan).
  • Hijyen: production-öncesi debug kodları kaldırıldı (FeeLoader user-facing DEBUG mesajı, RuntimeFactory diagnostics). Brand kuralları için BRAND.md eklendi.

DEBUG KODLARI — TEMİZLENDİ (2026-06-15, v1.1.0 öncesi)

Aşağıdaki tüm debug kodları production'a çıkmadan kaldırıldı: #1 FeeLoaderV2Provider (kullanıcıya görünen DEBUG hata mesajı) ve #2 RuntimeFactory (lastDiagnostics + test referansı) bu sürümde temizlendi; #3#6 zaten kaldırılmıştı. Doğrulama: repoda "DEBUG: literali / lastDiagnostics referansı kalmadı. (Aşağıdaki kayıtlar tarihsel referans içindir.)

1. FeeLoaderV2Provider.kt - Hata mesajı gösterimi

Dosya: feature-wallet-api/src/main/java/io/novafoundation/nova/feature_wallet_api/presentation/mixin/fee/v2/FeeLoaderV2Provider.kt Değişiklik:

// ÖNCE:
message = resourceManager.getString(R.string.choose_amount_error_fee),

// SONRA (DEBUG):
message = "DEBUG: $errorMsg | Runtime: $diagnostics",

Temizleme:

  • "DEBUG: $errorMsg | Runtime: $diagnostics"resourceManager.getString(R.string.choose_amount_error_fee) olarak geri al
  • val diagnostics = try { ... } bloğunu kaldır

2. RuntimeFactory.kt - Diagnostic değişken ve log'lar

Dosya: runtime/src/main/java/io/novafoundation/nova/runtime/multiNetwork/runtime/RuntimeFactory.kt Eklenenler:

// Companion object içinde:
companion object {
    @Volatile
    var lastDiagnostics: String = "not yet initialized"
}

// constructRuntimeInternal içinde:
lastDiagnostics = "typesUsage=$typesUsage, ExtrinsicSig=$hasExtrinsicSignature, MultiSig=$hasMultiSignature, typeCount=${types.size}"

// Log satırları:
Log.d("RuntimeFactory", "DEBUG: TypesUsage for chain $chainId = $typesUsage")
Log.d("RuntimeFactory", "DEBUG: Loading BASE types for $chainId")
Log.d("RuntimeFactory", "DEBUG: BASE types loaded, hash=$baseHash, typeCount=${types.size}")
Log.d("RuntimeFactory", "DEBUG: Chain $chainId - ExtrinsicSignature=$hasExtrinsicSignature, MultiSignature=$hasMultiSignature, typesUsage=$typesUsage, typeCount=${types.size}")
Log.d("RuntimeFactory", "DEBUG: BaseTypes loaded, length=${baseTypesRaw.length}, contains ExtrinsicSignature=${baseTypesRaw.contains("ExtrinsicSignature")}")
Log.e("RuntimeFactory", "DEBUG: BaseTypes NOT in cache!")

Temizleme:

  • companion object { ... } bloğunu kaldır
  • lastDiagnostics = ... satırını kaldır
  • Tüm Log.d/Log.e("RuntimeFactory", "DEBUG: ...") satırlarını kaldır

3. CustomTransactionExtensions.kt - Log satırları

Dosya: runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/CustomTransactionExtensions.kt Temizlenecek: Tüm Log.d(TAG, ...) satırları ve private const val TAG tanımı


4. ExtrinsicBuilderFactory.kt - Log satırları

Dosya: runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/ExtrinsicBuilderFactory.kt Temizlenecek: Tüm Log.d(TAG, ...) satırları ve private const val TAG tanımı


5. PezkuwiAddressConstructor.kt - Log satırları

Dosya: common/src/main/java/io/novafoundation/nova/common/utils/PezkuwiAddressConstructor.kt Temizlenecek: Tüm Log.d(TAG, ...) satırları ve private const val TAG tanımı


6. RealExtrinsicService.kt - Extrinsic build hata log'u

Dosya: feature-account-impl/src/main/java/io/novafoundation/nova/feature_account_impl/data/extrinsic/RealExtrinsicService.kt Eklenen:

val extrinsic = try {
    extrinsicBuilder.buildExtrinsic()
} catch (e: Exception) {
    Log.e("RealExtrinsicService", "Failed to build extrinsic for chain ${chain.name}", e)
    Log.e("RealExtrinsicService", "SigningMode: $signingMode, Chain: ${chain.id}")
    throw e
}

Temizleme: try-catch bloğunu kaldır, sadece extrinsicBuilder.buildExtrinsic() bırak


FEATURE DEĞİŞİKLİKLERİ (Kalıcı)

1. PezkuwiAddressConstructor.kt - YENİ DOSYA

Dosya: common/src/main/java/io/novafoundation/nova/common/utils/PezkuwiAddressConstructor.kt Açıklama: Pezkuwi chain'leri için özel address constructor. SDK'nın AddressInstanceConstructor'ı "Address" type'ını ararken, Pezkuwi "pezsp_runtime::multiaddress::MultiAddress" kullanıyor.


2. RuntimeSnapshotExt.kt - Address type lookup

Dosya: runtime/src/main/java/io/novafoundation/nova/runtime/util/RuntimeSnapshotExt.kt Değişiklik: Birden fazla address type ismi deneniyor:

val addressType = typeRegistry["Address"]
    ?: typeRegistry["MultiAddress"]
    ?: typeRegistry["sp_runtime::multiaddress::MultiAddress"]
    ?: typeRegistry["pezsp_runtime::multiaddress::MultiAddress"]
    ?: return false

3. Signed Extension Dosyaları - YENİ DOSYALAR

Dosyalar:

  • runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/AuthorizeCall.kt
  • runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/CheckNonZeroSender.kt
  • runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/CheckWeight.kt
  • runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/WeightReclaim.kt
  • runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/PezkuwiCheckMortality.kt

Açıklama: Pezkuwi chain'leri için özel signed extension'lar


3.1. PezkuwiCheckMortality.kt - YENİ DOSYA

Dosya: runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/PezkuwiCheckMortality.kt Açıklama: SDK'nın CheckMortality'si metadata type lookup yaparak encode ediyor ve Pezkuwi'de bu başarısız oluyordu ("failed to encode extension CheckMortality" hatası). Bu custom extension, Era ve blockHash'i doğrudan encode ediyor. Neden gerekli: SDK CheckMortality, Era type'ını metadata'dan arıyor. Pezkuwi metadata'sında Era type'ı pezsp_runtime.generic.era.Era DictEnum olarak tanımlı ve SDK bunu handle edemiyor.

Kod:

class PezkuwiCheckMortality(
    era: Era.Mortal,
    blockHash: ByteArray
) : FixedValueTransactionExtension(
    name = "CheckMortality",
    implicit = blockHash,  // blockHash goes into signer payload
    explicit = createEraEntry(era)  // Era as DictEnum.Entry
)

4. CustomTransactionExtensions.kt - Pezkuwi extension logic

Dosya: runtime/src/main/java/io/novafoundation/nova/runtime/extrinsic/CustomTransactionExtensions.kt Değişiklik: isPezkuwiChain() fonksiyonu eklendi, Pezkuwi için farklı extension'lar kullanılıyor


5. Address encoding yaklaşımı değişikliği

Eski yaklaşım: AddressInstanceConstructor veya PezkuwiAddressConstructor ile type ismine göre tahmin Yeni yaklaşım: argumentType("dest").constructAccountLookupInstance(accountId) ile metadata'dan gerçek type alınıyor

Güncellenen dosyalar:

  1. feature-wallet-api/.../ExtrinsicBuilderExt.kt - YENİ YAKLAŞIM: metadata'dan type alıyor
  2. feature-governance-impl/.../ExtrinsicBuilderExt.kt - Zaten doğru yaklaşımı kullanıyordu
  3. Diğer dosyalar hala PezkuwiAddressConstructor kullanıyor (gerekirse güncellenecek):
    • feature-staking-impl/.../ExtrinsicBuilderExt.kt
    • feature-staking-impl/.../NominationPoolsCalls.kt
    • feature-proxy-api/.../ExtrinsicBuilderExt.kt
    • feature-wallet-impl/.../StatemineAssetTransfers.kt
    • feature-wallet-impl/.../OrmlAssetTransfers.kt
    • feature-wallet-impl/.../NativeAssetIssuer.kt
    • feature-wallet-impl/.../OrmlAssetIssuer.kt
    • feature-wallet-impl/.../StatemineAssetIssuer.kt
    • feature-account-impl/.../ProxiedSigner.kt

6. CHAINS_URL - GitHub'a yönlendirme

Dosya: runtime/build.gradle Değişiklik:

// ÖNCE:
buildConfigField "String", "CHAINS_URL", "\"https://wallet.pezkuwichain.io/chains.json\""

// SONRA:
buildConfigField "String", "CHAINS_URL", "\"https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/v22/android/chains.json\""

Neden: wallet.pezkuwichain.io/chains.json Telegram miniapp için kullanılıyor ve "types": null. Android için ayrı chains.json gerekli.


7. chains/v22/android/chains.json - Android-specific chains

Repo: pezkuwi-wallet-utils Dosya: chains/v22/android/chains.json Açıklama: Android uygulama için özel chains.json. wallet.pezkuwichain.io'dan kopyalandı ve şu değişiklikler yapıldı:

  • "types": { "overridesCommon": false } eklendi (TypesUsage.BASE için)
  • "feeViaRuntimeCall": true eklendi Etkilenen chain'ler:
  • Pezkuwi Mainnet (bb4a61ab0c4b8c12f5eab71d0c86c482e03a275ecdafee678dea712474d33d75)
  • Pezkuwi Asset Hub (00d0e1d0581c3cd5c5768652d52f4520184018b44f56a2ae1e0dc9d65c00c948)
  • Pezkuwi People Chain (58269e9c184f721e0309332d90cafc410df1519a5dc27a5fd9b3bf5fd2d129f8)
  • Zagros Testnet (96eb58af1bb7288115b5e4ff1590422533e749293f231974536dc6672417d06f)

8. default.json - MultiAddress inline tanımı

Repo: pezkuwi-wallet-utils Dosya: chains/types/default.json Değişiklik: MultiAddress artık GenericMultiAddress'e referans vermiyor, inline enum olarak tanımlı:

"MultiAddress": {
  "type": "enum",
  "type_mapping": [
    ["Id", "AccountId"],
    ["Index", "Compact<u32>"],
    ["Raw", "Bytes"],
    ["Address32", "H256"],
    ["Address20", "H160"]
  ]
}

Neden: v14Preset() GenericMultiAddress içermiyor, bu yüzden type çözümlenemiyordu.


9. PezkuwiIntegrationTest.kt - YENİ DOSYA

Dosya: app/src/androidTest/java/io/novafoundation/nova/PezkuwiIntegrationTest.kt Açıklama: Pezkuwi chain'leri için integration testleri:

  • Runtime type kontrolü (ExtrinsicSignature, MultiSignature, Address, MultiAddress)
  • ExtrinsicBuilder oluşturma
  • Transfer call yapısı kontrolü
  • Signed extensions kontrolü
  • Utility asset kontrolü Çalıştırma:
./gradlew :app:connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=io.novafoundation.nova.PezkuwiIntegrationTest

10. GitHub Actions - Branch senkronizasyonu

Dosya: .github/workflows/sync-branches.yml Açıklama: main ve master branch'lerini otomatik senkronize eder.

  • main'e push → master güncellenir
  • master'a push → main güncellenir

7. pezkuwi.json - Chain-specific types (ASSETS)

Dosya: runtime/src/main/assets/types/pezkuwi.json Açıklama: Pezkuwi chain'leri için özel type tanımları

{
  "types": {
    "ExtrinsicSignature": "MultiSignature",
    "Address": "pezsp_runtime::multiaddress::MultiAddress",
    "LookupSource": "pezsp_runtime::multiaddress::MultiAddress"
  },
  "typesAlias": {
    "pezsp_runtime::multiaddress::MultiAddress": "MultiAddress",
    "pezsp_runtime::MultiSignature": "MultiSignature",
    "pezsp_runtime.generic.era.Era": "Era"
  }
}

NOT: Bu dosya şu anda kullanılmıyor çünkü TypesUsage.BASE kullanılıyor. TypesUsage.BOTH veya OWN için chains.json'da URL eklenebilir.


SORUN GEÇMİŞİ

  1. "Network not responding" - Fee hesaplama hatası

    • Çözüm: feeViaRuntimeCall eklendi, custom signed extension'lar eklendi
  2. "IllegalStateException: Type Address was not found" - Address type lookup hatası

    • Çözüm: RuntimeSnapshotExt.kt'de birden fazla type ismi deneniyor
  3. "EncodeDecodeException: is not a valid instance" - Address encoding hatası

    • Çözüm: argumentType("dest").constructAccountLookupInstance(accountId) ile metadata'dan gerçek type alınıyor (ExtrinsicBuilderExt.kt)
  4. "failed to encode extension CheckMortality" - CheckMortality encoding hatası

    • SDK'nın CheckMortality'si metadata type lookup yaparak Era'yı encode etmeye çalışıyor
    • Pezkuwi Era type'ı pezsp_runtime.generic.era.Era DictEnum olarak tanımlı
    • Çözüm: PezkuwiCheckMortality custom extension'ı oluşturuldu, Era'yı DictEnum.Entry("MortalX", secondByte) olarak veriyor
  5. "IllegalStateException: Type ExtrinsicSignature was not found" - ExtrinsicSignature type hatası ÇÖZÜLDÜ

    • SDK "ExtrinsicSignature" type'ını arıyor ama Pezkuwi chain'leri "types": null kullanıyordu
    • TypesUsage.NONE olduğu için base types (default.json) yüklenmiyordu
    • Çözüm:
      • runtime/build.gradle içinde CHAINS_URL GitHub'a yönlendirildi
      • pezkuwi-wallet-utils/chains/v22/android/chains.json oluşturuldu ("types": { "overridesCommon": false })
      • Artık TypesUsage.BASE kullanılıyor ve default.json yükleniyor
  6. "IllegalStateException: Type Address was not found" - Address type hatası ÇÖZÜLDÜ

    • v14Preset() GenericMultiAddress içermiyor
    • default.json'da "MultiAddress": "GenericMultiAddress" tanımlıydı ama GenericMultiAddress çözümlenemiyordu
    • Çözüm: default.json'da MultiAddress inline enum olarak tanımlandı:
    "MultiAddress": {
      "type": "enum",
      "type_mapping": [
        ["Id", "AccountId"],
        ["Index", "Compact<u32>"],
        ["Raw", "Bytes"],
        ["Address32", "H256"],
        ["Address20", "H160"]
      ]
    }
    
  7. "TypeReference is null" - Transfer onaylama hatası (DEVAM EDİYOR)

    • Fee hesaplama çalışıyor
    • Transfer onaylama sırasında hata oluşuyor
    • Muhtemelen signing sırasında bir type çözümlenemiyor
    • Debug logging eklendi: RealExtrinsicService.kt
    • Stack trace bekleniyor

ÇALIŞAN İMPLEMENTASYONLAR (Referans)

1. pezkuwi-extension (Browser Extension)

Konum: /home/mamostehp/pezkuwi-extension/ Nasıl çalışıyor:

  • @pezkuwi/types (polkadot.js fork) kullanıyor
  • TypeRegistry ile dynamic type handling
  • Custom user extensions:
const PEZKUWI_USER_EXTENSIONS = {
  AuthorizeCall: {
    extrinsic: {},
    payload: {}
  }
};
  • registry.setSignedExtensions(payload.signedExtensions, PEZKUWI_USER_EXTENSIONS) ile extension'lar ekleniyor
  • Metadata'dan registry oluşturuluyor: metadataExpand(metadata, false)

2. pezkuwi-subxt (Rust)

Konum: /home/mamostehp/pezkuwi-sdk/vendor/pezkuwi-subxt/ Nasıl çalışıyor:

  • Rust'ta compile-time type generation
  • Metadata'dan otomatik type oluşturma

3. Telegram Miniapp

  • Web tabanlı, polkadot.js kullanıyor
  • "types": null ile çalışıyor çünkü metadata v14+ self-contained

TEMİZLEME KONTROL LİSTESİ

Production release öncesi yapılacaklar:

  • FeeLoaderV2Provider.kt - DEBUG mesajını ve diagnostics'i kaldır
  • RuntimeFactory.kt - companion object ve debug log'ları kaldır
  • CustomTransactionExtensions.kt - Log satırlarını kaldır
  • ExtrinsicBuilderFactory.kt - Log satırlarını kaldır
  • PezkuwiAddressConstructor.kt - Log satırlarını kaldır (varsa)
  • RealExtrinsicService.kt - try-catch debug bloğunu kaldır
  • Test et: Fee hesaplama çalışıyor mu?
  • Test et: Transfer işlemi çalışıyor mu? (TypeReference hatası devam ediyor)

TYPE LOADING AKIŞI (Referans)

chains.json
    ↓
"types": { "overridesCommon": false }  →  TypesUsage.BASE
"types": { "url": "...", "overridesCommon": false }  →  TypesUsage.BOTH
"types": { "url": "...", "overridesCommon": true }  →  TypesUsage.OWN
"types": null  →  TypesUsage.NONE
    ↓
RuntimeFactory.constructRuntime()
    ↓
TypesUsage.BASE → constructBaseTypes() → fetch from DEFAULT_TYPES_URL
TypesUsage.BOTH → constructBaseTypes() + constructOwnTypes()
TypesUsage.OWN → constructOwnTypes() only
TypesUsage.NONE → use v14Preset() only
    ↓
TypeRegistry
    ↓
RuntimeSnapshot

DEFAULT_TYPES_URL: https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/types/default.json


Son güncelleme: 2026-02-03 06:30 (CHAINS_URL GitHub'a yönlendirildi, MultiAddress inline tanımlandı, Integration test eklendi, TypeReference hatası araştırılıyor)