diff --git a/packages/kos-sdk/src/chains/tron/mod.rs b/packages/kos-sdk/src/chains/tron/mod.rs index e6b0bc0..57c62e8 100644 --- a/packages/kos-sdk/src/chains/tron/mod.rs +++ b/packages/kos-sdk/src/chains/tron/mod.rs @@ -407,12 +407,14 @@ impl TRX { } pub fn tx_from_raw(data: &str) -> Result { - let raw_data_bytes = hex::decode(data).unwrap().clone(); + let raw_data_bytes = hex::decode(data)?; let raw_data: kos_proto::tron::transaction::Raw = kos_proto::from_bytes(raw_data_bytes).unwrap(); let parameter: kos_proto::tron::TransferContract = - kos_proto::unpack_from_option_any(&raw_data.contract[0].parameter).unwrap(); + kos_proto::unpack_from_option_any(&raw_data.contract[0].parameter).ok_or( + Error::InvalidTransaction("Failed to unpack transfer contract".to_string()), + )?; let tx = kos_proto::tron::Transaction { raw_data: Some(raw_data), @@ -420,7 +422,7 @@ impl TRX { ret: Vec::new(), }; - let hash = Hash::from_vec(TRX::hash_transaction(&tx).unwrap()).unwrap(); + let hash = Hash::from_vec(TRX::hash_transaction(&tx)?)?; let sender = address::Address::from_bytes(parameter.owner_address.as_slice()).to_string(); @@ -656,4 +658,18 @@ mod tests { let result = TRX::serialize_raw_data_into_hex_string(invalid_tx); assert!(result.is_err()); } + + #[test] + fn test_tx_from_raw() { + let tx = "0a02d8372208e9c73b516bcd78844088c6e8ad9a325a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541e825d52582eec346c839b4875376117904a76cbc12154120ab1300cf70c048e4cf5d5b1b33f59653ed662618c0843d70fdfee4ad9a32"; + let result = TRX::tx_from_raw(tx); + assert!(result.is_ok()); + let t = result.unwrap(); + assert_eq!(t.chain, chain::Chain::TRX); + assert_eq!(t.sender, "TX8h6Df74VpJsXF6sTDz1QJsq3Ec8dABc3"); + assert_eq!( + t.hash.to_string(), + "3e6c463b2e88d78e912dee3aa31a14aa71c0e56bbdfbdbba012c8af4e45b8834" + ); + } } diff --git a/packages/kos-sdk/src/models.rs b/packages/kos-sdk/src/models.rs index 8340fdc..e84176f 100644 --- a/packages/kos-sdk/src/models.rs +++ b/packages/kos-sdk/src/models.rs @@ -203,9 +203,7 @@ impl Transaction { Chain::ETH => ETH::tx_from_json(data).unwrap(), Chain::MATIC => todo!(), Chain::BTC => todo!(), - Chain::NONE => { - panic!("Invalid Chain") - } + Chain::NONE => Err(Error::InvalidTransaction("Invalid chain".to_string())).unwrap(), } } } @@ -265,39 +263,3 @@ impl AddressOptions { self.check_summed } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_transaction_from_raw() { - let klv_tx_str = r#"{"RawData":{"Nonce":312,"Sender":"nxNUcG11rraE8m196h+9oX4mTHWVzB7d7AuJaMG+hSQ=","Contract":[{"Parameter":{"type_url":"type.googleapis.com/proto.TransferContract","value":"CiCthZSJePbX7pPJ64gh6PZ+HBo1YPZddPMYyYs/+aLSMxIDS0xWGMCEPQ=="}}],"Data":[""],"KAppFee":1000000,"BandwidthFee":2000000,"Version":1,"ChainID":"MTA4"}}"#; - - let klv_tx = Transaction::from_raw(Chain::KLV, klv_tx_str); - - assert_eq!( - klv_tx.sender, - "klv1nuf4gurdwkhtdp8jd47758aa59lzvnr4jhxpah0vpwyk3sd7s5jqy6mut7" - ); - - let tron_tx_str = "0a02d8372208e9c73b516bcd78844088c6e8ad9a325a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541e825d52582eec346c839b4875376117904a76cbc12154120ab1300cf70c048e4cf5d5b1b33f59653ed662618c0843d70fdfee4ad9a32"; - - let tron_tx = Transaction::from_raw(Chain::TRX, tron_tx_str); - - assert_eq!(tron_tx.sender, "TX8h6Df74VpJsXF6sTDz1QJsq3Ec8dABc3"); - - let eth_tx_str = r#"{ - "from":"0x4cbeee256240c92a9ad920ea6f4d7df6466d2cdc", - "maxPriorityFeePerGas":null,"maxFeePerGas":null, - "gas": "0x00", - "value": "0x00", - "data":"0xa9059cbb000000000000000000000000ac4145fef6c828e8ae017207ad944c988ccb2cf700000000000000000000000000000000000000000000000000000000000f4240", - "to":"0xdac17f958d2ee523a2206206994597c13d831ec7", - "nonce":"0x00"}"#; - - let eth_tx = Transaction::from_raw(Chain::ETH, eth_tx_str); - - assert_eq!(eth_tx.sender, "0x4cBeee256240c92A9ad920ea6f4d7Df6466D2Cdc"); - } -}