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
399399
400 pub fn burn_token_unchecked(400 pub fn burn_token_unchecked(
401 collection: &RefungibleHandle<T>,401 collection: &RefungibleHandle<T>,
402 owner: &T::CrossAccountId,
402 token_id: TokenId,403 token_id: TokenId,
403 ) -> DispatchResult {404 ) -> DispatchResult {
404 let burnt = <TokensBurnt<T>>::get(collection.id)405 let burnt = <TokensBurnt<T>>::get(collection.id)
411 <TotalSupply<T>>::remove((collection.id, token_id));412 <TotalSupply<T>>::remove((collection.id, token_id));
412 <Balance<T>>::remove_prefix((collection.id, token_id), None);413 <Balance<T>>::remove_prefix((collection.id, token_id), None);
413 <Allowance<T>>::remove_prefix((collection.id, token_id), None);414 <Allowance<T>>::remove_prefix((collection.id, token_id), None);
414 // TODO: ERC721 transfer event415
416 <PalletEvm<T>>::deposit_log(
417 ERC721Events::Transfer {
418 from: *owner.as_eth(),
419 to: H160::default(),
420 token_id: token_id.into(),
421 }
422 .to_log(collection_id_to_address(collection.id)),
423 );
415 Ok(())424 Ok(())
416 }425 }
417426
453 <Owned<T>>::remove((collection.id, owner, token));462 <Owned<T>>::remove((collection.id, owner, token));
454 <PalletStructure<T>>::unnest_if_nested(owner, collection.id, token);463 <PalletStructure<T>>::unnest_if_nested(owner, collection.id, token);
455 <AccountBalance<T>>::insert((collection.id, owner), account_balance);464 <AccountBalance<T>>::insert((collection.id, owner), account_balance);
456 Self::burn_token_unchecked(collection, token)?;465 Self::burn_token_unchecked(collection, owner, token)?;
457 <PalletEvm<T>>::deposit_log(466 <PalletEvm<T>>::deposit_log(
458 ERC721Events::Transfer {467 ERC20Events::Transfer {
459 from: *owner.as_eth(),468 from: *owner.as_eth(),
460 to: H160::default(),469 to: H160::default(),
461 token_id: token.into(),470 value: amount.into(),
462 }471 }
463 .to_log(collection_id_to_address(collection.id)),472 .to_log(collection_id_to_address(collection.id)),
464 );473 );
491 <Balance<T>>::remove((collection.id, token, owner));500 <Balance<T>>::remove((collection.id, token, owner));
492 <AccountBalance<T>>::insert((collection.id, owner), account_balance);501 <AccountBalance<T>>::insert((collection.id, owner), account_balance);
502
503 if let Some(user) = Self::token_owner(collection.id, token) {
504 <PalletEvm<T>>::deposit_log(
505 ERC721Events::Transfer {
506 from: erc::ADDRESS_FOR_PARTIALLY_OWNED_TOKENS,
507 to: *user.as_eth(),
508 token_id: token.into(),
509 }
510 .to_log(collection_id_to_address(collection.id)),
511 );
512 }
493 } else {513 } else {
494 <Balance<T>>::insert((collection.id, token, owner), balance);514 <Balance<T>>::insert((collection.id, token, owner), balance);
495 }515 }
981 for (i, token) in data.into_iter().enumerate() {1001 for (i, token) in data.into_iter().enumerate() {
982 let token_id = first_token_id + i as u32 + 1;1002 let token_id = first_token_id + i as u32 + 1;
1003
1004 let receivers = token
1005 .users
1006 .into_iter()
1007 .filter(|(_, amount)| *amount > 0)
1008 .collect::<Vec<_>>();
1009
1010 if let [(user, _)] = receivers.as_slice() {
1011 // if there is exactly one receiver
1012 <PalletEvm<T>>::deposit_log(
1013 ERC721Events::Transfer {
1014 from: H160::default(),
1015 to: *user.as_eth(),
1016 token_id: token_id.into(),
1017 }
1018 .to_log(collection_id_to_address(collection.id)),
1019 );
1020 } else if let [_, ..] = receivers.as_slice() {
1021 // if there is more than one receiver
1022 <PalletEvm<T>>::deposit_log(
1023 ERC721Events::Transfer {
1024 from: H160::default(),
1025 to: erc::ADDRESS_FOR_PARTIALLY_OWNED_TOKENS,
1026 token_id: token_id.into(),
1027 }
1028 .to_log(collection_id_to_address(collection.id)),
1029 );
1030 }
9831031
984 for (user, amount) in token.users.into_iter() {1032 for (user, amount) in receivers.into_iter() {
985 if amount == 0 {
986 continue;
987 }
988
989 <PalletEvm<T>>::deposit_log(1033 <PalletEvm<T>>::deposit_log(
990 ERC20Events::Transfer {1034 ERC20Events::Transfer {
997 TokenId(token_id),1041 TokenId(token_id),
998 )),1042 )),
999 );1043 );
1000 <PalletEvm<T>>::deposit_log(
1001 ERC721Events::Transfer {
1002 from: H160::default(),
1003 to: *user.as_eth(),
1004 token_id: token_id.into(),
1005 }
1006 .to_log(collection_id_to_address(collection.id)),
1007 );
1008 <PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(1044 <PalletCommon<T>>::deposit_event(CommonEvent::ItemCreated(
1009 collection.id,1045 collection.id,
1010 TokenId(token_id),1046 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
--- a/tests/src/eth/reFungibleToken.test.ts
+++ b/tests/src/eth/reFungibleToken.test.ts
@@ -277,7 +277,7 @@
     {
       const result = await contract.methods.transferFrom(owner, receiver, 49).send({from: spender});
       const events = normalizeEvents(result.events);
-      expect(events).to.be.deep.equal([
+      expect(events).to.include.deep.members([
         {
           address,
           event: 'Transfer',
@@ -329,7 +329,7 @@
     {
       const result = await contract.methods.transfer(receiver, 50).send({from: owner});
       const events = normalizeEvents(result.events);
-      expect(events).to.be.deep.equal([
+      expect(events).to.include.deep.members([
         {
           address,
           event: 'Transfer',
@@ -442,6 +442,38 @@
       },
     ]);
   });
+
+  itWeb3('Receiving Transfer event on burning into full ownership', async ({web3, api, privateKeyWrapper}) => {
+    const caller = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+    const receiver = await createEthAccountWithBalance(api, web3, privateKeyWrapper);
+    const helper = evmCollectionHelpers(web3, caller);
+    const result = await helper.methods.createRefungibleCollection('Mint collection', '6', '6').send();
+    const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result);
+    const contract = evmCollection(web3, caller, collectionIdAddress, {type: 'ReFungible'});
+
+    const tokenId = await contract.methods.nextTokenId().call();
+    await contract.methods.mint(caller, tokenId).send();
+
+    const address = tokenIdToAddress(collectionId, tokenId);
+
+    const tokenContract =  new web3.eth.Contract(reFungibleTokenAbi as any, address, {from: caller, ...GAS_ARGS});
+    await tokenContract.methods.repartition(2).send();
+    await tokenContract.methods.transfer(receiver, 1).send();
+
+    const events =  await recordEvents(contract, async () => 
+      await tokenContract.methods.burnFrom(caller, 1).send());
+    expect(events).to.deep.equal([
+      {
+        address: collectionIdAddress,
+        event: 'Transfer',
+        args: {
+          from: '0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF',
+          to: receiver,
+          tokenId,
+        },
+      },
+    ]);
+  });
 });
 
 describe('Refungible: Fees', () => {