use visualsign::{
SignablePayload, SignablePayloadField, SignablePayloadFieldCommon,
SignablePayloadFieldTextV2, SignablePayloadFieldAmountV2,
vsptrait::{VisualSignConverter, VisualSignError, VisualSignOptions}
};
pub struct YourChainVisualSignConverter;
impl VisualSignConverter<YourChainTransactionWrapper> for YourChainVisualSignConverter {
fn to_visual_sign_payload(
&self,
transaction: YourChainTransactionWrapper,
options: VisualSignOptions,
) -> Result<SignablePayload, VisualSignError> {
// Decode the transaction
let decoded_info = self.decode_transaction(&transaction)?;
// Build fields for the visual representation
let fields = vec![
SignablePayloadField::TextV2 {
common: SignablePayloadFieldCommon {
fallback_text: decoded_info.to.clone(),
label: "To".to_string(),
},
text_v2: SignablePayloadFieldTextV2 {
text: decoded_info.to,
},
},
SignablePayloadField::AmountV2 {
common: SignablePayloadFieldCommon {
fallback_text: format!("{} {}", decoded_info.amount, decoded_info.symbol),
label: "Amount".to_string(),
},
amount_v2: SignablePayloadFieldAmountV2 {
amount: decoded_info.amount,
abbreviation: Some(decoded_info.symbol),
},
},
];
Ok(SignablePayload::new(
0, // version
format!("{} Transaction", transaction.transaction_type()),
None, // subtitle
fields,
"YourChainTx".to_string(), // payload_type
))
}
}
impl YourChainVisualSignConverter {
fn decode_transaction(&self, tx: &YourChainTransactionWrapper) -> Result<DecodedTransaction, VisualSignError> {
// Implement your chain-specific decoding logic here
// Use existing Rust libraries when available (recommended approach)
todo!("Implement transaction decoding")
}
}
struct DecodedTransaction {
to: String,
amount: String,
symbol: String,
// Add fields specific to your chain
}