More Extensible Multiaddress Format (#7380)

* More extensible multiaddress format

* update name

* Don't depend on indices to define multiaddress type

* Use MultiAddress in Node Template too!

* reduce traits, fix build

* support multiple `StaticLookup`

* bump tx version

* feedback
This commit is contained in:
Shawn Tabrizi
2020-11-19 12:40:12 +01:00
committed by GitHub
parent 0e9e2ed5a8
commit 4637100ac7
10 changed files with 125 additions and 177 deletions
@@ -209,6 +209,44 @@ impl<T> Lookup for IdentityLookup<T> {
fn lookup(&self, x: T) -> Result<T, LookupError> { Ok(x) }
}
/// A lookup implementation returning the `AccountId` from a `MultiAddress`.
pub struct AccountIdLookup<AccountId, AccountIndex>(PhantomData<(AccountId, AccountIndex)>);
impl<AccountId, AccountIndex> StaticLookup for AccountIdLookup<AccountId, AccountIndex>
where
AccountId: Codec + Clone + PartialEq + Debug,
AccountIndex: Codec + Clone + PartialEq + Debug,
crate::MultiAddress<AccountId, AccountIndex>: Codec,
{
type Source = crate::MultiAddress<AccountId, AccountIndex>;
type Target = AccountId;
fn lookup(x: Self::Source) -> Result<Self::Target, LookupError> {
match x {
crate::MultiAddress::Id(i) => Ok(i),
_ => Err(LookupError),
}
}
fn unlookup(x: Self::Target) -> Self::Source {
crate::MultiAddress::Id(x)
}
}
/// Perform a StaticLookup where there are multiple lookup sources of the same type.
impl<A, B> StaticLookup for (A, B)
where
A: StaticLookup,
B: StaticLookup<Source = A::Source, Target = A::Target>,
{
type Source = A::Source;
type Target = A::Target;
fn lookup(x: Self::Source) -> Result<Self::Target, LookupError> {
A::lookup(x.clone()).or_else(|_| B::lookup(x))
}
fn unlookup(x: Self::Target) -> Self::Source {
A::unlookup(x)
}
}
/// Extensible conversion trait. Generic over both source and destination types.
pub trait Convert<A, B> {
/// Make conversion.