Skip to content

Commit

Permalink
Merge pull request #169 from varovainen/va-2024-05-06-balances-on-assets
Browse files Browse the repository at this point in the history
fix: asset tip is a tip
  • Loading branch information
Slesarew committed May 7, 2024
2 parents c93dafc + 01f4589 commit be4b8b6
Show file tree
Hide file tree
Showing 5 changed files with 183 additions and 1 deletion.
1 change: 1 addition & 0 deletions for_tests/statemint1002000

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/cards.rs
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,7 @@ macro_rules! specialty_card {
);
ParserCard::Tip(tip)
}
SpecialtyUnsignedInteger::TipAsset => ParserCard::TipAsset($value.to_string()),
SpecialtyUnsignedInteger::Nonce => ParserCard::Nonce($value.to_string()),
SpecialtyUnsignedInteger::SpecVersion => ParserCard::NameSpecVersion {
name: $spec_name.to_owned(),
Expand Down Expand Up @@ -1012,6 +1013,7 @@ pub enum ParserCard {
SpecName(String),
Text(String),
Tip(Currency),
TipAsset(String),
TupleAnnounced(usize),
TxVersion(String),
}
Expand Down Expand Up @@ -1182,6 +1184,7 @@ impl ExtendedCard {
ParserCard::Tip(a) => {
readable(self.indent, "Tip", &format!("{} {}", a.number, a.units))
}
ParserCard::TipAsset(a) => readable(self.indent, "Tip Asset", a),
ParserCard::TupleAnnounced(a) => {
readable(self.indent, "Tuple", &format!("{a} element(s)"))
}
Expand Down
5 changes: 4 additions & 1 deletion src/propagated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ impl SpecialtySet {
/// Previously found `Hint` (if there was any) is no longer relevant and is
/// discarded.
pub fn forget_hint(&mut self) {
self.hint = Hint::None;
if let Hint::ChargeAssetTxPayment = self.hint {
} else {
self.hint = Hint::None;
}
}

/// Apply `hint` field on unsigned integer decoding.
Expand Down
19 changes: 19 additions & 0 deletions src/special_indicators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,17 @@ pub const CHECK_NONCE: &str = "CheckNonce";
/// Apparently established `identifier` across different chains.
pub const CHARGE_TRANSACTION_PAYMENT: &str = "ChargeTransactionPayment";

/// Extensions `identifier` from [`SignedExtensionMetadata`] for transaction
/// tip that may or may not be in asset units.
///
/// If underlying value has unsigned integer, it will be considered an asset
/// tip.
///
/// Note: asset tip is always gets carded as raw.
///
/// Apparently established `identifier` across different chains.
pub const CHARGE_ASSET_TX_PAYMENT: &str = "ChargeAssetTxPayment";

/// Encoded length of an enum variant index.
pub const ENUM_INDEX_ENCODED_LEN: usize = 1;

Expand All @@ -189,6 +200,10 @@ pub enum SpecialtyUnsignedInteger {
/// displayed as currency with chain decimals and units.
Tip,

/// Value is transaction tip from signable transaction extensions, possibly
/// with asset units and decimals. Displayed as raw.
TipAsset,

/// Value is nonce.
Nonce,

Expand Down Expand Up @@ -236,6 +251,7 @@ pub enum Hint {
CheckGenesis,
CheckMortality,
CheckNonce,
ChargeAssetTxPayment,
ChargeTransactionPayment,
FieldBalance,
FieldNonce,
Expand Down Expand Up @@ -277,6 +293,7 @@ impl Hint {
CHECK_GENESIS => Self::CheckGenesis,
CHECK_MORTALITY => Self::CheckMortality,
CHECK_NONCE => Self::CheckNonce,
CHARGE_ASSET_TX_PAYMENT => Self::ChargeAssetTxPayment,
CHARGE_TRANSACTION_PAYMENT => Self::ChargeTransactionPayment,
_ => Self::None,
}
Expand All @@ -290,6 +307,7 @@ impl Hint {
match path.ident() {
Some(a) => match a.as_str() {
CHECK_NONCE => Self::CheckNonce,
CHARGE_ASSET_TX_PAYMENT => Self::ChargeAssetTxPayment,
CHARGE_TRANSACTION_PAYMENT => Self::ChargeTransactionPayment,
_ => Self::None,
},
Expand All @@ -306,6 +324,7 @@ impl Hint {
Hint::CheckTxVersion | Hint::FieldTxVersion => SpecialtyUnsignedInteger::TxVersion,
Hint::CheckNonce | Hint::FieldNonce => SpecialtyUnsignedInteger::Nonce,
Hint::ChargeTransactionPayment => SpecialtyUnsignedInteger::Tip,
Hint::ChargeAssetTxPayment => SpecialtyUnsignedInteger::TipAsset,
Hint::FieldBalance => SpecialtyUnsignedInteger::Balance,
_ => SpecialtyUnsignedInteger::None,
}
Expand Down
156 changes: 156 additions & 0 deletions src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1900,3 +1900,159 @@ Block Hash: 91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3
";
assert_eq!(extensions_known, extensions_printed);
}

#[test]
fn tr_14() {
let data = hex::decode("2802080a0300da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a522206000a0400da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a008502400400104a0f000e00000068d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f6739fa4cf873fc3b0ad34981f8cb692e13eeecd4323e44039409f4ccccccdac7").unwrap();

let metadata_statemint = metadata_v15("for_tests/statemint1002000");

//2802080a0300da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a522206000a0400da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a0085024004010f00104a0f000e00000068d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f6739fa4cf873fc3b0ad34981f8cb692e13eeecd4323e44039409f4ccccccdac7

let reply = parse_transaction_unmarked(&data.as_ref(), &mut (), &metadata_statemint, None)
.unwrap()
.card(
&specs_polkadot(),
&<RuntimeMetadataV15 as AsMetadata<()>>::spec_name_version(&metadata_statemint)
.unwrap()
.spec_name,
);

let call_printed = format!(
"\n{}\n",
reply
.call
.iter()
.map(|card| card.show())
.collect::<Vec<String>>()
.join("\n")
);
let call_known = "
Pallet: Utility
Call: batch_all
Field Name: calls
Sequence: 2 element(s)
Pallet: Balances
Call: transfer_keep_alive
Field Name: dest
Enum
Enum Variant Name: Id
Id: 15wepZh1jWNqxBjsgErm8HmYiE21n79c5krQJeTsYAjHddeM
Field Name: value
Balance: 10.0500 uDOT
Pallet: Balances
Call: transfer_all
Field Name: dest
Enum
Enum Variant Name: Id
Id: 15wepZh1jWNqxBjsgErm8HmYiE21n79c5krQJeTsYAjHddeM
Field Name: keep_alive
Bool: false
";
assert_eq!(call_known, call_printed);

let extensions_printed = format!(
"\n{}\n",
reply
.extensions
.iter()
.map(|card| card.show())
.collect::<Vec<String>>()
.join("\n")
);
let extensions_known = "
Era: Mortal, phase: 40, period: 64
Nonce: 16
Struct: 2 field(s)
Field Name: tip
Tip Asset: 1
Field Name: asset_id
Enum
Enum Variant Name: None
Chain: statemint1002000
Tx Version: 14
Genesis Hash: 68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f
Block Hash: 6739fa4cf873fc3b0ad34981f8cb692e13eeecd4323e44039409f4ccccccdac7
";
assert_eq!(extensions_known, extensions_printed);
}

#[test]
fn tr_15() {
let data = hex::decode("2802080a0300da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a522206000a0400da9f7fd3d9612a68d2ead69dde53297b172b7db514d0d261e7c5be987df7f32a0085024004010f00104a0f000e00000068d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f6739fa4cf873fc3b0ad34981f8cb692e13eeecd4323e44039409f4ccccccdac7").unwrap();

let metadata_statemint = metadata_v15("for_tests/statemint1002000");

let reply = parse_transaction_unmarked(&data.as_ref(), &mut (), &metadata_statemint, None)
.unwrap()
.card(
&specs_polkadot(),
&<RuntimeMetadataV15 as AsMetadata<()>>::spec_name_version(&metadata_statemint)
.unwrap()
.spec_name,
);

let call_printed = format!(
"\n{}\n",
reply
.call
.iter()
.map(|card| card.show())
.collect::<Vec<String>>()
.join("\n")
);
let call_known = "
Pallet: Utility
Call: batch_all
Field Name: calls
Sequence: 2 element(s)
Pallet: Balances
Call: transfer_keep_alive
Field Name: dest
Enum
Enum Variant Name: Id
Id: 15wepZh1jWNqxBjsgErm8HmYiE21n79c5krQJeTsYAjHddeM
Field Name: value
Balance: 10.0500 uDOT
Pallet: Balances
Call: transfer_all
Field Name: dest
Enum
Enum Variant Name: Id
Id: 15wepZh1jWNqxBjsgErm8HmYiE21n79c5krQJeTsYAjHddeM
Field Name: keep_alive
Bool: false
";
assert_eq!(call_known, call_printed);

let extensions_printed = format!(
"\n{}\n",
reply
.extensions
.iter()
.map(|card| card.show())
.collect::<Vec<String>>()
.join("\n")
);
let extensions_known = "
Era: Mortal, phase: 40, period: 64
Nonce: 16
Struct: 2 field(s)
Field Name: tip
Tip Asset: 1
Field Name: asset_id
Enum
Enum Variant Name: Some
Struct: 2 field(s)
Field Name: parents
u8: 15
Field Name: interior
Enum
Enum Variant Name: Here
Chain: statemint1002000
Tx Version: 14
Genesis Hash: 68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f
Block Hash: 6739fa4cf873fc3b0ad34981f8cb692e13eeecd4323e44039409f4ccccccdac7
";
assert_eq!(extensions_known, extensions_printed);
}

0 comments on commit be4b8b6

Please sign in to comment.