Limit max call size of Rialto/Millau runtimes (#1187)

* max call size <= 230 bytes

* fix benchmarks
This commit is contained in:
Svyatoslav Nikolsky
2021-10-21 15:29:49 +03:00
committed by Bastian Köcher
parent b60df0849c
commit 7b4f1c2236
10 changed files with 159 additions and 141 deletions
+1 -3
View File
@@ -844,9 +844,7 @@ mod tests {
#[test] #[test]
fn call_size() { fn call_size() {
// pallets that are (to be) used by polkadot runtime
const MAX_CALL_SIZE: usize = 230; // value from polkadot-runtime tests const MAX_CALL_SIZE: usize = 230; // value from polkadot-runtime tests
assert!(core::mem::size_of::<pallet_bridge_grandpa::Call<Runtime>>() <= MAX_CALL_SIZE); assert!(core::mem::size_of::<Call>() <= MAX_CALL_SIZE);
assert!(core::mem::size_of::<pallet_bridge_messages::Call<Runtime>>() <= MAX_CALL_SIZE);
} }
} }
+1 -3
View File
@@ -1447,9 +1447,7 @@ mod tests {
#[test] #[test]
fn call_size() { fn call_size() {
// pallets that are (to be) used by polkadot runtime
const MAX_CALL_SIZE: usize = 230; // value from polkadot-runtime tests const MAX_CALL_SIZE: usize = 230; // value from polkadot-runtime tests
assert!(core::mem::size_of::<pallet_bridge_grandpa::Call<Runtime>>() <= MAX_CALL_SIZE); assert!(core::mem::size_of::<Call>() <= MAX_CALL_SIZE);
assert!(core::mem::size_of::<pallet_bridge_messages::Call<Runtime>>() <= MAX_CALL_SIZE);
} }
} }
+5 -5
View File
@@ -46,7 +46,7 @@ benchmarks_instance_pallet! {
header header
}, },
); );
}: import_unsigned_header(RawOrigin::None, header, None) }: import_unsigned_header(RawOrigin::None, Box::new(header), None)
verify { verify {
let storage = BridgeStorage::<T, I>::new(); let storage = BridgeStorage::<T, I>::new();
assert_eq!(storage.best_block().0.number, 1); assert_eq!(storage.best_block().0.number, 1);
@@ -91,7 +91,7 @@ benchmarks_instance_pallet! {
// Need to make sure that the header we're going to import hasn't been inserted // Need to make sure that the header we're going to import hasn't been inserted
// into storage already // into storage already
let header = HeaderBuilder::with_parent(&last_header).sign_by(&last_authority); let header = HeaderBuilder::with_parent(&last_header).sign_by(&last_authority);
}: import_unsigned_header(RawOrigin::None, header, None) }: import_unsigned_header(RawOrigin::None, Box::new(header), None)
verify { verify {
let storage = BridgeStorage::<T, I>::new(); let storage = BridgeStorage::<T, I>::new();
assert_eq!(storage.best_block().0.number, (num_blocks + 1) as u64); assert_eq!(storage.best_block().0.number, (num_blocks + 1) as u64);
@@ -132,7 +132,7 @@ benchmarks_instance_pallet! {
// Need to make sure that the header we're going to import hasn't been inserted // Need to make sure that the header we're going to import hasn't been inserted
// into storage already // into storage already
let header = HeaderBuilder::with_parent(&last_header).sign_by(&last_authority); let header = HeaderBuilder::with_parent(&last_header).sign_by(&last_authority);
}: import_unsigned_header(RawOrigin::None, header, None) }: import_unsigned_header(RawOrigin::None, Box::new(header), None)
verify { verify {
let storage = BridgeStorage::<T, I>::new(); let storage = BridgeStorage::<T, I>::new();
assert_eq!(storage.best_block().0.number, (num_blocks + 1) as u64); assert_eq!(storage.best_block().0.number, (num_blocks + 1) as u64);
@@ -167,7 +167,7 @@ benchmarks_instance_pallet! {
} }
let header = HeaderBuilder::with_parent(&parent).sign_by_set(&validators); let header = HeaderBuilder::with_parent(&parent).sign_by_set(&validators);
}: import_unsigned_header(RawOrigin::None, header, None) }: import_unsigned_header(RawOrigin::None, Box::new(header), None)
verify { verify {
let storage = BridgeStorage::<T, I>::new(); let storage = BridgeStorage::<T, I>::new();
let max_pruned: u64 = (n - 1) as _; let max_pruned: u64 = (n - 1) as _;
@@ -209,7 +209,7 @@ benchmarks_instance_pallet! {
header header
}, },
); );
}: import_unsigned_header(RawOrigin::None, header, Some(receipts)) }: import_unsigned_header(RawOrigin::None, Box::new(header), Some(receipts))
verify { verify {
let storage = BridgeStorage::<T, I>::new(); let storage = BridgeStorage::<T, I>::new();
assert_eq!(storage.best_block().0.number, 2); assert_eq!(storage.best_block().0.number, 2);
+3 -3
View File
@@ -25,7 +25,7 @@ use bp_eth_poa::{
use codec::{Decode, Encode}; use codec::{Decode, Encode};
use frame_support::traits::Get; use frame_support::traits::Get;
use sp_runtime::RuntimeDebug; use sp_runtime::RuntimeDebug;
use sp_std::{cmp::Ord, collections::btree_map::BTreeMap, prelude::*}; use sp_std::{boxed::Box, cmp::Ord, collections::btree_map::BTreeMap, prelude::*};
pub use validators::{ValidatorsConfiguration, ValidatorsSource}; pub use validators::{ValidatorsConfiguration, ValidatorsSource};
@@ -406,7 +406,7 @@ pub mod pallet {
#[pallet::weight(0)] // TODO: update me (https://github.com/paritytech/parity-bridges-common/issues/78) #[pallet::weight(0)] // TODO: update me (https://github.com/paritytech/parity-bridges-common/issues/78)
pub fn import_unsigned_header( pub fn import_unsigned_header(
origin: OriginFor<T>, origin: OriginFor<T>,
header: AuraHeader, header: Box<AuraHeader>,
receipts: Option<Vec<Receipt>>, receipts: Option<Vec<Receipt>>,
) -> DispatchResult { ) -> DispatchResult {
frame_system::ensure_none(origin)?; frame_system::ensure_none(origin)?;
@@ -417,7 +417,7 @@ pub mod pallet {
&T::AuraConfiguration::get(), &T::AuraConfiguration::get(),
&T::ValidatorsConfiguration::get(), &T::ValidatorsConfiguration::get(),
None, None,
header, *header,
&T::ChainTime::default(), &T::ChainTime::default(),
receipts, receipts,
) )
+21 -14
View File
@@ -18,10 +18,11 @@
use crate::{ use crate::{
swap_account_id, target_account_at_this_chain, BridgedAccountIdOf, BridgedAccountPublicOf, swap_account_id, target_account_at_this_chain, BridgedAccountIdOf, BridgedAccountPublicOf,
BridgedAccountSignatureOf, BridgedBalanceOf, Call, Pallet, ThisChainBalance, TokenSwapOf, BridgedAccountSignatureOf, BridgedBalanceOf, Call, Pallet, ThisChainBalance,
TokenSwapCreationOf, TokenSwapOf,
}; };
use bp_token_swap::{TokenSwap, TokenSwapState, TokenSwapType}; use bp_token_swap::{TokenSwap, TokenSwapCreation, TokenSwapState, TokenSwapType};
use codec::Encode; use codec::Encode;
use frame_benchmarking::{account, benchmarks_instance_pallet}; use frame_benchmarking::{account, benchmarks_instance_pallet};
use frame_support::{traits::Currency, Parameter}; use frame_support::{traits::Currency, Parameter};
@@ -62,21 +63,11 @@ benchmarks_instance_pallet! {
let sender = funded_account::<T, I>("source_account_at_this_chain", 0); let sender = funded_account::<T, I>("source_account_at_this_chain", 0);
let swap: TokenSwapOf<T, I> = test_swap::<T, I>(sender.clone(), true); let swap: TokenSwapOf<T, I> = test_swap::<T, I>(sender.clone(), true);
let target_public_at_bridged_chain = target_public_at_bridged_chain::<T, I>(); let swap_creation: TokenSwapCreationOf<T, I> = test_swap_creation::<T, I>();
let swap_delivery_and_dispatch_fee = swap_delivery_and_dispatch_fee::<T, I>();
let bridged_chain_spec_version = 0;
let bridged_currency_transfer = Vec::new();
let bridged_currency_transfer_weight = 0;
let bridged_currency_transfer_signature = bridged_currency_transfer_signature::<T, I>();
}: create_swap( }: create_swap(
RawOrigin::Signed(sender.clone()), RawOrigin::Signed(sender.clone()),
swap, swap,
target_public_at_bridged_chain, Box::new(swap_creation)
swap_delivery_and_dispatch_fee,
bridged_chain_spec_version,
bridged_currency_transfer,
bridged_currency_transfer_weight,
bridged_currency_transfer_signature
) )
verify { verify {
assert!(crate::PendingSwaps::<T, I>::contains_key(test_swap_hash::<T, I>(sender, true))); assert!(crate::PendingSwaps::<T, I>::contains_key(test_swap_hash::<T, I>(sender, true)));
@@ -144,6 +135,22 @@ fn test_swap_hash<T: Config<I>, I: 'static>(sender: T::AccountId, is_create: boo
test_swap::<T, I>(sender, is_create).using_encoded(blake2_256).into() test_swap::<T, I>(sender, is_create).using_encoded(blake2_256).into()
} }
/// Returns test token swap creation params.
fn test_swap_creation<T: Config<I>, I: 'static>() -> TokenSwapCreationOf<T, I>
where
BridgedAccountPublicOf<T, I>: Default,
BridgedAccountSignatureOf<T, I>: Default,
{
TokenSwapCreation {
target_public_at_bridged_chain: target_public_at_bridged_chain::<T, I>(),
swap_delivery_and_dispatch_fee: swap_delivery_and_dispatch_fee::<T, I>(),
bridged_chain_spec_version: 0,
bridged_currency_transfer: Vec::new(),
bridged_currency_transfer_weight: 0,
bridged_currency_transfer_signature: bridged_currency_transfer_signature::<T, I>(),
}
}
/// Account that has some balance. /// Account that has some balance.
fn funded_account<T: Config<I>, I: 'static>(name: &'static str, index: u32) -> T::AccountId { fn funded_account<T: Config<I>, I: 'static>(name: &'static str, index: u32) -> T::AccountId {
let account: T::AccountId = account(name, index, SEED); let account: T::AccountId = account(name, index, SEED);
+91 -104
View File
@@ -23,29 +23,39 @@
//! There are four accounts participating in the swap: //! There are four accounts participating in the swap:
//! //!
//! 1) account of This chain that has signed the `create_swap` transaction and has balance on This //! 1) account of This chain that has signed the `create_swap` transaction and has balance on This
//! chain. We'll be referring to this account as `source_account_at_this_chain`; //! chain. We'll be referring to this account as `source_account_at_this_chain`;
//!
//! 2) account of the Bridged chain that is sending the `claim_swap` message from the Bridged to //! 2) account of the Bridged chain that is sending the `claim_swap` message from the Bridged to
//! This chain. This account has balance on Bridged chain and is willing to swap these tokens to //! This chain. This account has balance on Bridged chain and is willing to swap these tokens to
//! This chain tokens of the `source_account_at_this_chain`. We'll be referring to this account //! This chain tokens of the `source_account_at_this_chain`. We'll be referring to this account
//! as `target_account_at_bridged_chain`; 3) account of the Bridged chain that is indirectly //! as `target_account_at_bridged_chain`;
//! controlled by the `source_account_at_this_chain`. We'll be referring this account as //!
//! `source_account_at_bridged_chain`; 4) account of This chain that is indirectly controlled by the //! 3) account of the Bridged chain that is indirectly controlled by the
//! `target_account_at_bridged_chain`. We'll be referring this account as //! `source_account_at_this_chain`. We'll be referring this account as
//! `target_account_at_this_chain`. //! `source_account_at_bridged_chain`;
//!
//! 4) account of This chain that is indirectly controlled by the `target_account_at_bridged_chain`.
//! We'll be referring this account as `target_account_at_this_chain`.
//! //!
//! So the tokens swap is an intention of `source_account_at_this_chain` to swap his //! So the tokens swap is an intention of `source_account_at_this_chain` to swap his
//! `source_balance_at_this_chain` tokens to the `target_balance_at_bridged_chain` tokens owned by //! `source_balance_at_this_chain` tokens to the `target_balance_at_bridged_chain` tokens owned by
//! `target_account_at_bridged_chain`. The swap process goes as follows: //! `target_account_at_bridged_chain`. The swap process goes as follows:
//! //!
//! 1) the `source_account_at_this_chain` account submits the `create_swap` transaction on This //! 1) the `source_account_at_this_chain` account submits the `create_swap` transaction on This
//! chain; 2) the tokens transfer message that would transfer `target_balance_at_bridged_chain` //! chain;
//! tokens from the `target_account_at_bridged_chain` to the `source_account_at_bridged_chain`, //!
//! is sent over the bridge; 3) when transfer message is delivered and dispatched, the pallet //! 2) the tokens transfer message that would transfer `target_balance_at_bridged_chain`
//! receives notification; 4) if message has been successfully dispatched, the //! tokens from the `target_account_at_bridged_chain` to the `source_account_at_bridged_chain`,
//! `target_account_at_bridged_chain` sends the message that would transfer //! is sent over the bridge;
//! `source_balance_at_this_chain` tokens to his `target_account_at_this_chain` account; //!
//! 3) when transfer message is delivered and dispatched, the pallet receives notification;
//!
//! 4) if message has been successfully dispatched, the `target_account_at_bridged_chain` sends the
//! message that would transfer `source_balance_at_this_chain` tokens to his
//! `target_account_at_this_chain` account;
//!
//! 5) if message dispatch has failed, the `source_account_at_this_chain` may submit the //! 5) if message dispatch has failed, the `source_account_at_this_chain` may submit the
//! `cancel_swap` transaction and return his `source_balance_at_this_chain` back to his account. //! `cancel_swap` transaction and return his `source_balance_at_this_chain` back to his account.
//! //!
//! While swap is pending, the `source_balance_at_this_chain` tokens are owned by the special //! While swap is pending, the `source_balance_at_this_chain` tokens are owned by the special
//! temporary `swap_account_at_this_chain` account. It is destroyed upon swap completion. //! temporary `swap_account_at_this_chain` account. It is destroyed upon swap completion.
@@ -57,7 +67,9 @@ use bp_messages::{
DeliveredMessages, LaneId, MessageNonce, DeliveredMessages, LaneId, MessageNonce,
}; };
use bp_runtime::{messages::DispatchFeePayment, ChainId}; use bp_runtime::{messages::DispatchFeePayment, ChainId};
use bp_token_swap::{TokenSwap, TokenSwapState, TokenSwapType}; use bp_token_swap::{
RawBridgedTransferCall, TokenSwap, TokenSwapCreation, TokenSwapState, TokenSwapType,
};
use codec::Encode; use codec::Encode;
use frame_support::{ use frame_support::{
fail, fail,
@@ -67,7 +79,7 @@ use frame_support::{
use sp_core::H256; use sp_core::H256;
use sp_io::hashing::blake2_256; use sp_io::hashing::blake2_256;
use sp_runtime::traits::{Convert, Saturating}; use sp_runtime::traits::{Convert, Saturating};
use sp_std::vec::Vec; use sp_std::boxed::Box;
use weights::WeightInfo; use weights::WeightInfo;
pub use weights_ext::WeightInfoExt; pub use weights_ext::WeightInfoExt;
@@ -146,8 +158,6 @@ pub mod pallet {
/// Account signature type at the Bridged chain. /// Account signature type at the Bridged chain.
pub type BridgedAccountSignatureOf<T, I> = bp_runtime::SignatureOf<BridgedChainOf<T, I>>; pub type BridgedAccountSignatureOf<T, I> = bp_runtime::SignatureOf<BridgedChainOf<T, I>>;
/// SCALE-encoded `Currency::transfer` call on the bridged chain.
pub type RawBridgedTransferCall = Vec<u8>;
/// Bridge message payload used by the pallet. /// Bridge message payload used by the pallet.
pub type MessagePayloadOf<T, I> = bp_message_dispatch::MessagePayload< pub type MessagePayloadOf<T, I> = bp_message_dispatch::MessagePayload<
<T as frame_system::Config>::AccountId, <T as frame_system::Config>::AccountId,
@@ -163,6 +173,12 @@ pub mod pallet {
BridgedBalanceOf<T, I>, BridgedBalanceOf<T, I>,
BridgedAccountIdOf<T, I>, BridgedAccountIdOf<T, I>,
>; >;
/// Type of `TokenSwapCreation` used by the pallet.
pub type TokenSwapCreationOf<T, I> = TokenSwapCreation<
BridgedAccountPublicOf<T, I>,
ThisChainBalance<T, I>,
BridgedAccountSignatureOf<T, I>,
>;
#[pallet::pallet] #[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)] #[pallet::generate_store(pub(super) trait Store)]
@@ -184,14 +200,7 @@ pub mod pallet {
/// Method arguments are: /// Method arguments are:
/// ///
/// - `swap` - token swap intention; /// - `swap` - token swap intention;
/// - `target_public_at_bridged_chain` - the public key of the /// - `swap_creation_params` - additional parameters required to start tokens swap.
/// `swap.target_account_at_bridged_chain` account used to verify
/// `bridged_currency_transfer_signature`;
/// - `bridged_currency_transfer` - the SCALE-encoded tokens transfer call at the Bridged
/// chain;
/// - `bridged_currency_transfer_signature` - the signature of the
/// `swap.target_account_at_bridged_chain` for the message returned by the
/// `pallet_bridge_dispatch::account_ownership_digest()` function call.
/// ///
/// The `source_account_at_this_chain` MUST have enough balance to cover both token swap and /// The `source_account_at_this_chain` MUST have enough balance to cover both token swap and
/// message transfer. Message fee may be estimated using corresponding `OutboundLaneApi` of /// message transfer. Message fee may be estimated using corresponding `OutboundLaneApi` of
@@ -199,15 +208,20 @@ pub mod pallet {
/// ///
/// **WARNING**: the submitter of this transaction is responsible for verifying: /// **WARNING**: the submitter of this transaction is responsible for verifying:
/// ///
/// 1) that the `bridged_currency_transfer` represents a valid token transfer call that /// 1) that the `swap_creation_params.bridged_currency_transfer` represents a valid token
/// transfers `swap.target_balance_at_bridged_chain` to his /// transfer call that transfers `swap.target_balance_at_bridged_chain` to his
/// `source_account_at_bridged_chain` account; 2) that either the /// `swap.source_account_at_bridged_chain` account;
/// `source_account_at_bridged_chain` already exists, or the ///
/// `swap.target_balance_at_bridged_chain` is above existential deposit of the Bridged /// 2) that either the `swap.source_account_at_bridged_chain` already exists, or the
/// chain; 3) the `target_public_at_bridged_chain` matches the /// `swap.target_balance_at_bridged_chain` is above existential deposit of the Bridged
/// `swap.target_account_at_bridged_chain`; 4) the `bridged_currency_transfer_signature` is /// chain;
/// valid and generated by the owner of the `target_public_at_bridged_chain` account ///
/// (read more about [`CallOrigin::TargetAccount`]). /// 3) the `swap_creation_params.target_public_at_bridged_chain` matches the
/// `swap.target_account_at_bridged_chain`;
///
/// 4) the `bridged_currency_transfer_signature` is valid and generated by the owner of
/// the `swap_creation_params.target_public_at_bridged_chain` account (read more
/// about [`CallOrigin::TargetAccount`]).
/// ///
/// Violating rule#1 will lead to losing your `source_balance_at_this_chain` tokens. /// Violating rule#1 will lead to losing your `source_balance_at_this_chain` tokens.
/// Violating other rules will lead to losing message fees for this and other transactions + /// Violating other rules will lead to losing message fees for this and other transactions +
@@ -215,21 +229,24 @@ pub mod pallet {
#[pallet::weight( #[pallet::weight(
T::WeightInfo::create_swap() T::WeightInfo::create_swap()
.saturating_add(T::WeightInfo::send_message_weight( .saturating_add(T::WeightInfo::send_message_weight(
&&bridged_currency_transfer[..], &&swap_creation_params.bridged_currency_transfer[..],
T::DbWeight::get(), T::DbWeight::get(),
)) ))
)] )]
#[allow(clippy::too_many_arguments)]
pub fn create_swap( pub fn create_swap(
origin: OriginFor<T>, origin: OriginFor<T>,
swap: TokenSwapOf<T, I>, swap: TokenSwapOf<T, I>,
target_public_at_bridged_chain: BridgedAccountPublicOf<T, I>, swap_creation_params: Box<TokenSwapCreationOf<T, I>>,
swap_delivery_and_dispatch_fee: ThisChainBalance<T, I>,
bridged_chain_spec_version: u32,
bridged_currency_transfer: RawBridgedTransferCall,
bridged_currency_transfer_weight: Weight,
bridged_currency_transfer_signature: BridgedAccountSignatureOf<T, I>,
) -> DispatchResultWithPostInfo { ) -> DispatchResultWithPostInfo {
let TokenSwapCreation {
target_public_at_bridged_chain,
swap_delivery_and_dispatch_fee,
bridged_chain_spec_version,
bridged_currency_transfer,
bridged_currency_transfer_weight,
bridged_currency_transfer_signature,
} = *swap_creation_params;
// ensure that the `origin` is the same account that is mentioned in the `swap` // ensure that the `origin` is the same account that is mentioned in the `swap`
// intention // intention
let origin_account = ensure_signed(origin)?; let origin_account = ensure_signed(origin)?;
@@ -648,6 +665,17 @@ mod tests {
} }
} }
fn test_swap_creation() -> TokenSwapCreationOf<TestRuntime, ()> {
TokenSwapCreation {
target_public_at_bridged_chain: bridged_chain_account_public(),
swap_delivery_and_dispatch_fee: SWAP_DELIVERY_AND_DISPATCH_FEE,
bridged_chain_spec_version: BRIDGED_CHAIN_SPEC_VERSION,
bridged_currency_transfer: test_transfer(),
bridged_currency_transfer_weight: BRIDGED_CHAIN_CALL_WEIGHT,
bridged_currency_transfer_signature: bridged_chain_account_signature(),
}
}
fn test_swap_hash() -> H256 { fn test_swap_hash() -> H256 {
test_swap().using_encoded(blake2_256).into() test_swap().using_encoded(blake2_256).into()
} }
@@ -660,12 +688,14 @@ mod tests {
assert_ok!(Pallet::<TestRuntime>::create_swap( assert_ok!(Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(TokenSwapCreation {
SWAP_DELIVERY_AND_DISPATCH_FEE, target_public_at_bridged_chain: bridged_chain_account_public(),
BRIDGED_CHAIN_SPEC_VERSION, swap_delivery_and_dispatch_fee: SWAP_DELIVERY_AND_DISPATCH_FEE,
test_transfer(), bridged_chain_spec_version: BRIDGED_CHAIN_SPEC_VERSION,
BRIDGED_CHAIN_CALL_WEIGHT, bridged_currency_transfer: test_transfer(),
bridged_chain_account_signature(), bridged_currency_transfer_weight: BRIDGED_CHAIN_CALL_WEIGHT,
bridged_currency_transfer_signature: bridged_chain_account_signature(),
}),
)); ));
} }
@@ -683,12 +713,7 @@ mod tests {
Pallet::<TestRuntime>::create_swap( Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT + 1), Origin::signed(THIS_CHAIN_ACCOUNT + 1),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
), ),
Error::<TestRuntime, ()>::MismatchedSwapSourceOrigin Error::<TestRuntime, ()>::MismatchedSwapSourceOrigin
); );
@@ -704,12 +729,7 @@ mod tests {
Pallet::<TestRuntime>::create_swap( Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
swap, swap,
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
), ),
Error::<TestRuntime, ()>::TooLowBalanceOnThisChain Error::<TestRuntime, ()>::TooLowBalanceOnThisChain
); );
@@ -725,12 +745,7 @@ mod tests {
Pallet::<TestRuntime>::create_swap( Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
swap, swap,
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
), ),
Error::<TestRuntime, ()>::FailedToTransferToSwapAccount Error::<TestRuntime, ()>::FailedToTransferToSwapAccount
); );
@@ -742,16 +757,13 @@ mod tests {
run_test(|| { run_test(|| {
let mut transfer = test_transfer(); let mut transfer = test_transfer();
transfer[0] = BAD_TRANSFER_CALL; transfer[0] = BAD_TRANSFER_CALL;
let mut swap_creation = test_swap_creation();
swap_creation.bridged_currency_transfer = transfer;
assert_noop!( assert_noop!(
Pallet::<TestRuntime>::create_swap( Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(swap_creation),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
transfer,
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
), ),
Error::<TestRuntime, ()>::FailedToSendTransferMessage Error::<TestRuntime, ()>::FailedToSendTransferMessage
); );
@@ -764,24 +776,14 @@ mod tests {
assert_ok!(Pallet::<TestRuntime>::create_swap( assert_ok!(Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
)); ));
assert_noop!( assert_noop!(
Pallet::<TestRuntime>::create_swap( Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
), ),
Error::<TestRuntime, ()>::SwapAlreadyStarted Error::<TestRuntime, ()>::SwapAlreadyStarted
); );
@@ -796,12 +798,7 @@ mod tests {
Pallet::<TestRuntime>::create_swap( Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
), ),
Error::<TestRuntime, ()>::SwapPeriodIsFinished Error::<TestRuntime, ()>::SwapPeriodIsFinished
); );
@@ -815,12 +812,7 @@ mod tests {
assert_ok!(Pallet::<TestRuntime>::create_swap( assert_ok!(Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
)); ));
}); });
} }
@@ -834,12 +826,7 @@ mod tests {
assert_ok!(Pallet::<TestRuntime>::create_swap( assert_ok!(Pallet::<TestRuntime>::create_swap(
Origin::signed(THIS_CHAIN_ACCOUNT), Origin::signed(THIS_CHAIN_ACCOUNT),
test_swap(), test_swap(),
bridged_chain_account_public(), Box::new(test_swap_creation()),
SWAP_DELIVERY_AND_DISPATCH_FEE,
BRIDGED_CHAIN_SPEC_VERSION,
test_transfer(),
BRIDGED_CHAIN_CALL_WEIGHT,
bridged_chain_account_signature(),
)); ));
let swap_hash = test_swap_hash(); let swap_hash = test_swap_hash();
+2
View File
@@ -13,6 +13,7 @@ codec = { package = "parity-scale-codec", version = "2.0.0", default-features =
frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
[features] [features]
default = ["std"] default = ["std"]
@@ -20,4 +21,5 @@ std = [
"codec/std", "codec/std",
"frame-support/std", "frame-support/std",
"sp-core/std", "sp-core/std",
"sp-std/std",
] ]
+25 -1
View File
@@ -17,8 +17,9 @@
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
use codec::{Decode, Encode}; use codec::{Decode, Encode};
use frame_support::RuntimeDebug; use frame_support::{weights::Weight, RuntimeDebug};
use sp_core::U256; use sp_core::U256;
use sp_std::vec::Vec;
/// Pending token swap state. /// Pending token swap state.
#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)] #[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)]
@@ -82,3 +83,26 @@ pub struct TokenSwap<ThisBlockNumber, ThisBalance, ThisAccountId, BridgedBalance
/// `target_balance_at_bridged_chain`. /// `target_balance_at_bridged_chain`.
pub target_account_at_bridged_chain: BridgedAccountId, pub target_account_at_bridged_chain: BridgedAccountId,
} }
/// SCALE-encoded `Currency::transfer` call on the bridged chain.
pub type RawBridgedTransferCall = Vec<u8>;
/// Token swap creation parameters.
#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq)]
pub struct TokenSwapCreation<BridgedAccountPublic, ThisChainBalance, BridgedAccountSignature> {
/// Public key of the `target_account_at_bridged_chain` account used to verify
/// `bridged_currency_transfer_signature`.
pub target_public_at_bridged_chain: BridgedAccountPublic,
/// Fee that the `source_account_at_this_chain` is ready to pay for the tokens
/// transfer message delivery and dispatch.
pub swap_delivery_and_dispatch_fee: ThisChainBalance,
/// Specification version of the Bridged chain.
pub bridged_chain_spec_version: u32,
/// SCALE-encoded tokens transfer call at the Bridged chain.
pub bridged_currency_transfer: RawBridgedTransferCall,
/// Dispatch weight of the tokens transfer call at the Bridged chain.
pub bridged_currency_transfer_weight: Weight,
/// The signature of the `target_account_at_bridged_chain` for the message
/// returned by the `pallet_bridge_dispatch::account_ownership_digest()` function call.
pub bridged_currency_transfer_signature: BridgedAccountSignature,
}
+2 -2
View File
@@ -67,7 +67,7 @@ impl BridgeInstance for RialtoPoA {
fn build_unsigned_header_call(&self, header: QueuedEthereumHeader) -> Call { fn build_unsigned_header_call(&self, header: QueuedEthereumHeader) -> Call {
let pallet_call = rialto_runtime::BridgeEthPoACall::import_unsigned_header( let pallet_call = rialto_runtime::BridgeEthPoACall::import_unsigned_header(
into_substrate_ethereum_header(header.header()), Box::new(into_substrate_ethereum_header(header.header())),
into_substrate_ethereum_receipts(header.extra()), into_substrate_ethereum_receipts(header.extra()),
); );
@@ -104,7 +104,7 @@ impl BridgeInstance for Kovan {
fn build_unsigned_header_call(&self, header: QueuedEthereumHeader) -> Call { fn build_unsigned_header_call(&self, header: QueuedEthereumHeader) -> Call {
let pallet_call = rialto_runtime::BridgeEthPoACall::import_unsigned_header( let pallet_call = rialto_runtime::BridgeEthPoACall::import_unsigned_header(
into_substrate_ethereum_header(header.header()), Box::new(into_substrate_ethereum_header(header.header())),
into_substrate_ethereum_receipts(header.extra()), into_substrate_ethereum_receipts(header.extra()),
); );
@@ -220,12 +220,14 @@ impl SwapTokens {
.await?; .await?;
let create_swap_call: CallOf<Source> = pallet_bridge_token_swap::Call::create_swap( let create_swap_call: CallOf<Source> = pallet_bridge_token_swap::Call::create_swap(
token_swap.clone(), token_swap.clone(),
target_public_at_bridged_chain, Box::new(bp_token_swap::TokenSwapCreation {
swap_delivery_and_dispatch_fee, target_public_at_bridged_chain,
bridged_chain_spec_version, swap_delivery_and_dispatch_fee,
bridged_currency_transfer.encode(), bridged_chain_spec_version,
bridged_currency_transfer_weight, bridged_currency_transfer: bridged_currency_transfer.encode(),
bridged_currency_transfer_signature, bridged_currency_transfer_weight,
bridged_currency_transfer_signature,
}),
) )
.into(); .into();