feat: Add Pezkuwi chain support with custom signed extensions

- 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
This commit is contained in:
2026-02-03 05:41:52 +03:00
parent bb189aeb8a
commit 032cbde2d6
29 changed files with 662 additions and 55 deletions
@@ -24,7 +24,7 @@ import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
import io.novafoundation.nova.runtime.multiNetwork.getRuntime
import io.novasama.substrate_sdk_android.runtime.AccountId
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
import io.novasama.substrate_sdk_android.runtime.definitions.types.instances.AddressInstanceConstructor
import io.novafoundation.nova.common.utils.PezkuwiAddressConstructor
import io.novasama.substrate_sdk_android.runtime.extrinsic.builder.ExtrinsicBuilder
import io.novasama.substrate_sdk_android.runtime.extrinsic.call
import java.math.BigInteger
@@ -88,7 +88,7 @@ open class OrmlAssetTransfers(
moduleIndex = moduleIndex,
callIndex = callIndex,
arguments = mapOf(
"dest" to AddressInstanceConstructor.constructInstance(runtime.typeRegistry, target),
"dest" to PezkuwiAddressConstructor.constructInstance(runtime.typeRegistry, target),
"currency_id" to chainAsset.ormlCurrencyId(runtime),
"amount" to amount
)
@@ -27,7 +27,7 @@ import io.novafoundation.nova.runtime.multiNetwork.getRuntime
import io.novafoundation.nova.runtime.storage.source.StorageDataSource
import io.novasama.substrate_sdk_android.runtime.AccountId
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
import io.novasama.substrate_sdk_android.runtime.definitions.types.instances.AddressInstanceConstructor
import io.novafoundation.nova.common.utils.PezkuwiAddressConstructor
import io.novasama.substrate_sdk_android.runtime.extrinsic.builder.ExtrinsicBuilder
import io.novasama.substrate_sdk_android.runtime.extrinsic.call
import io.novasama.substrate_sdk_android.runtime.metadata.storage
@@ -109,7 +109,7 @@ class StatemineAssetTransfers(
callName = "transfer",
arguments = mapOf(
"id" to assetType.prepareIdForEncoding(runtime),
"target" to AddressInstanceConstructor.constructInstance(runtime.typeRegistry, target),
"target" to PezkuwiAddressConstructor.constructInstance(runtime.typeRegistry, target),
"amount" to amount
)
)
@@ -6,7 +6,7 @@ import io.novafoundation.nova.common.utils.composeCall
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance
import io.novasama.substrate_sdk_android.runtime.RuntimeSnapshot
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
import io.novasama.substrate_sdk_android.runtime.definitions.types.instances.AddressInstanceConstructor
import io.novafoundation.nova.common.utils.PezkuwiAddressConstructor
class NativeAssetIssuer(
private val runtimeSnapshot: RuntimeSnapshot
@@ -17,7 +17,7 @@ class NativeAssetIssuer(
moduleName = Modules.BALANCES,
callName = "force_set_balance",
arguments = mapOf(
"who" to AddressInstanceConstructor.constructInstance(runtimeSnapshot.typeRegistry, destination.value),
"who" to PezkuwiAddressConstructor.constructInstance(runtimeSnapshot.typeRegistry, destination.value),
"new_free" to amount
)
)
@@ -8,7 +8,7 @@ import io.novafoundation.nova.runtime.ext.currencyId
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
import io.novasama.substrate_sdk_android.runtime.RuntimeSnapshot
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
import io.novasama.substrate_sdk_android.runtime.definitions.types.instances.AddressInstanceConstructor
import io.novafoundation.nova.common.utils.PezkuwiAddressConstructor
class OrmlAssetIssuer(
private val ormlType: Chain.Asset.Type.Orml,
@@ -20,7 +20,7 @@ class OrmlAssetIssuer(
moduleName = Modules.TOKENS,
callName = "set_balance",
arguments = mapOf(
"who" to AddressInstanceConstructor.constructInstance(runtimeSnapshot.typeRegistry, destination.value),
"who" to PezkuwiAddressConstructor.constructInstance(runtimeSnapshot.typeRegistry, destination.value),
"currency_id" to ormlType.currencyId(runtimeSnapshot),
"new_free" to amount,
"new_reserved" to Balance.ZERO
@@ -12,7 +12,7 @@ import io.novafoundation.nova.runtime.multiNetwork.chain.model.ChainId
import io.novafoundation.nova.runtime.multiNetwork.chain.model.prepareIdForEncoding
import io.novasama.substrate_sdk_android.runtime.RuntimeSnapshot
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
import io.novasama.substrate_sdk_android.runtime.definitions.types.instances.AddressInstanceConstructor
import io.novafoundation.nova.common.utils.PezkuwiAddressConstructor
class StatemineAssetIssuer(
private val chainId: ChainId,
@@ -38,7 +38,7 @@ class StatemineAssetIssuer(
callName = "mint",
arguments = mapOf(
"id" to assetType.prepareIdForEncoding(runtimeSnapshot),
"beneficiary" to AddressInstanceConstructor.constructInstance(runtimeSnapshot.typeRegistry, destination.value),
"beneficiary" to PezkuwiAddressConstructor.constructInstance(runtimeSnapshot.typeRegistry, destination.value),
"amount" to amount
)
)