feat: Add bizinikiwi signing context for Pezkuwi ecosystem

Pezkuwi chains use "bizinikiwi" signing context instead of standard
"substrate" context used by Polkadot ecosystem. This was causing
"bad signature" errors on HEZ transfers.

Changes:
- Add sr25519-bizinikiwi native Rust binding with bizinikiwi context
- Add isPezkuwiChain extension to detect Pezkuwi ecosystem chains
- Add PezkuwiKeyPairSigner for signing with bizinikiwi context
- Modify SecretsSigner to use correct context based on chain:
  - Pezkuwi chains (3) -> BizinikiwSr25519 (bizinikiwi)
  - Other chains (98+) -> KeyPairSigner (substrate)
- Add live transfer test for Pezkuwi mainnet

Tested with successful HEZ transfer on Pezkuwi mainnet:
TX: 0xe25a4eaaeaa04122cca130582dba3cacb2280dea5d908924b45757ea67c27996
This commit is contained in:
2026-02-07 03:41:52 +03:00
parent 7542046890
commit c12dd79c74
1354 changed files with 86971 additions and 6 deletions
@@ -645,3 +645,16 @@ fun SignatureVerifier.verifyMultiChain(
verify(signature, Signer.MessageHashing.SUBSTRATE, message, publicKey)
}
}
/**
* Check if this chain is part of the Pezkuwi ecosystem.
* Pezkuwi chains use "bizinikiwi" signing context instead of "substrate".
*/
val Chain.isPezkuwiChain: Boolean
get() = id in PEZKUWI_CHAIN_IDS
private val PEZKUWI_CHAIN_IDS = setOf(
ChainGeneses.PEZKUWI,
ChainGeneses.PEZKUWI_ASSET_HUB,
ChainGeneses.PEZKUWI_PEOPLE
)
@@ -0,0 +1,50 @@
package io.novafoundation.nova.runtime.extrinsic.signer
import io.novafoundation.nova.sr25519.BizinikiwSr25519
import io.novasama.substrate_sdk_android.encrypt.SignatureWrapper
import io.novasama.substrate_sdk_android.encrypt.keypair.Keypair
import io.novasama.substrate_sdk_android.runtime.AccountId
import io.novasama.substrate_sdk_android.runtime.extrinsic.signer.SignedRaw
import io.novasama.substrate_sdk_android.runtime.extrinsic.signer.SignerPayloadRaw
import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtension.InheritedImplication
import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtension.extensions.verifySignature.GeneralTransactionSigner
import io.novasama.substrate_sdk_android.runtime.extrinsic.v5.transactionExtension.signingPayload
/**
* SR25519 signer for Pezkuwi chains using "bizinikiwi" signing context.
*
* This signer is used instead of the standard KeyPairSigner for Pezkuwi ecosystem chains
* (Pezkuwi, Pezkuwi Asset Hub, Pezkuwi People) which require signatures with "bizinikiwi"
* context instead of the standard "substrate" context used by Polkadot ecosystem chains.
*/
class PezkuwiKeyPairSigner(
private val keypair: Keypair
) : GeneralTransactionSigner {
override suspend fun signInheritedImplication(
inheritedImplication: InheritedImplication,
accountId: AccountId
): SignatureWrapper {
val payload = inheritedImplication.signingPayload()
// Use BizinikiwSr25519 native library with "bizinikiwi" signing context
val signature = BizinikiwSr25519.sign(
publicKey = keypair.publicKey,
secretKey = keypair.privateKey,
message = payload
)
return SignatureWrapper.Sr25519(signature)
}
suspend fun signRaw(payload: SignerPayloadRaw): SignedRaw {
// Use BizinikiwSr25519 native library with "bizinikiwi" signing context
val signature = BizinikiwSr25519.sign(
publicKey = keypair.publicKey,
secretKey = keypair.privateKey,
message = payload.message
)
return SignedRaw(payload, SignatureWrapper.Sr25519(signature))
}
}