- Add PezkuwiAddressConstructor for custom address type handling - Add custom signed extensions (CheckNonZeroSender, CheckWeight, WeightReclaim, PezkuwiCheckMortality) - Add pezkuwi.json type definitions - Update RuntimeSnapshotExt for multiple address type lookups - Update CHAINS_URL to use GitHub-hosted chains.json with types config - Add feeViaRuntimeCall support for Pezkuwi chains - Add debug diagnostics for runtime type issues (to be cleaned before production) - Add CHANGELOG_PEZKUWI.md documenting all changes
12 KiB
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.
DEBUG KODLARI (Production öncesi KALDIRILMALI)
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 alval 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ırlastDiagnostics = ...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ı
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.ktruntime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/CheckNonZeroSender.ktruntime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/CheckWeight.ktruntime/src/main/java/io/novafoundation/nova/runtime/extrinsic/extensions/WeightReclaim.ktruntime/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:
feature-wallet-api/.../ExtrinsicBuilderExt.kt- YENİ YAKLAŞIM: metadata'dan type alıyorfeature-governance-impl/.../ExtrinsicBuilderExt.kt- Zaten doğru yaklaşımı kullanıyordu- Diğer dosyalar hala PezkuwiAddressConstructor kullanıyor (gerekirse güncellenecek):
feature-staking-impl/.../ExtrinsicBuilderExt.ktfeature-staking-impl/.../NominationPoolsCalls.ktfeature-proxy-api/.../ExtrinsicBuilderExt.ktfeature-wallet-impl/.../StatemineAssetTransfers.ktfeature-wallet-impl/.../OrmlAssetTransfers.ktfeature-wallet-impl/.../NativeAssetIssuer.ktfeature-wallet-impl/.../OrmlAssetIssuer.ktfeature-wallet-impl/.../StatemineAssetIssuer.ktfeature-account-impl/.../ProxiedSigner.kt
6. chains.json - feeViaRuntimeCall ve types
Dosya: pezkuwi-config/chains.json
Değişiklik:
- Pezkuwi chain'lerine
"feeViaRuntimeCall": trueeklendi "types": { "overridesCommon": false }eklendi (base types yüklenmesi için - ExtrinsicSignature type hatası düzeltmek için) Etkilenen chain'ler:- Pezkuwi Mainnet (bb4a61ab0c4b8c12f5eab71d0c86c482e03a275ecdafee678dea712474d33d75)
- Pezkuwi Asset Hub (00d0e1d0581c3cd5c5768652d52f4520184018b44f56a2ae1e0dc9d65c00c948)
- Pezkuwi People Chain (58269e9c184f721e0309332d90cafc410df1519a5dc27a5fd9b3bf5fd2d129f8)
- Zagros Testnet (96eb58af1bb7288115b5e4ff1590422533e749293f231974536dc6672417d06f)
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İŞİ
-
"Network not responding" - Fee hesaplama hatası
- Çözüm: feeViaRuntimeCall eklendi, custom signed extension'lar eklendi
-
"IllegalStateException: Type Address was not found" - Address type lookup hatası
- Çözüm: RuntimeSnapshotExt.kt'de birden fazla type ismi deneniyor
-
"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)
- Çözüm:
-
"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.EraDictEnum olarak tanımlı - Çözüm:
PezkuwiCheckMortalitycustom extension'ı oluşturuldu, Era'yıDictEnum.Entry("MortalX", secondByte)olarak veriyor
-
"IllegalStateException: Type ExtrinsicSignature was not found" - ExtrinsicSignature type hatası (DEVAM EDİYOR)
- SDK "ExtrinsicSignature" type'ını arıyor ama Pezkuwi chain'leri
"types": nullkullanıyordu TypesUsage.NONEolduğu için base types (default.json) yüklenmiyordu- Denenen çözüm: chains.json'da
"types": { "overridesCommon": false }eklendi →TypesUsage.BASEkullanılıyor - Base types URL:
https://raw.githubusercontent.com/pezkuwichain/pezkuwi-wallet-utils/master/chains/types/default.json - default.json'da
"ExtrinsicSignature": "MultiSignature"tanımlı - Cache temizlenip uninstall/reinstall yapıldı ama hata devam ediyor
- Debug diagnostics eklendi - test sonucunu bekliyoruz
- SDK "ExtrinsicSignature" type'ını arıyor ama Pezkuwi chain'leri
ÇALIŞAN İMPLEMENTASYONLAR (Referans)
1. pezkuwi-extension (Browser Extension)
Konum: /home/mamostehp/pezkuwi-extension/
Nasıl çalışıyor:
@pezkuwi/types(polkadot.js fork) kullanıyorTypeRegistryile 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": nullile ç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)
- Test et: Transfer işlemi çalışıyor mu?
- Test et: Fee hesaplama çalışıyor mu?
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 (Debug diagnostics eklendi, extension analizi yapıldı)