Crate xcm_calls[−][src]
Expand description
Support for generically creating XCM calls that are used within Xcm::Transact
Receiving chains will decode incoming XCM calls based on their native types, therefore the
encoding of Xcm::Transact is runtime agnostic.
This crate provides a set of abstractions for commonly used pallets. To create chain agnostic bindings for pallets, a few things are required.
First, an exact replica of the pallet’s call enum, but not bound to T: Config, but with
generic types. like for pallet_staking:
pub enum StakingCall<Source, Balance, AccountId> {
Bond(/* -snip */ ),
UnBond(/* -snip */ ),
BondExtra(/* -snip */ ),
}each enum variant represents the corresponding extrinsic of the pallet.
All the pallet’s type that would be configured as part of Config trait and are part of the
public interface are now generics: <Source, Balance, AccountId>.
In the event that bindings for different runtimes are required for the pallet, we may still need
to support different types, e.g. RuntimeA::Balance = u128; and RuntimeB::Balance = u64;.
Instead of maintaining multiple configs of StakingCall with different types, we maintain a
config with a single type configuration, preferably those from our local chain’s
frame_system::Config, and then provide a separate encoder, that handle encoding context aware,
for example a CurrencyId or AssetId.
For that we configure the pallet’s PalletCallEncoder trait according to the set of different
runtime configs.
For the pallet_staking that is StakingCallEncoder that can be configured with encoders for
all the StakingCall’s generic types
use xcm_calls::{PalletCallEncoder, PassthroughCompactEncoder, PassthroughEncoder};
use xcm_calls::staking::StakingCallEncoder;
// native types
type AssetId = u64;
type Balance = u128;
type AccountId = u64;
type AccountLookupSource = sp_runtime::MultiAddress<AccountId, ()>;
/// The encoder to use when transacting `pallet_staking` calls
pub struct PalletStakingEncoder;
impl StakingCallEncoder<AccountLookupSource, Balance, AccountId> for PalletStakingEncoder {
// encode the `Balance` as the same type as configured but compactly
type CompactBalanceEncoder = PassthroughCompactEncoder<Balance, AssetId>;
// encode the `AccountLookupSource` as the same type as configured
type SourceEncoder = PassthroughEncoder<AccountLookupSource, AssetId>;
// encode the `AccountId` as the same type as configured
type AccountIdEncoder = PassthroughEncoder<AccountId, AssetId>;
}
// Implement the `PalletCallEncoder` that determines whether a call can be encoded based
// on the context
impl PalletCallEncoder for PalletStakingEncoder {
type Context = AssetId;
fn can_encode(_ctx: &Self::Context) -> bool {
// allow all calls
// handling this separately here allows us to eventually support additional chains
// without runtime upgrades
true
}
}Modules
Xcm support for pallet_assets calls.
Xcm support for dispatching pallet_proxy pallet calls
Xcm support for pallet_staking calls.
Xcm support for dispatching pallet_utility pallet calls
Structs
Helps encoding the inner call based on the context used.
Wrapper around something to encode with additional context
Encodes an AccountId as Multiaddress regardless of the asset id
Encodes the type as it is but compact
Encodes the type as it is
Represents an extrinsic of a pallet configured inside a runtime
Traits
A helper to encode an item using the provided context
Abstraction over a dispatchable call in a pallet
Common trait for encoders of pallet calls