git.delta.rocks / unique-network / refs/commits / 9d3564ef2b56

difftreelog

chore add transfer event for `burn` and `create_multiple_items`

Grigoriy Simonov2022-08-03parent: #bb6d71b.patch.diff
in: master

3 files changed

modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -399,6 +399,7 @@
 
 	pub fn burn_token_unchecked(
 		collection: &RefungibleHandle<T>,
+		owner: &T::CrossAccountId,
 		token_id: TokenId,
 	) -> DispatchResult {
 		let burnt = <TokensBurnt<T>>::get(collection.id)
@@ -411,7 +412,15 @@
 		<TotalSupply<T>>::remove((collection.id, token_id));
 		<Balance<T>>::remove_prefix((collection.id, token_id), None);
 		<Allowance<T>>::remove_prefix((collection.id, token_id), None);
-		// TODO: ERC721 transfer event
+
+		<PalletEvm<T>>::deposit_log(
+			ERC721Events::Transfer {
+				from: *owner.as_eth(),
+				to: H160::default(),
+				token_id: token_id.into(),
+			}
+			.to_log(collection_id_to_address(collection.id)),
+		);
 		Ok(())
 	}
 
@@ -453,12 +462,12 @@
 			<Owned<T>>::remove((collection.id, owner, token));
 			<PalletStructure<T>>::unnest_if_nested(owner, collection.id, token);
 			<AccountBalance<T>>::insert((collection.id, owner), account_balance);
-			Self::burn_token_unchecked(collection, token)?;
+			Self::burn_token_unchecked(collection, owner, token)?;
 			<PalletEvm<T>>::deposit_log(
-				ERC721Events::Transfer {
+				ERC20Events::Transfer {
 					from: *owner.as_eth(),
 					to: H160::default(),
-					token_id: token.into(),
+					value: amount.into(),
 				}
 				.to_log(collection_id_to_address(collection.id)),
 			);
@@ -490,6 +499,17 @@
 			<PalletStructure<T>>::unnest_if_nested(owner, collection.id, token);
 			<Balance<T>>::remove((collection.id, token, owner));
 			<AccountBalance<T>>::insert((collection.id, owner), account_balance);
+
+			if let Some(user) = Self::token_owner(collection.id, token) {
+				<PalletEvm<T>>::deposit_log(
+					ERC721Events::Transfer {
+						from: erc::ADDRESS_FOR_PARTIALLY_OWNED_TOKENS,
+						to: *user.as_eth(),
+						token_id: token.into(),
+					}
+					.to_log(collection_id_to_address(collection.id)),
+				);
+			}
 		} else {
 			<Balance<T>>::insert((collection.id, token, owner), balance);
 		}
