difftreelog
chore add transfer event for `burn` and `create_multiple_items`
in: master
3 files changed
pallets/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),
tests/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,
tests/src/eth/reFungibleToken.test.tsdiffbeforeafterboth277 {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 });445446 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'});453454 const tokenId = await contract.methods.nextTokenId().call();455 await contract.methods.mint(caller, tokenId).send();456457 const address = tokenIdToAddress(collectionId, tokenId);458459 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();462463 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});446478447describe('Refungible: Fees', () => {479describe('Refungible: Fees', () => {