sidechain_domain/
cross_chain_app.rs

1//! Substrate key pair types for Partner Chain cross-chain keys
2
3use crate::SidechainPublicKey;
4use parity_scale_codec::MaxEncodedLen;
5use sp_core::crypto::AccountId32;
6use sp_runtime::app_crypto::{app_crypto, ecdsa};
7use sp_runtime::traits::IdentifyAccount;
8use sp_runtime::{KeyTypeId, MultiSigner};
9use sp_std::vec::Vec;
10
11/// Key type for the cross-chain keys
12pub const KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"crch");
13
14app_crypto!(ecdsa, KEY_TYPE_ID);
15
16impl MaxEncodedLen for Signature {
17	fn max_encoded_len() -> usize {
18		ecdsa::Signature::max_encoded_len()
19	}
20}
21
22impl From<Signature> for Vec<u8> {
23	fn from(value: Signature) -> Self {
24		value.into_inner().0.to_vec()
25	}
26}
27
28impl From<Public> for AccountId32 {
29	fn from(value: Public) -> Self {
30		MultiSigner::from(ecdsa::Public::from(value)).into_account()
31	}
32}
33
34impl From<Public> for Vec<u8> {
35	fn from(value: Public) -> Self {
36		value.into_inner().0.to_vec()
37	}
38}
39
40impl TryFrom<SidechainPublicKey> for Public {
41	type Error = SidechainPublicKey;
42	fn try_from(pubkey: SidechainPublicKey) -> Result<Self, Self::Error> {
43		Public::try_from(pubkey.0.as_slice()).map_err(|_| pubkey)
44	}
45}