mirror of
https://github.com/pezkuwichain/pezkuwi-wallet-android.git
synced 2026-04-21 23:48:00 +00:00
fix: use PezkuwiCheckMortality for WalletConnect sign requests
PolkadotExternalSignInteractor and ExtrinsicSplitter were using standard CheckMortality which fails with pezsp_runtime DictEnum Era type. Added isPezkuwiChain detection and routing to custom extensions.
This commit is contained in:
+9
-1
@@ -10,6 +10,7 @@ import io.novafoundation.nova.feature_account_api.data.extrinsic.ExtrinsicSplitt
|
|||||||
import io.novafoundation.nova.feature_account_api.data.extrinsic.SplitCalls
|
import io.novafoundation.nova.feature_account_api.data.extrinsic.SplitCalls
|
||||||
import io.novafoundation.nova.runtime.ext.requireGenesisHash
|
import io.novafoundation.nova.runtime.ext.requireGenesisHash
|
||||||
import io.novafoundation.nova.runtime.extrinsic.CustomTransactionExtensions
|
import io.novafoundation.nova.runtime.extrinsic.CustomTransactionExtensions
|
||||||
|
import io.novafoundation.nova.runtime.extrinsic.extensions.PezkuwiCheckImmortal
|
||||||
import io.novafoundation.nova.runtime.extrinsic.multi.CallBuilder
|
import io.novafoundation.nova.runtime.extrinsic.multi.CallBuilder
|
||||||
import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry
|
import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry
|
||||||
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
|
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
|
||||||
@@ -141,12 +142,19 @@ internal class RealExtrinsicSplitter @Inject constructor(
|
|||||||
): SendableExtrinsic {
|
): SendableExtrinsic {
|
||||||
val genesisHash = chain.requireGenesisHash().fromHex()
|
val genesisHash = chain.requireGenesisHash().fromHex()
|
||||||
|
|
||||||
|
val isPezkuwi = runtime.metadata.extrinsic.signedExtensions.any { it.id == "AuthorizeCall" }
|
||||||
|
|
||||||
return ExtrinsicBuilder(
|
return ExtrinsicBuilder(
|
||||||
runtime = runtime,
|
runtime = runtime,
|
||||||
extrinsicVersion = ExtrinsicVersion.V4,
|
extrinsicVersion = ExtrinsicVersion.V4,
|
||||||
batchMode = BatchMode.BATCH,
|
batchMode = BatchMode.BATCH,
|
||||||
).apply {
|
).apply {
|
||||||
setTransactionExtension(CheckMortality(Era.Immortal, genesisHash))
|
// Use custom CheckMortality for Pezkuwi chains to avoid DictEnum type lookup issues
|
||||||
|
if (isPezkuwi) {
|
||||||
|
setTransactionExtension(PezkuwiCheckImmortal(genesisHash))
|
||||||
|
} else {
|
||||||
|
setTransactionExtension(CheckMortality(Era.Immortal, genesisHash))
|
||||||
|
}
|
||||||
setTransactionExtension(CheckGenesis(chain.requireGenesisHash().fromHex()))
|
setTransactionExtension(CheckGenesis(chain.requireGenesisHash().fromHex()))
|
||||||
setTransactionExtension(ChargeTransactionPayment(BigInteger.ZERO))
|
setTransactionExtension(ChargeTransactionPayment(BigInteger.ZERO))
|
||||||
setTransactionExtension(CheckMetadataHash(CheckMetadataHashMode.Disabled))
|
setTransactionExtension(CheckMetadataHash(CheckMetadataHashMode.Disabled))
|
||||||
|
|||||||
+19
-1
@@ -39,6 +39,8 @@ import io.novafoundation.nova.runtime.ext.anyAddressToAccountId
|
|||||||
import io.novafoundation.nova.runtime.ext.utilityAsset
|
import io.novafoundation.nova.runtime.ext.utilityAsset
|
||||||
import io.novafoundation.nova.runtime.extrinsic.CustomTransactionExtensions
|
import io.novafoundation.nova.runtime.extrinsic.CustomTransactionExtensions
|
||||||
import io.novafoundation.nova.runtime.extrinsic.extensions.ChargeAssetTxPayment.Companion.chargeAssetTxPayment
|
import io.novafoundation.nova.runtime.extrinsic.extensions.ChargeAssetTxPayment.Companion.chargeAssetTxPayment
|
||||||
|
import io.novafoundation.nova.runtime.extrinsic.extensions.PezkuwiCheckImmortal
|
||||||
|
import io.novafoundation.nova.runtime.extrinsic.extensions.PezkuwiCheckMortality
|
||||||
import io.novafoundation.nova.runtime.extrinsic.metadata.MetadataShortenerService
|
import io.novafoundation.nova.runtime.extrinsic.metadata.MetadataShortenerService
|
||||||
import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry
|
import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry
|
||||||
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
|
import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
|
||||||
@@ -48,6 +50,7 @@ import io.novasama.substrate_sdk_android.extensions.fromHex
|
|||||||
import io.novasama.substrate_sdk_android.runtime.AccountId
|
import io.novasama.substrate_sdk_android.runtime.AccountId
|
||||||
import io.novasama.substrate_sdk_android.runtime.RuntimeSnapshot
|
import io.novasama.substrate_sdk_android.runtime.RuntimeSnapshot
|
||||||
import io.novasama.substrate_sdk_android.runtime.definitions.types.fromHex
|
import io.novasama.substrate_sdk_android.runtime.definitions.types.fromHex
|
||||||
|
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.Era
|
||||||
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.EraType
|
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.EraType
|
||||||
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
|
import io.novasama.substrate_sdk_android.runtime.definitions.types.generics.GenericCall
|
||||||
import io.novasama.substrate_sdk_android.runtime.extrinsic.BatchMode
|
import io.novasama.substrate_sdk_android.runtime.extrinsic.BatchMode
|
||||||
@@ -221,9 +224,19 @@ class PolkadotExternalSignInteractor(
|
|||||||
|
|
||||||
val signingContext = signingContextFactory.default(chain)
|
val signingContext = signingContextFactory.default(chain)
|
||||||
|
|
||||||
|
val isPezkuwi = isPezkuwiChain(runtime)
|
||||||
|
|
||||||
val extrinsic = with(parsedExtrinsic) {
|
val extrinsic = with(parsedExtrinsic) {
|
||||||
ExtrinsicBuilder(runtime, ExtrinsicVersion.V4, BatchMode.BATCH_ALL).apply {
|
ExtrinsicBuilder(runtime, ExtrinsicVersion.V4, BatchMode.BATCH_ALL).apply {
|
||||||
setTransactionExtension(CheckMortality(era, blockHash))
|
// Use custom CheckMortality for Pezkuwi chains to avoid DictEnum type lookup issues
|
||||||
|
if (isPezkuwi) {
|
||||||
|
when (era) {
|
||||||
|
is Era.Mortal -> setTransactionExtension(PezkuwiCheckMortality(era, blockHash))
|
||||||
|
is Era.Immortal -> setTransactionExtension(PezkuwiCheckImmortal(genesisHash))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setTransactionExtension(CheckMortality(era, blockHash))
|
||||||
|
}
|
||||||
setTransactionExtension(CheckGenesis(genesisHash))
|
setTransactionExtension(CheckGenesis(genesisHash))
|
||||||
setTransactionExtension(ChargeTransactionPayment(tip))
|
setTransactionExtension(ChargeTransactionPayment(tip))
|
||||||
setTransactionExtension(CheckMetadataHash(actualMetadataHash.checkMetadataHash))
|
setTransactionExtension(CheckMetadataHash(actualMetadataHash.checkMetadataHash))
|
||||||
@@ -350,6 +363,11 @@ class PolkadotExternalSignInteractor(
|
|||||||
private fun PolkadotSignPayload.Json.tryDecodeAssetId(runtime: RuntimeSnapshot): Any? {
|
private fun PolkadotSignPayload.Json.tryDecodeAssetId(runtime: RuntimeSnapshot): Any? {
|
||||||
return assetId?.let(runtime::decodeCustomTxPaymentId)
|
return assetId?.let(runtime::decodeCustomTxPaymentId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isPezkuwiChain(runtime: RuntimeSnapshot): Boolean {
|
||||||
|
val signedExtIds = runtime.metadata.extrinsic.signedExtensions.map { it.id }
|
||||||
|
return signedExtIds.any { it == "AuthorizeCall" }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun CheckMetadataHashMode(hash: ByteArray?): CheckMetadataHashMode {
|
private fun CheckMetadataHashMode(hash: ByteArray?): CheckMetadataHashMode {
|
||||||
|
|||||||
Reference in New Issue
Block a user