From 67be5955a15f1d3a4df83fe86e6ae107f687141b Mon Sep 17 00:00:00 2001 From: Leigh McCulloch <351529+leighmcculloch@users.noreply.github.com> Date: Thu, 26 Sep 2024 01:44:16 +1000 Subject: [PATCH] Add conversions from AccountId and PublicKey to MuxedAccount (#396) * Add conversions from AccountId and PublicKey to MuxedAccount * add conversion other way * fix * fix --- src/curr/account_conversions.rs | 25 +++++++++++++++++ src/curr/mod.rs | 1 + src/next/account_conversions.rs | 25 +++++++++++++++++ src/next/mod.rs | 1 + tests/account_conversions.rs | 49 +++++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 src/curr/account_conversions.rs create mode 100644 src/next/account_conversions.rs create mode 100644 tests/account_conversions.rs diff --git a/src/curr/account_conversions.rs b/src/curr/account_conversions.rs new file mode 100644 index 00000000..19378d2b --- /dev/null +++ b/src/curr/account_conversions.rs @@ -0,0 +1,25 @@ +use super::{AccountId, MuxedAccount, PublicKey}; + +impl From for MuxedAccount { + fn from(account_id: AccountId) -> Self { + account_id.0.into() + } +} + +impl From for MuxedAccount { + fn from(public_key: PublicKey) -> Self { + match public_key { + PublicKey::PublicKeyTypeEd25519(k) => MuxedAccount::Ed25519(k), + } + } +} + +impl MuxedAccount { + #[must_use] + pub fn account_id(self) -> AccountId { + match self { + MuxedAccount::Ed25519(k) => AccountId(PublicKey::PublicKeyTypeEd25519(k)), + MuxedAccount::MuxedEd25519(m) => AccountId(PublicKey::PublicKeyTypeEd25519(m.ed25519)), + } + } +} diff --git a/src/curr/mod.rs b/src/curr/mod.rs index cf84e11d..3a79be3b 100644 --- a/src/curr/mod.rs +++ b/src/curr/mod.rs @@ -6,6 +6,7 @@ mod str; mod scval_conversions; pub use scval_conversions::*; +mod account_conversions; mod transaction_conversions; mod scval_validations; diff --git a/src/next/account_conversions.rs b/src/next/account_conversions.rs new file mode 100644 index 00000000..19378d2b --- /dev/null +++ b/src/next/account_conversions.rs @@ -0,0 +1,25 @@ +use super::{AccountId, MuxedAccount, PublicKey}; + +impl From for MuxedAccount { + fn from(account_id: AccountId) -> Self { + account_id.0.into() + } +} + +impl From for MuxedAccount { + fn from(public_key: PublicKey) -> Self { + match public_key { + PublicKey::PublicKeyTypeEd25519(k) => MuxedAccount::Ed25519(k), + } + } +} + +impl MuxedAccount { + #[must_use] + pub fn account_id(self) -> AccountId { + match self { + MuxedAccount::Ed25519(k) => AccountId(PublicKey::PublicKeyTypeEd25519(k)), + MuxedAccount::MuxedEd25519(m) => AccountId(PublicKey::PublicKeyTypeEd25519(m.ed25519)), + } + } +} diff --git a/src/next/mod.rs b/src/next/mod.rs index cf84e11d..3a79be3b 100644 --- a/src/next/mod.rs +++ b/src/next/mod.rs @@ -6,6 +6,7 @@ mod str; mod scval_conversions; pub use scval_conversions::*; +mod account_conversions; mod transaction_conversions; mod scval_validations; diff --git a/tests/account_conversions.rs b/tests/account_conversions.rs new file mode 100644 index 00000000..cab94738 --- /dev/null +++ b/tests/account_conversions.rs @@ -0,0 +1,49 @@ +#![cfg(all( + any(feature = "curr", feature = "next"), + not(all(feature = "curr", feature = "next")) +))] +#![cfg(feature = "std")] + +#[cfg(feature = "curr")] +use stellar_xdr::curr as stellar_xdr; +#[cfg(feature = "next")] +use stellar_xdr::next as stellar_xdr; + +use stellar_xdr::{AccountId, MuxedAccount, MuxedAccountMed25519, PublicKey, Uint256}; + +#[test] +fn from_account_id_to_muxed_account() { + let account_id = AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([1u8; 32]))); + let muxed_account: MuxedAccount = account_id.into(); + assert_eq!(muxed_account, MuxedAccount::Ed25519(Uint256([1u8; 32]))); +} + +#[test] +fn from_public_key_to_muxed_account() { + let public_key = PublicKey::PublicKeyTypeEd25519(Uint256([1u8; 32])); + let muxed_account: MuxedAccount = public_key.into(); + assert_eq!(muxed_account, MuxedAccount::Ed25519(Uint256([1u8; 32]))); +} + +#[test] +fn from_muxed_account_ed_to_account_id() { + let muxed_account: MuxedAccount = MuxedAccount::Ed25519(Uint256([1u8; 32])); + let account_id = muxed_account.account_id(); + assert_eq!( + account_id, + AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([1u8; 32]))) + ); +} + +#[test] +fn from_muxed_account_med_to_account_id() { + let muxed_account: MuxedAccount = MuxedAccount::MuxedEd25519(MuxedAccountMed25519 { + id: 2, + ed25519: Uint256([1u8; 32]), + }); + let account_id = muxed_account.account_id(); + assert_eq!( + account_id, + AccountId(PublicKey::PublicKeyTypeEd25519(Uint256([1u8; 32]))) + ); +}