Hey dfinity devs , I am trying to replicate the hash calculation in rust , here is my code ( written in c-style)
// c wrapper for hash
#[no_mangle]
pub extern "C" fn c_transaction_hash(
from: *const i8,
to: *const i8,
amount: u64,
fee: u64,
memo: u64,
created_at_time: u64,
use_created_at_time: bool,
icrc1_memo_hex_str: *const i8,
use_memo : bool,
) -> *mut i8 {
let from = unsafe { std::ffi::CStr::from_ptr(from).to_str().unwrap() };
let to = unsafe { std::ffi::CStr::from_ptr(to).to_str().unwrap() };
let icrc1_memo = if icrc1_memo_hex_str.is_null() {
None
} else {
Some(
unsafe { std::ffi::CStr::from_ptr(icrc1_memo_hex_str) }
.to_str()
.map(|s| ByteBuf::from(hex::decode(s).unwrap()))
.unwrap()
)
};
let transaction = Transaction {
operation: Operation::Transfer {
from: AccountIdentifier::from_str(from).unwrap(),
to: AccountIdentifier::from_str(to).unwrap(),
amount: Tokens::from_e8s(amount),
fee: Tokens::from_e8s(fee),
spender: None,
},
memo: Memo(memo),
created_at_time: match use_created_at_time {
true => Some(TimeStamp::from_nanos_since_unix_epoch(created_at_time)),
false => None,
},
icrc1_memo : match use_memo {
true => icrc1_memo,
false => None,
},
};
let hash = transaction.hash().to_string();
let c_str = CString::new(hash).unwrap();
c_str.into_raw()
}
I noticed that some time we need to specify created_at_time:
8f3a2b5e0b32f0cfca2f2c5aef4cc29fe064006837eaf987707299677ceab13e
sometime we need to put created_at_time as None , like this one
7fe4f93f2a4af594a1d0d25f69f9e773b933a8f1935501291aaaf17414c7e375
I can’t post the directly dashboard transaction link as it is prohibited
I noticed this weird behaviour with non-empty icrc1_memo.
Can anyone confirm this ?
Even better , a link to the source that implement the dashboard transaction hash will be greatly appreciated.