use codec::Encode;
use kitchensink_runtime::{CheckedExtrinsic, SessionKeys, TxExtension, UncheckedExtrinsic};
use node_primitives::{AccountId, Balance, Nonce};
use sp_core::{crypto::get_public_from_string_or_panic, ecdsa, ed25519, sr25519};
use sp_crypto_hashing::blake2_256;
use sp_keyring::Sr25519Keyring;
use sp_runtime::generic::{self, Era, ExtrinsicFormat, EXTRINSIC_FORMAT_VERSION};
pub fn alice() -> AccountId {
Sr25519Keyring::Alice.into()
}
pub fn bob() -> AccountId {
Sr25519Keyring::Bob.into()
}
pub fn charlie() -> AccountId {
Sr25519Keyring::Charlie.into()
}
pub fn dave() -> AccountId {
Sr25519Keyring::Dave.into()
}
pub fn eve() -> AccountId {
Sr25519Keyring::Eve.into()
}
pub fn ferdie() -> AccountId {
Sr25519Keyring::Ferdie.into()
}
pub fn session_keys_from_seed(seed: &str) -> SessionKeys {
SessionKeys {
grandpa: get_public_from_string_or_panic::<ed25519::Public>(seed).into(),
babe: get_public_from_string_or_panic::<sr25519::Public>(seed).into(),
im_online: get_public_from_string_or_panic::<sr25519::Public>(seed).into(),
authority_discovery: get_public_from_string_or_panic::<sr25519::Public>(seed).into(),
mixnet: get_public_from_string_or_panic::<sr25519::Public>(seed).into(),
beefy: get_public_from_string_or_panic::<ecdsa::Public>(seed).into(),
}
}
pub fn tx_ext(nonce: Nonce, extra_fee: Balance) -> TxExtension {
(
frame_system::CheckNonZeroSender::new(),
frame_system::CheckSpecVersion::new(),
frame_system::CheckTxVersion::new(),
frame_system::CheckGenesis::new(),
frame_system::CheckEra::from(Era::mortal(256, 0)),
frame_system::CheckNonce::from(nonce),
frame_system::CheckWeight::new(),
pallet_skip_feeless_payment::SkipCheckIfFeeless::from(
pallet_asset_conversion_tx_payment::ChargeAssetTxPayment::from(extra_fee, None),
),
frame_metadata_hash_extension::CheckMetadataHash::new(false),
frame_system::WeightReclaim::new(),
)
}
pub fn sign(
xt: CheckedExtrinsic,
spec_version: u32,
tx_version: u32,
genesis_hash: [u8; 32],
metadata_hash: Option<[u8; 32]>,
) -> UncheckedExtrinsic {
match xt.format {
ExtrinsicFormat::Signed(signed, tx_ext) => {
let payload = (
xt.function,
tx_ext.clone(),
spec_version,
tx_version,
genesis_hash,
genesis_hash,
metadata_hash,
);
let key = Sr25519Keyring::from_account_id(&signed).unwrap();
let signature =
payload
.using_encoded(|b| {
if b.len() > 256 {
key.sign(&blake2_256(b))
} else {
key.sign(b)
}
})
.into();
generic::UncheckedExtrinsic {
preamble: sp_runtime::generic::Preamble::Signed(
sp_runtime::MultiAddress::Id(signed),
signature,
tx_ext,
),
function: payload.0,
}
.into()
},
ExtrinsicFormat::Bare => generic::UncheckedExtrinsic {
preamble: sp_runtime::generic::Preamble::Bare(EXTRINSIC_FORMAT_VERSION),
function: xt.function,
}
.into(),
ExtrinsicFormat::General(ext_version, tx_ext) => generic::UncheckedExtrinsic {
preamble: sp_runtime::generic::Preamble::General(ext_version, tx_ext),
function: xt.function,
}
.into(),
}
}