diff --git a/crates/algokit_transact/src/test_utils/asset_freeze.rs b/crates/algokit_transact/src/test_utils/asset_freeze.rs new file mode 100644 index 000000000..fe07efefc --- /dev/null +++ b/crates/algokit_transact/src/test_utils/asset_freeze.rs @@ -0,0 +1,81 @@ +use crate::{Address, AssetFreezeTransactionBuilder, Byte32, TransactionHeaderBuilder}; +use base64::{prelude::BASE64_STANDARD, Engine}; + +pub struct AssetFreezeTransactionMother {} + +impl AssetFreezeTransactionMother { + pub fn asset_freeze() -> AssetFreezeTransactionBuilder { + // mainnet-2XFGVOHMFYLAWBHOSIOI67PBT5LDRHBTD3VLX5EYBDTFNVKMCJIA + let sender = "E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY" + .parse::
() + .unwrap(); + let freeze_address = "ZJU3X2B2QN3BUBIJ64JZ565V363ANGBUDOLXAJHDXGIIMYK6WV3NSNCBQQ" + .parse::
() + .unwrap(); + let genesis_hash: Byte32 = BASE64_STANDARD + .decode("wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=") + .unwrap() + .try_into() + .unwrap(); + let note = BASE64_STANDARD + .decode("TkZUIGZyZWV6ZWQgYnkgbG9mdHkuYWk=") + .unwrap(); + let group = BASE64_STANDARD + .decode("xERjxVTlNb8jeHa16qmpxDMh4+dcDCokO69QnNESbFk=") + .unwrap() + .try_into() + .unwrap(); + + AssetFreezeTransactionBuilder::default() + .header( + TransactionHeaderBuilder::default() + .sender(sender) + .fee(1000) + .first_valid(37463562) + .last_valid(37464562) + .genesis_hash(genesis_hash) + .genesis_id("mainnet-v1.0".to_string()) + .note(note) + .group(group) + .build() + .unwrap(), + ) + .asset_id(1707148495) + .freeze_target(freeze_address) + .frozen(true) + .to_owned() + } + + pub fn asset_unfreeze() -> AssetFreezeTransactionBuilder { + // testnet-LZ2ODDAT4ATAVJUEQW34DIKMPCMBXCCHOSIYKMWGBPEVNHLSEV2A + let sender = "WLH5LELVSEVQL45LBRQYCLJAX6KQPGWUY5WHJXVRV2NPYZUBQAFPH22Q7A" + .parse::
() + .unwrap(); + let freeze_address = "ZYQX7BZ6LGTD7UCS7J5RVEAKHUJPK3FNJFZV2GPUYS2TFIADVFHDBKTN7I" + .parse::
() + .unwrap(); + let genesis_hash: Byte32 = BASE64_STANDARD + .decode("SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=") + .unwrap() + .try_into() + .unwrap(); + let note = BASE64_STANDARD.decode("th4JDxFROQw=").unwrap(); + + AssetFreezeTransactionBuilder::default() + .header( + TransactionHeaderBuilder::default() + .sender(sender) + .fee(1000) + .first_valid(3277583) + .last_valid(3278583) + .genesis_hash(genesis_hash) + .note(note) + .build() + .unwrap(), + ) + .asset_id(185) + .freeze_target(freeze_address) + .frozen(false) + .to_owned() + } +} diff --git a/crates/algokit_transact/src/test_utils/mod.rs b/crates/algokit_transact/src/test_utils/mod.rs index 412c017c6..5ad75aadc 100644 --- a/crates/algokit_transact/src/test_utils/mod.rs +++ b/crates/algokit_transact/src/test_utils/mod.rs @@ -1,11 +1,10 @@ mod application_call; mod asset_config; +mod asset_freeze; mod key_registration; use crate::{ - transactions::{ - AssetFreezeTransactionBuilder, AssetTransferTransactionBuilder, PaymentTransactionBuilder, - }, + transactions::{AssetTransferTransactionBuilder, PaymentTransactionBuilder}, Address, AlgorandMsgpack, Byte32, SignedTransaction, Transaction, TransactionHeaderBuilder, TransactionId, ALGORAND_PUBLIC_KEY_BYTE_LENGTH, HASH_BYTES_LENGTH, }; @@ -19,6 +18,7 @@ use std::{fs::File, str::FromStr}; pub use application_call::ApplicationCallTransactionMother; pub use asset_config::AssetConfigTransactionMother; +pub use asset_freeze::AssetFreezeTransactionMother; pub use key_registration::KeyRegistrationTransactionMother; pub struct TransactionHeaderMother {} @@ -160,90 +160,6 @@ impl TransactionMother { .receiver(AddressMother::neil()) .to_owned() } - - pub fn asset_freeze() -> AssetFreezeTransactionBuilder { - // mainnet-2XFGVOHMFYLAWBHOSIOI67PBT5LDRHBTD3VLX5EYBDTFNVKMCJIA - let sender = "E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY" - .parse::
() - .unwrap(); - let freeze_address = "ZJU3X2B2QN3BUBIJ64JZ565V363ANGBUDOLXAJHDXGIIMYK6WV3NSNCBQQ" - .parse::
() - .unwrap(); - let genesis_hash: Byte32 = BASE64_STANDARD - .decode("wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=") - .unwrap() - .try_into() - .unwrap(); - let note = BASE64_STANDARD - .decode("TkZUIGZyZWV6ZWQgYnkgbG9mdHkuYWk=") - .unwrap(); - let group = BASE64_STANDARD - .decode("xERjxVTlNb8jeHa16qmpxDMh4+dcDCokO69QnNESbFk=") - .unwrap() - .try_into() - .unwrap(); - - AssetFreezeTransactionBuilder::default() - .header( - TransactionHeaderBuilder::default() - .sender(sender) - .fee(1000) - .first_valid(37463562) - .last_valid(37464562) - .genesis_hash(genesis_hash) - .genesis_id("mainnet-v1.0".to_string()) - .note(note) - .group(group) - .build() - .unwrap(), - ) - .asset_id(1707148495) - .freeze_target(freeze_address) - .frozen(true) - .to_owned() - } - - pub fn asset_unfreeze() -> AssetFreezeTransactionBuilder { - // Same as asset_freeze but with frozen=false - let sender = "E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY" - .parse::
() - .unwrap(); - let freeze_address = "ZJU3X2B2QN3BUBIJ64JZ565V363ANGBUDOLXAJHDXGIIMYK6WV3NSNCBQQ" - .parse::
() - .unwrap(); - let genesis_hash: Byte32 = BASE64_STANDARD - .decode("wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=") - .unwrap() - .try_into() - .unwrap(); - let note = BASE64_STANDARD - .decode("TkZUIGZyZWV6ZWQgYnkgbG9mdHkuYWk=") - .unwrap(); - let group = BASE64_STANDARD - .decode("xERjxVTlNb8jeHa16qmpxDMh4+dcDCokO69QnNESbFk=") - .unwrap() - .try_into() - .unwrap(); - - AssetFreezeTransactionBuilder::default() - .header( - TransactionHeaderBuilder::default() - .sender(sender) - .fee(1000) - .first_valid(37463562) - .last_valid(37464562) - .genesis_hash(genesis_hash) - .genesis_id("mainnet-v1.0".to_string()) - .note(note) - .group(group) - .build() - .unwrap(), - ) - .asset_id(1707148495) - .freeze_target(freeze_address) - .frozen(false) - .to_owned() - } } pub struct AddressMother {} @@ -501,7 +417,9 @@ impl TestDataMother { 2, 205, 103, 33, 67, 14, 82, 196, 115, 196, 206, 254, 50, 110, 63, 182, 149, 229, 184, 216, 93, 11, 13, 99, 69, 213, 218, 165, 134, 118, 47, 44, ]; - let transaction = TransactionMother::asset_freeze().build().unwrap(); + let transaction = AssetFreezeTransactionMother::asset_freeze() + .build() + .unwrap(); TransactionTestData::new(transaction, signing_private_key) } @@ -510,7 +428,9 @@ impl TestDataMother { 2, 205, 103, 33, 67, 14, 82, 196, 115, 196, 206, 254, 50, 110, 63, 182, 149, 229, 184, 216, 93, 11, 13, 99, 69, 213, 218, 165, 134, 118, 47, 44, ]; - let transaction = TransactionMother::asset_unfreeze().build().unwrap(); + let transaction = AssetFreezeTransactionMother::asset_unfreeze() + .build() + .unwrap(); TransactionTestData::new(transaction, signing_private_key) } @@ -554,17 +474,12 @@ fn normalise_json(value: serde_json::Value) -> serde_json::Value { "num_uints", ]; - // Boolean fields that should always be included, even when false - const BOOLEAN_FIELDS_TO_KEEP: &[&str] = &["frozen"]; - match value { serde_json::Value::Object(map) => serde_json::Value::Object( map.into_iter() .filter(|(k, v)| { !(v.is_null() - || v.is_boolean() - && v.as_bool() == Some(false) - && !BOOLEAN_FIELDS_TO_KEEP.contains(&k.to_case(Case::Snake).as_str()) + || v.is_boolean() && v.as_bool() == Some(false) || v.is_number() && v.as_u64() == Some(0) && !ZERO_VALUE_EXCLUDED_FIELDS @@ -708,4 +623,13 @@ mod tests { String::from("2XFGVOHMFYLAWBHOSIOI67PBT5LDRHBTD3VLX5EYBDTFNVKMCJIA") ); } + + #[test] + fn test_asset_unfreeze_snapshot() { + let data = TestDataMother::asset_unfreeze(); + assert_eq!( + data.id, + String::from("LZ2ODDAT4ATAVJUEQW34DIKMPCMBXCCHOSIYKMWGBPEVNHLSEV2A") + ); + } } diff --git a/crates/algokit_transact/src/tests.rs b/crates/algokit_transact/src/tests.rs index ca23cfd1b..1e8acd2ca 100644 --- a/crates/algokit_transact/src/tests.rs +++ b/crates/algokit_transact/src/tests.rs @@ -5,7 +5,7 @@ use crate::{ test_utils::{ AddressMother, TransactionGroupMother, TransactionHeaderMother, TransactionMother, }, - transactions::{AssetFreezeTransactionBuilder, FeeParams}, + transactions::FeeParams, Address, AlgorandMsgpack, EstimateTransactionSize, SignedTransaction, Transaction, TransactionId, Transactions, }; @@ -410,167 +410,3 @@ fn test_signed_transaction_group_encoding() { assert_eq!(decoded_signed_tx, signed_grouped_tx); } } - -#[test] -fn test_asset_freeze_transaction_encoding() { - let tx_builder = TransactionMother::asset_freeze(); - let asset_freeze_tx_fields = tx_builder.build_fields().unwrap(); - let asset_freeze_tx = tx_builder.build().unwrap(); - - let encoded = asset_freeze_tx.encode().unwrap(); - let decoded = Transaction::decode(&encoded).unwrap(); - assert_eq!(decoded, asset_freeze_tx); - assert_eq!(decoded, Transaction::AssetFreeze(asset_freeze_tx_fields)); - - let signed_tx = SignedTransaction { - transaction: asset_freeze_tx.clone(), - signature: Some([0; ALGORAND_SIGNATURE_BYTE_LENGTH]), - auth_address: None, - }; - let encoded_stx = signed_tx.encode().unwrap(); - let decoded_stx = SignedTransaction::decode(&encoded_stx).unwrap(); - assert_eq!(decoded_stx, signed_tx); - assert_eq!(decoded_stx.transaction, asset_freeze_tx); - - let raw_encoded = asset_freeze_tx.encode_raw().unwrap(); - assert_eq!(encoded[0], b'T'); - assert_eq!(encoded[1], b'X'); - assert_eq!(encoded.len(), raw_encoded.len() + 2); - assert_eq!(encoded[2..], raw_encoded); -} - -#[test] -fn test_asset_unfreeze_transaction_encoding() { - let tx_builder = TransactionMother::asset_unfreeze(); - let mut asset_freeze_tx_fields = tx_builder.build_fields().unwrap(); - let asset_freeze_tx = tx_builder.build().unwrap(); - - // Verify it's an unfreeze transaction - assert_eq!(asset_freeze_tx_fields.frozen, Some(false)); - - // When encoded, the frozen field should be omitted (None) - let encoded = asset_freeze_tx.encode().unwrap(); - - // For test comparison, set frozen to None since that's how it appears in the encoded form - asset_freeze_tx_fields.frozen = None; - let expected_tx = Transaction::AssetFreeze(asset_freeze_tx_fields); - - let decoded = Transaction::decode(&encoded).unwrap(); - assert_eq!(decoded, expected_tx); -} - -#[test] -fn test_asset_freeze_mainnet_encoding() { - let tx = TransactionMother::asset_freeze().build().unwrap(); - // Just verify it encodes without checking exact size - let encoded = tx.encode().unwrap(); - let decoded = Transaction::decode(&encoded).unwrap(); - assert_eq!(decoded, tx); -} - -#[test] -fn test_asset_freeze_testnet_encoding() { - let tx = TransactionMother::asset_freeze().build().unwrap(); - // Just verify it encodes without checking exact size - let encoded = tx.encode().unwrap(); - let decoded = Transaction::decode(&encoded).unwrap(); - assert_eq!(decoded, tx); -} - -#[test] -fn test_asset_freeze_minimal_encoding() { - let tx = TransactionMother::asset_freeze().build().unwrap(); - // Just verify it encodes without checking exact size - let encoded = tx.encode().unwrap(); - let decoded = Transaction::decode(&encoded).unwrap(); - assert_eq!(decoded, tx); -} - -#[test] -fn test_asset_freeze_with_group_encoding() { - let tx = TransactionMother::asset_freeze().build().unwrap(); - - // Verify group field is set - if let Transaction::AssetFreeze(fields) = &tx { - assert!(fields.header.group.is_some()); - } - - // Just verify it encodes without checking exact size - let encoded = tx.encode().unwrap(); - let decoded = Transaction::decode(&encoded).unwrap(); - assert_eq!(decoded, tx); -} - -#[test] -fn test_asset_freeze_real_transaction_ids() { - // Test with mainnet freeze - let freeze_tx = TransactionMother::asset_freeze().build().unwrap(); - let freeze_id = freeze_tx.id().unwrap(); - assert_eq!(freeze_id.len(), 52); // Base32 encoded length - - // Test with mainnet unfreeze - let unfreeze_tx = TransactionMother::asset_unfreeze().build().unwrap(); - let unfreeze_id = unfreeze_tx.id().unwrap(); - assert_eq!(unfreeze_id.len(), 52); - - // Verify freeze and unfreeze have different IDs (different frozen value) - assert_ne!(freeze_id, unfreeze_id); -} - -#[test] -fn test_asset_freeze_required_fields() { - // Missing asset_id should fail - let result = AssetFreezeTransactionBuilder::default() - .header(TransactionHeaderMother::simple_testnet().build().unwrap()) - .freeze_target(AddressMother::neil()) - .frozen(true) - .build(); - - // Builder with derive_builder pattern requires all fields - assert!(result.is_err()); - - // Missing freeze_target should fail - let result = AssetFreezeTransactionBuilder::default() - .header(TransactionHeaderMother::simple_testnet().build().unwrap()) - .asset_id(12345) - .frozen(true) - .build(); - - assert!(result.is_err()); -} - -#[test] -fn test_asset_freeze_serialization_fields() { - let tx = TransactionMother::asset_freeze().build().unwrap(); - let encoded = tx.encode_raw().unwrap(); - - // Decode as MessagePack Value first - let decoded_value: rmpv::Value = rmp_serde::from_slice(&encoded).unwrap(); - - // Convert to a map to check fields - if let rmpv::Value::Map(map) = decoded_value { - let mut found_faid = false; - let mut found_fadd = false; - let mut found_afrz = false; - let mut found_type = false; - - for (key, _value) in map { - if let rmpv::Value::String(ref s) = key { - match s.as_str() { - Some("faid") => found_faid = true, - Some("fadd") => found_fadd = true, - Some("afrz") => found_afrz = true, - Some("type") => found_type = true, - _ => {} - } - } - } - - assert!(found_faid, "Missing faid field"); - assert!(found_fadd, "Missing fadd field"); - assert!(found_afrz, "Missing afrz field"); - assert!(found_type, "Missing type field"); - } else { - panic!("Expected MessagePack map"); - } -} diff --git a/crates/algokit_transact/src/transactions/asset_freeze.rs b/crates/algokit_transact/src/transactions/asset_freeze.rs index cd792b6f7..d07ae4802 100644 --- a/crates/algokit_transact/src/transactions/asset_freeze.rs +++ b/crates/algokit_transact/src/transactions/asset_freeze.rs @@ -5,7 +5,7 @@ use crate::address::Address; use crate::transactions::common::TransactionHeader; -use crate::utils::{is_false_opt, is_zero, is_zero_addr}; +use crate::utils::{is_zero, is_zero_addr}; use crate::Transaction; use derive_builder::Builder; use serde::{Deserialize, Serialize}; @@ -46,9 +46,9 @@ pub struct AssetFreezeTransactionFields { /// `false` to unfreeze the asset holdings (allow transfers). #[serde(rename = "afrz")] #[serde(default)] - #[serde(skip_serializing_if = "is_false_opt")] + #[serde(skip_serializing_if = "std::ops::Not::not")] #[builder(default)] - pub frozen: Option, + pub frozen: bool, } impl AssetFreezeTransactionBuilder { diff --git a/crates/algokit_transact_ffi/src/transactions/asset_freeze.rs b/crates/algokit_transact_ffi/src/transactions/asset_freeze.rs index 2d63dc749..e54e1a64c 100644 --- a/crates/algokit_transact_ffi/src/transactions/asset_freeze.rs +++ b/crates/algokit_transact_ffi/src/transactions/asset_freeze.rs @@ -24,7 +24,7 @@ impl From for AssetFreezeTransac Self { asset_id: tx.asset_id, freeze_target: tx.freeze_target.into(), - frozen: tx.frozen.unwrap_or(false), + frozen: tx.frozen, } } } @@ -46,7 +46,7 @@ impl TryFrom for algokit_transact::AssetFreezeTransactionFields { header, asset_id: data.asset_id, freeze_target: data.freeze_target.try_into()?, - frozen: Some(data.frozen), + frozen: data.frozen, }) } } diff --git a/crates/algokit_transact_ffi/test_data.json b/crates/algokit_transact_ffi/test_data.json index d3f405e68..29db06e2d 100644 --- a/crates/algokit_transact_ffi/test_data.json +++ b/crates/algokit_transact_ffi/test_data.json @@ -46418,40 +46418,40 @@ ] }, "assetUnfreeze": { - "id": "VINBVNROEEKTL2PYC25RY5UCF3Q2RAJIRORFVEZSALAKPMJL7ZFQ", + "id": "LZ2ODDAT4ATAVJUEQW34DIKMPCMBXCCHOSIYKMWGBPEVNHLSEV2A", "idRaw": [ - 170, - 26, - 26, - 182, - 46, - 33, - 21, - 53, - 233, - 248, - 22, - 187, - 28, - 118, - 130, - 46, + 94, + 116, 225, - 168, - 129, - 40, - 139, - 162, - 90, - 147, + 140, + 19, + 224, + 38, + 10, + 166, + 132, + 133, + 183, + 193, + 161, + 76, + 120, + 152, + 27, + 136, + 71, + 116, + 145, + 133, 50, - 2, - 192, - 167, - 177, - 43, - 254, - 75 + 198, + 11, + 201, + 86, + 157, + 114, + 37, + 116 ], "rekeyedSenderAuthAddress": { "address": "BKDYDIDVSZCP75JVCB76P3WBJRY6HWAIFDSEOKYHJY5WMNJ2UWJ65MYETU", @@ -46537,75 +46537,75 @@ 103, 196, 64, - 113, - 20, - 151, - 241, + 175, + 9, + 1, + 124, + 13, + 49, + 32, + 162, + 169, + 7, + 82, 195, - 133, - 24, + 84, + 149, + 184, + 204, + 117, + 124, + 46, + 20, + 212, + 5, + 21, + 84, + 156, + 55, + 141, 161, - 172, - 250, - 95, - 201, - 49, - 83, - 140, - 231, - 31, - 113, - 145, - 128, - 79, - 171, - 23, - 252, + 174, + 195, + 198, + 182, + 244, + 221, 131, - 159, - 108, - 28, - 144, - 47, - 160, - 124, - 144, - 25, - 200, - 8, - 216, - 211, - 14, - 113, + 94, + 148, 224, - 154, - 137, - 149, - 208, - 25, - 45, - 138, - 16, - 254, - 147, - 202, - 251, - 193, - 135, - 20, - 254, + 189, + 92, + 177, + 217, 119, - 146, - 203, - 128, - 44, - 172, - 8, + 76, + 186, + 85, + 196, + 66, + 174, + 114, + 177, + 238, + 129, + 97, + 196, + 46, + 221, + 15, + 108, + 226, + 227, + 238, + 11, + 4, 163, 116, 120, 110, - 139, + 137, 164, 102, 97, @@ -46613,48 +46613,45 @@ 100, 196, 32, - 202, - 105, - 187, - 232, - 58, - 131, - 118, + 206, + 33, + 127, + 135, + 62, + 89, + 166, + 63, + 208, + 82, + 250, + 123, 26, - 5, - 9, - 247, - 19, - 158, - 251, - 181, - 223, - 182, - 6, - 152, - 52, - 27, - 151, - 112, - 36, - 227, - 185, 144, - 134, - 97, - 94, + 10, + 61, + 18, + 245, + 108, + 173, + 73, + 115, + 93, + 25, + 244, + 196, 181, - 118, + 50, + 160, + 3, + 169, + 78, 164, 102, 97, 105, 100, - 206, - 101, - 193, - 4, - 207, + 204, + 185, 163, 102, 101, @@ -46666,178 +46663,108 @@ 102, 118, 206, - 2, - 59, - 166, - 10, - 163, - 103, - 101, - 110, - 172, - 109, - 97, - 105, - 110, - 110, - 101, - 116, - 45, - 118, - 49, - 46, - 48, - 162, + 0, + 50, + 3, + 15, + 162, 103, 104, 196, 32, - 192, - 97, - 196, - 216, - 252, - 29, - 189, - 222, - 210, - 215, - 96, - 75, - 228, - 86, - 142, - 63, - 109, - 4, - 25, - 135, + 72, + 99, + 181, + 24, + 164, + 179, + 200, + 78, + 200, + 16, + 242, + 45, + 79, + 16, + 129, + 203, + 15, + 113, + 240, + 89, + 167, 172, - 55, - 189, - 228, - 182, 32, - 181, - 171, - 57, - 36, - 138, - 223, - 163, - 103, - 114, + 222, + 198, + 47, + 127, 112, - 196, - 32, - 196, - 68, - 99, - 197, - 84, 229, - 53, - 191, - 35, - 120, - 118, - 181, - 234, - 169, - 169, - 196, - 51, - 33, - 227, - 231, - 92, - 12, - 42, - 36, - 59, - 175, - 80, - 156, - 209, - 18, - 108, - 89, + 9, + 58, + 34, 162, 108, 118, 206, - 2, - 59, - 169, - 242, + 0, + 50, + 6, + 247, 164, 110, 111, 116, 101, 196, - 23, - 78, - 70, - 84, - 32, - 102, - 114, - 101, - 101, - 122, - 101, - 100, - 32, - 98, - 121, - 32, - 108, - 111, - 102, - 116, - 121, - 46, - 97, - 105, + 8, + 182, + 30, + 9, + 15, + 17, + 81, + 57, + 12, 163, 115, 110, 100, 196, 32, - 39, - 1, - 226, - 213, - 7, - 188, - 179, 178, - 254, - 23, - 136, - 157, - 60, + 207, + 213, + 145, + 117, + 145, + 43, + 5, + 243, + 171, 12, - 104, - 93, 97, - 130, - 4, - 167, - 239, - 143, 129, - 161, - 24, - 191, - 37, - 91, - 203, - 80, + 45, + 32, 191, - 77, + 149, + 7, + 154, + 212, + 199, + 108, + 116, + 222, + 177, + 174, + 154, + 252, + 102, + 129, + 128, + 10, 164, 116, 121, @@ -46857,75 +46784,75 @@ 103, 196, 64, - 113, - 20, - 151, - 241, - 195, - 133, - 24, - 161, - 172, - 250, - 95, - 201, + 175, + 9, + 1, + 124, + 13, 49, - 83, - 140, - 231, - 31, - 113, - 145, - 128, - 79, - 171, - 23, - 252, - 131, - 159, - 108, - 28, - 144, - 47, - 160, + 32, + 162, + 169, + 7, + 82, + 195, + 84, + 149, + 184, + 204, + 117, 124, - 144, - 25, - 200, - 8, - 216, - 211, - 14, - 113, - 224, - 154, - 137, - 149, - 208, - 25, - 45, - 138, - 16, - 254, - 147, - 202, - 251, - 193, - 135, + 46, 20, - 254, + 212, + 5, + 21, + 84, + 156, + 55, + 141, + 161, + 174, + 195, + 198, + 182, + 244, + 221, + 131, + 94, + 148, + 224, + 189, + 92, + 177, + 217, 119, - 146, - 203, - 128, - 44, - 172, - 8, + 76, + 186, + 85, + 196, + 66, + 174, + 114, + 177, + 238, + 129, + 97, + 196, + 46, + 221, + 15, + 108, + 226, + 227, + 238, + 11, + 4, 163, 116, 120, 110, - 139, + 137, 164, 102, 97, @@ -46933,48 +46860,45 @@ 100, 196, 32, - 202, - 105, - 187, - 232, - 58, - 131, - 118, + 206, + 33, + 127, + 135, + 62, + 89, + 166, + 63, + 208, + 82, + 250, + 123, 26, - 5, - 9, - 247, - 19, - 158, - 251, - 181, - 223, - 182, - 6, - 152, - 52, - 27, - 151, - 112, - 36, - 227, - 185, 144, - 134, - 97, - 94, + 10, + 61, + 18, + 245, + 108, + 173, + 73, + 115, + 93, + 25, + 244, + 196, 181, - 118, + 50, + 160, + 3, + 169, + 78, 164, 102, 97, 105, 100, - 206, - 101, - 193, - 4, - 207, + 204, + 185, 163, 102, 101, @@ -46986,178 +46910,108 @@ 102, 118, 206, - 2, - 59, - 166, - 10, - 163, - 103, - 101, - 110, - 172, - 109, - 97, - 105, - 110, - 110, - 101, - 116, - 45, - 118, - 49, - 46, - 48, + 0, + 50, + 3, + 15, 162, 103, 104, 196, 32, - 192, - 97, - 196, - 216, - 252, - 29, - 189, - 222, - 210, - 215, - 96, - 75, - 228, - 86, - 142, - 63, - 109, - 4, - 25, - 135, + 72, + 99, + 181, + 24, + 164, + 179, + 200, + 78, + 200, + 16, + 242, + 45, + 79, + 16, + 129, + 203, + 15, + 113, + 240, + 89, + 167, 172, - 55, - 189, - 228, - 182, 32, - 181, - 171, - 57, - 36, - 138, - 223, - 163, - 103, - 114, + 222, + 198, + 47, + 127, 112, - 196, - 32, - 196, - 68, - 99, - 197, - 84, 229, - 53, - 191, - 35, - 120, - 118, - 181, - 234, - 169, - 169, - 196, - 51, - 33, - 227, - 231, - 92, - 12, - 42, - 36, - 59, - 175, - 80, - 156, - 209, - 18, - 108, - 89, + 9, + 58, + 34, 162, 108, 118, 206, - 2, - 59, - 169, - 242, + 0, + 50, + 6, + 247, 164, 110, 111, 116, 101, 196, - 23, - 78, - 70, - 84, - 32, - 102, - 114, - 101, - 101, - 122, - 101, - 100, - 32, - 98, - 121, - 32, - 108, - 111, - 102, - 116, - 121, - 46, - 97, - 105, + 8, + 182, + 30, + 9, + 15, + 17, + 81, + 57, + 12, 163, 115, 110, 100, 196, 32, - 39, - 1, - 226, - 213, - 7, - 188, - 179, 178, - 254, - 23, - 136, - 157, - 60, + 207, + 213, + 145, + 117, + 145, + 43, + 5, + 243, + 171, 12, - 104, - 93, 97, - 130, - 4, - 167, - 239, - 143, 129, - 161, - 24, - 191, - 37, - 91, - 203, - 80, + 45, + 32, 191, - 77, + 149, + 7, + 154, + 212, + 199, + 108, + 116, + 222, + 177, + 174, + 154, + 252, + 102, + 129, + 128, + 10, 164, 116, 121, @@ -47205,178 +47059,127 @@ ], "transaction": { "assetFreeze": { - "assetId": 1707148495, + "assetId": 185, "freezeTarget": { - "address": "ZJU3X2B2QN3BUBIJ64JZ565V363ANGBUDOLXAJHDXGIIMYK6WV3NSNCBQQ", + "address": "ZYQX7BZ6LGTD7UCS7J5RVEAKHUJPK3FNJFZV2GPUYS2TFIADVFHDBKTN7I", "pubKey": [ - 202, - 105, - 187, - 232, - 58, - 131, - 118, + 206, + 33, + 127, + 135, + 62, + 89, + 166, + 63, + 208, + 82, + 250, + 123, 26, - 5, - 9, - 247, - 19, - 158, - 251, - 181, - 223, - 182, - 6, - 152, - 52, - 27, - 151, - 112, - 36, - 227, - 185, 144, - 134, - 97, - 94, + 10, + 61, + 18, + 245, + 108, + 173, + 73, + 115, + 93, + 25, + 244, + 196, 181, - 118 + 50, + 160, + 3, + 169, + 78 ] - }, - "frozen": false + } }, "fee": 1000, - "firstValid": 37463562, + "firstValid": 3277583, "genesisHash": [ - 192, - 97, - 196, - 216, - 252, - 29, - 189, - 222, - 210, - 215, - 96, - 75, - 228, - 86, - 142, - 63, - 109, - 4, - 25, - 135, + 72, + 99, + 181, + 24, + 164, + 179, + 200, + 78, + 200, + 16, + 242, + 45, + 79, + 16, + 129, + 203, + 15, + 113, + 240, + 89, + 167, 172, - 55, - 189, - 228, - 182, 32, - 181, - 171, - 57, - 36, - 138, - 223 - ], - "genesisId": "mainnet-v1.0", - "group": [ - 196, - 68, - 99, - 197, - 84, + 222, + 198, + 47, + 127, + 112, 229, - 53, - 191, - 35, - 120, - 118, - 181, - 234, - 169, - 169, - 196, - 51, - 33, - 227, - 231, - 92, - 12, - 42, - 36, - 59, - 175, - 80, - 156, - 209, - 18, - 108, - 89 + 9, + 58, + 34 ], - "lastValid": 37464562, + "lastValid": 3278583, "note": [ - 78, - 70, - 84, - 32, - 102, - 114, - 101, - 101, - 122, - 101, - 100, - 32, - 98, - 121, - 32, - 108, - 111, - 102, - 116, - 121, - 46, - 97, - 105 + 182, + 30, + 9, + 15, + 17, + 81, + 57, + 12 ], "sender": { - "address": "E4A6FVIHXSZ3F7QXRCOTYDDILVQYEBFH56HYDIIYX4SVXS2QX5GUTBVZHY", + "address": "WLH5LELVSEVQL45LBRQYCLJAX6KQPGWUY5WHJXVRV2NPYZUBQAFPH22Q7A", "pubKey": [ - 39, - 1, - 226, - 213, - 7, - 188, - 179, 178, - 254, - 23, - 136, - 157, - 60, + 207, + 213, + 145, + 117, + 145, + 43, + 5, + 243, + 171, 12, - 104, - 93, 97, - 130, - 4, - 167, - 239, - 143, 129, - 161, - 24, - 191, - 37, - 91, - 203, - 80, + 45, + 32, 191, - 77 + 149, + 7, + 154, + 212, + 199, + 108, + 116, + 222, + 177, + 174, + 154, + 252, + 102, + 129, + 128, + 10 ] }, "transactionType": "AssetFreeze" @@ -47384,56 +47187,53 @@ "unsignedBytes": [ 84, 88, - 139, + 137, 164, 102, 97, 100, 100, 196, - 32, - 202, - 105, - 187, - 232, - 58, - 131, - 118, - 26, - 5, - 9, - 247, - 19, - 158, - 251, - 181, - 223, - 182, - 6, - 152, - 52, - 27, - 151, - 112, - 36, - 227, - 185, + 32, + 206, + 33, + 127, + 135, + 62, + 89, + 166, + 63, + 208, + 82, + 250, + 123, + 26, 144, - 134, - 97, - 94, + 10, + 61, + 18, + 245, + 108, + 173, + 73, + 115, + 93, + 25, + 244, + 196, 181, - 118, + 50, + 160, + 3, + 169, + 78, 164, 102, 97, 105, 100, - 206, - 101, - 193, - 4, - 207, + 204, + 185, 163, 102, 101, @@ -47445,178 +47245,108 @@ 102, 118, 206, - 2, - 59, - 166, - 10, - 163, - 103, - 101, - 110, - 172, - 109, - 97, - 105, - 110, - 110, - 101, - 116, - 45, - 118, - 49, - 46, - 48, + 0, + 50, + 3, + 15, 162, 103, 104, 196, 32, - 192, - 97, - 196, - 216, - 252, - 29, - 189, - 222, - 210, - 215, - 96, - 75, - 228, - 86, - 142, - 63, - 109, - 4, - 25, - 135, + 72, + 99, + 181, + 24, + 164, + 179, + 200, + 78, + 200, + 16, + 242, + 45, + 79, + 16, + 129, + 203, + 15, + 113, + 240, + 89, + 167, 172, - 55, - 189, - 228, - 182, 32, - 181, - 171, - 57, - 36, - 138, - 223, - 163, - 103, - 114, + 222, + 198, + 47, + 127, 112, - 196, - 32, - 196, - 68, - 99, - 197, - 84, 229, - 53, - 191, - 35, - 120, - 118, - 181, - 234, - 169, - 169, - 196, - 51, - 33, - 227, - 231, - 92, - 12, - 42, - 36, - 59, - 175, - 80, - 156, - 209, - 18, - 108, - 89, + 9, + 58, + 34, 162, 108, 118, 206, - 2, - 59, - 169, - 242, + 0, + 50, + 6, + 247, 164, 110, 111, 116, 101, 196, - 23, - 78, - 70, - 84, - 32, - 102, - 114, - 101, - 101, - 122, - 101, - 100, - 32, - 98, - 121, - 32, - 108, - 111, - 102, - 116, - 121, - 46, - 97, - 105, + 8, + 182, + 30, + 9, + 15, + 17, + 81, + 57, + 12, 163, 115, 110, 100, 196, 32, - 39, - 1, - 226, - 213, - 7, - 188, - 179, 178, - 254, - 23, - 136, - 157, - 60, + 207, + 213, + 145, + 117, + 145, + 43, + 5, + 243, + 171, 12, - 104, - 93, 97, - 130, - 4, - 167, - 239, - 143, 129, - 161, - 24, - 191, - 37, - 91, - 203, - 80, + 45, + 32, 191, - 77, + 149, + 7, + 154, + 212, + 199, + 108, + 116, + 222, + 177, + 174, + 154, + 252, + 102, + 129, + 128, + 10, 164, 116, 121,