diff --git a/packages/kos-web/src/wallet.rs b/packages/kos-web/src/wallet.rs index 9812a59..4bb3588 100644 --- a/packages/kos-web/src/wallet.rs +++ b/packages/kos-web/src/wallet.rs @@ -487,4 +487,21 @@ mod tests { let message = b"test message"; assert!(wallet.sign_message(message).is_err()); } + + #[test] + fn test_sign_transaction() { + let chain_id = 38; + let chain = get_chain_by_base_id(chain_id).unwrap(); + let path = chain.get_path(0, false); + + let wallet = + Wallet::from_mnemonic(chain_id, TEST_MNEMONIC.to_string(), path, None).unwrap(); + + let tx_raw = r#"{"RawData":{"Sender":"UMjR49Dkn+HleedQY88TSjXXJhtbDpX7f7QVF/Dcqos=","Contract":[{"Type":63,"Parameter":{"type_url":"type.googleapis.com/proto.SmartContract","value":"EiAAAAAAAAAAAAUAIPnuq04LIuz1ew83LbqEVgLiyNyybBoRCghGUkctMlZCVRIFCIDh6xc="}}],"Data":["c3Rha2VGYXJt"],"KAppFee":2000000,"BandwidthFee":4622449,"Version":1,"ChainID":"MTAwMDAx"}}"#; + + let signed_tx = wallet.sign(tx_raw.as_bytes(), None).unwrap(); + + assert!(!signed_tx.signature.is_empty()); + assert!(!signed_tx.tx_hash.is_empty()); + } } diff --git a/packages/kos/src/chains/klv/mod.rs b/packages/kos/src/chains/klv/mod.rs index 71daeb0..034d87f 100644 --- a/packages/kos/src/chains/klv/mod.rs +++ b/packages/kos/src/chains/klv/mod.rs @@ -285,6 +285,31 @@ mod test { ); } + #[test] + fn test_sign_tx_4() { + let pvk = hex::decode("1ab42cc412b618bdea3a599e3c9bae199ebf030895b039e9db1e30dafb12b727") + .unwrap(); + + let json = r#"{"RawData":{"Sender":"UMjR49Dkn+HleedQY88TSjXXJhtbDpX7f7QVF/Dcqos=","Contract":[{"Type":63,"Parameter":{"type_url":"type.googleapis.com/proto.SmartContract","value":"EiAAAAAAAAAAAAUAIPnuq04LIuz1ew83LbqEVgLiyNyybBoRCghGUkctMlZCVRIFCIDh6xc="}}],"Data":["c3Rha2VGYXJt"],"KAppFee":2000000,"BandwidthFee":4622449,"Version":1,"ChainID":"MTAwMDAx"}}"#; + + let raw_tx = json.as_bytes().to_vec(); + + let tx = crate::chains::Transaction { + raw_data: raw_tx, + tx_hash: Vec::new(), + signature: Vec::new(), + options: None, + }; + + let result_tx = crate::chains::klv::KLV {}.sign_tx(pvk, tx).unwrap(); + + assert_eq!( + result_tx.tx_hash, + hex::decode("50fce82cb3f4bf851d86fd594133b13e891d1f565958b0a95b11ce47f2179926") + .unwrap() + ); + } + #[test] fn test_decode_klv_tx() { let raw_tx = hex::decode( diff --git a/packages/kos/src/chains/klv/models.rs b/packages/kos/src/chains/klv/models.rs index e09e819..f52a037 100644 --- a/packages/kos/src/chains/klv/models.rs +++ b/packages/kos/src/chains/klv/models.rs @@ -33,7 +33,7 @@ pub struct Transaction { #[derive(Clone, PartialEq, Serialize, Deserialize)] pub struct Raw { #[Rename = "Nonce"] - pub nonce: u64, + pub nonce: Option, #[Rename = "Sender"] pub sender: String, #[Rename = "Contract"] @@ -151,7 +151,7 @@ impl TryFrom for proto::transaction::Raw { .collect::, _>>()?; let proto_raw = proto::transaction::Raw { - nonce: value.nonce, + nonce: value.nonce.unwrap_or(0), sender: simple_base64_decode(&value.sender) .map_err(|_| ConversionError::Base64Error)?, contract: contracts, diff --git a/packages/kos/src/protos/generated/klv/proto.rs b/packages/kos/src/protos/generated/klv/proto.rs index d480efe..1402644 100644 --- a/packages/kos/src/protos/generated/klv/proto.rs +++ b/packages/kos/src/protos/generated/klv/proto.rs @@ -1184,6 +1184,7 @@ pub mod tx_contract { UpdateAccountPermissionContractType = 22, DepositContractType = 23, ItoTriggerContractType = 24, + SmartContractType = 63, } impl ContractType { /// String value of the enum field names used in the ProtoBuf definition. @@ -1229,6 +1230,7 @@ pub mod tx_contract { } ContractType::DepositContractType => "DepositContractType", ContractType::ItoTriggerContractType => "ITOTriggerContractType", + ContractType::SmartContractType => "SmartContractType", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -1267,6 +1269,7 @@ pub mod tx_contract { } "DepositContractType" => Some(Self::DepositContractType), "ITOTriggerContractType" => Some(Self::ItoTriggerContractType), + "SmartContractType" => Some(Self::SmartContractType), _ => None, } } diff --git a/packages/kos/src/protos/klever/transaction.proto b/packages/kos/src/protos/klever/transaction.proto index cb3267d..8b22437 100644 --- a/packages/kos/src/protos/klever/transaction.proto +++ b/packages/kos/src/protos/klever/transaction.proto @@ -34,6 +34,7 @@ message TXContract { UpdateAccountPermissionContractType = 22; DepositContractType = 23; ITOTriggerContractType = 24; + SmartContractType = 63; } ContractType Type = 1 [json_name = "Type"]; google.protobuf.Any Parameter = 2 [json_name = "Parameter"];