@@ -981,30 +1001,46 @@
 		for (i, token) in data.into_iter().enumerate() {
 			let token_id = first_token_id + i as u32 + 1;
 
-			for (user, amount) in token.users.into_iter() {
-				if amount == 0 {
-					continue;
-				}
+			let receivers = token
+				.users
+				.into_iter()
+				.filter(|(_, amount)| *amount > 0)
+				.collect::<Vec<_>>();
 
+			if let [(user, _)] = receivers.as_slice() {
+				// if there is exactly one receiver
 				<PalletEvm<T>>::deposit_log(
-					ERC20Events::Transfer {
+					ERC721Events::Transfer {
 						from: H160::default(),
 						to: *user.as_eth(),
-						value: amount.into(),
+						token_id: token_id.into(),
 					}
-					.to_log(T::EvmTokenAddressMapping::token_to_address(
-						collection.id,
-						TokenId(token_id),
-					)),
+					.to_log(collection_id_to_address(collection.id)),
 				);
+			} else if let [_, ..] = receivers.as_slice() {
+				// if there is more than one receiver
 				<PalletEvm<T>>::deposit_log(
 					ERC721Events::Transfer {
 						from: H160::default(),
-						to: *user.as_eth(),
+						to: erc::ADDRESS_FOR_PARTIALLY_OWNED_TOKENS,
 						token_id: token_id.into(),
 					}
 					.to_log(collection_id_to_address(collection.id)),
 				);
+			}
+
+			for (user, amount) in receivers.into_iter() {
+				<PalletEvm<T>>::deposit_log(
+					ERC20Events::Transfer {
+						from: H160::default(),
+						to: *user.as_eth(),
+						value: amount.into(),
+					}
+					.to_log(T::EvmTokenAddressMapping::token_to_address(
+						collection.id,
+						TokenId(token_id),
+					)),
+				);
 				<PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
 					collection.id,
 					TokenId(token_id),
modifiedtests/src/eth/reFungible.test.tsdiffbeforeafterboth
--- a/tests/src/eth/reFungible.test.ts
+++ b/tests/src/eth/reFungible.test.ts
@@ -15,7 +15,7 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {createCollectionExpectSuccess, transfer, UNIQUE} from '../util/helpers';
-import {collectionIdToAddress, createEthAccount, createEthAccountWithBalance, evmCollection, evmCollectionHelpers, GAS_ARGS, getCollectionAddressFromResult, itWeb3, normalizeEvents, recordEthFee, tokenIdToAddress} from './util/helpers';
+import {collectionIdToAddress, createEthAccount, createEthAccountWithBalance, evmCollection, evmCollectionHelpers, GAS_ARGS, getCollectionAddressFromResult, itWeb3, normalizeEvents, recordEthFee, recordEvents, tokenIdToAddress} from './util/helpers';
 import reFungibleAbi from './reFungibleAbi.json';
 import reFungibleTokenAbi from './reFungibleTokenAbi.json';
 import {expect} from 'chai';
@@ -224,8 +224,7 @@
     {
       const result = await contract.methods.burn(tokenId).send();
       const events = normalizeEvents(result.events);
-
-      expect(events).to.be.deep.equal([
+      expect(events).to.include.deep.members([
         {
           address: collectionIdAddress,
           event: 'Transfer',
@@ -333,10 +332,8 @@
     await tokenContract.methods.repartition(2).send();
     await tokenContract.methods.transfer(receiver, 1).send();
 
-    let transfer;
-    contract.events.Transfer({}, function(_error: any, event: any){ transfer = event;});
-    await tokenContract.methods.transfer(receiver, 1).send();
-    const events = normalizeEvents([transfer]);
+    const events =  await recordEvents(contract, async () => 
+      await tokenContract.methods.transfer(receiver, 1).send());
     expect(events).to.deep.equal([
       {
         address: collectionIdAddress,
@@ -366,11 +363,9 @@
 
     await tokenContract.methods.repartition(2).send();
     
-    let transfer;
-    contract.events.Transfer({}, function(_error: any, event: any){ transfer = event;});
-    await tokenContract.methods.transfer(receiver, 1).send();
-
-    const events = normalizeEvents([transfer]);
+    const events =  await recordEvents(contract, async () => 
+      await tokenContract.methods.transfer(receiver, 1).send());
+      
     expect(events).to.deep.equal([
       {
         address: collectionIdAddress,
modifiedtests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth
277 {277 {
278 const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});278 const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});
279 const events = normalizeEvents(result.events);279 const events = normalizeEvents(result.events);
280 expect(events).to.be.deep.equal([280 expect(events).to.include.deep.members([
281 {281 {
282 address,282 address,
283 event: 'Transfer',283 event: 'Transfer',
329 {329 {
330 const result = await contract.methods.transfer(receiver, 50).send({from: owner});330 const result = await contract.methods.transfer(receiver, 50).send({from: owner});
331 const events = normalizeEvents(result.events);331 const events = normalizeEvents(result.events);
332 expect(events).to.be.deep.equal([332 expect(events).to.include.deep.members([
333 {333 {
334 address,334 address,
335 event: 'Transfer',335 event: 'Transfer',
443 ]);443 ]);
444 });444 });
445
446 itWeb3('Receiving Transfer event on burning into full ownership', async ({web3, api, privateKeyWrapper}) => {
447 const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
448 const receiver = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
449 const helper = evmCollectionHelpers(web3, caller);
450 const result = await helper.methods.createRefungibleCollection('Mint collection', '6', '6').send();
451 const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);
452 const contract = evmCollection(web3, caller, collectionIdAddress, {type: 'ReFungible'});
453
454 const tokenId = await contract.methods.nextTokenId().call();
455 await contract.methods.mint(caller, tokenId).send();
456
457 const address = tokenIdToAddress(collectionId, tokenId);
458
459 const tokenContract = new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
460 await tokenContract.methods.repartition(2).send();
461 await tokenContract.methods.transfer(receiver, 1).send();
462
463 const events = await recordEvents(contract, async () =>
464 await tokenContract.methods.burnFrom(caller, 1).send());
465 expect(events).to.deep.equal([
466 {
467 address: collectionIdAddress,
468 event: 'Transfer',
469 args: {
470 from: '0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF',
471 to: receiver,
472 tokenId,
473 },
474 },
475 ]);
476 });
445});477});
446478
447describe('Refungible: Fees', () => {479describe('Refungible: Fees', () => {