diff --git a/precompile/erc721/src/lib.rs b/precompile/erc721/src/lib.rs index 21e9c35..624263d 100644 --- a/precompile/erc721/src/lib.rs +++ b/precompile/erc721/src/lib.rs @@ -92,6 +92,8 @@ where let from: H160 = input.read::
()?.into(); let to: H160 = input.read::
()?.into(); let asset_id: U256 = input.read()?; + let mut asset_id_big_endian = [0u8; 32]; + asset_id.to_big_endian(&mut asset_id_big_endian); AssetManager::transfer_from(handle.context().caller, collection_id, from, to, asset_id) .map_err(|err| revert(err))?; @@ -101,7 +103,7 @@ where SELECTOR_LOG_TRANSFER_FROM, from, to, - H256::from_slice(asset_id.encode().as_slice()), + H256::from_slice(asset_id_big_endian.as_slice()), Vec::new(), ) .record(handle)?; diff --git a/precompile/erc721/src/tests.rs b/precompile/erc721/src/tests.rs index df6125a..38ec6b1 100644 --- a/precompile/erc721/src/tests.rs +++ b/precompile/erc721/src/tests.rs @@ -189,6 +189,67 @@ mod transfer_from { assert!(result.is_err()); assert_eq!(result.unwrap_err(), revert("this is an error")); } + + #[test] + fn check_log_selectors() { + assert_eq!( + hex::encode(SELECTOR_LOG_TRANSFER_FROM), + "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" + ); + } + + #[test] + fn transfer_from_should_generate_log() { + impl_precompile_mock_simple!( + Mock, + // owner_of result + Ok(H160::from_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap()), + // token_uri result + Ok(vec![]), + // transfer_from result + Ok(()) + ); + + // test data + let from = H160::repeat_byte(0xAA); + let to = H160::repeat_byte(0xBB); + let asset_id = 4; + let contract_address = H160::from_str("ffffffffffffffffffffffff0000000000000005"); + + let input_data = EvmDataWriter::new_with_selector(Action::TransferFrom) + .write(Address(from)) + .write(Address(to)) + .write(U256::from(asset_id)) + .build(); + + let mut handle = create_mock_handle( + input_data, + 0, + 0, + H160::from_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap(), + ); + handle.code_address = contract_address.unwrap(); + assert_ok!(Mock::execute(&mut handle)); + + let logs = handle.logs; + assert_eq!(logs.len(), 1); + assert_eq!(logs[0].address, H160::zero()); + assert_eq!(logs[0].topics.len(), 4); + assert_eq!(logs[0].topics[0], SELECTOR_LOG_TRANSFER_FROM.into()); + assert_eq!( + hex::encode(logs[0].topics[1]), + "000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + ); + assert_eq!( + hex::encode(logs[0].topics[2]), + "000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ); + assert_eq!( + hex::encode(logs[0].topics[3]), + "0000000000000000000000000000000000000000000000000000000000000004" + ); + assert_eq!(logs[0].data, Vec::::new()); + } } #[test] fn token_uri_should_return_a_string() {