From 59683d4fb2c651753f7895f40e76418c930f8389 Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Tue, 06 Dec 2022 08:43:23 +0000 Subject: [PATCH] feat: add evm event `CollectionChanged` for sub events : `CollectionPropertySet`, `CollectionPropertyDeleted`, `PropertyPermissionSet` --- --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -58,6 +58,12 @@ #[indexed] collection_id: address, }, + /// The collection has been changed. + CollectionChanged { + /// Collection ID. + #[indexed] + collection_id: address, + }, } /// Does not always represent a full collection, for RFT it is either --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -1036,6 +1036,12 @@ .map_err(>::from)?; Self::deposit_event(Event::CollectionPropertySet(collection.id, property.key)); + >::deposit_log( + erc::CollectionHelpersEvents::CollectionChanged { + collection_id: eth::collection_id_to_address(collection.id), + } + .to_log(T::ContractAddress::get()), + ); Ok(()) } @@ -1115,6 +1121,12 @@ collection.id, property_key, )); + >::deposit_log( + erc::CollectionHelpersEvents::CollectionChanged { + collection_id: eth::collection_id_to_address(collection.id), + } + .to_log(T::ContractAddress::get()), + ); Ok(()) } @@ -1209,6 +1221,12 @@ collection.id, property_permission.key, )); + >::deposit_log( + erc::CollectionHelpersEvents::CollectionChanged { + collection_id: eth::collection_id_to_address(collection.id), + } + .to_log(T::ContractAddress::get()), + ); Ok(()) } --- a/pallets/unique/src/eth/stubs/CollectionHelpers.sol +++ b/pallets/unique/src/eth/stubs/CollectionHelpers.sol @@ -21,6 +21,7 @@ contract CollectionHelpersEvents { event CollectionCreated(address indexed owner, address indexed collectionId); event CollectionDestroyed(address indexed collectionId); + event CollectionChanged(address indexed collectionId); } /// @title Contract, which allows users to operate with collections --- a/tests/src/eth/abi/collectionHelpers.json +++ b/tests/src/eth/abi/collectionHelpers.json @@ -5,6 +5,19 @@ { "indexed": true, "internalType": "address", + "name": "collectionId", + "type": "address" + } + ], + "name": "CollectionChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", "name": "owner", "type": "address" }, --- a/tests/src/eth/api/CollectionHelpers.sol +++ b/tests/src/eth/api/CollectionHelpers.sol @@ -16,6 +16,7 @@ interface CollectionHelpersEvents { event CollectionCreated(address indexed owner, address indexed collectionId); event CollectionDestroyed(address indexed collectionId); + event CollectionChanged(address indexed collectionId); } /// @title Contract, which allows users to operate with collections --- /dev/null +++ b/tests/src/eth/events.test.ts @@ -0,0 +1,139 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +// Unique Network is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Unique Network is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Unique Network. If not, see . + +import {IKeyringPair} from '@polkadot/types/types'; +import { expect } from 'chai'; +import { itEth, usingEthPlaygrounds } from './util'; + +describe.only('NFT events', () => { + let donor: IKeyringPair; + + before(async function () { + await usingEthPlaygrounds(async (_helper, privateKey) => { + donor = await privateKey({filename: __filename}); + }); + }); + + itEth('Create event', async ({helper}) => { + const owner = await helper.eth.createAccountWithBalance(donor); + const {collectionAddress, events} = await helper.eth.createCollecion('createNFTCollection', owner, 'A', 'B', 'C'); + expect(events).to.be.like([ + { + event: 'CollectionCreated', + args: { + owner: owner, + collectionId: collectionAddress + } + } + ]); + }); + + itEth('Destroy event', async ({helper}) => { + const owner = await helper.eth.createAccountWithBalance(donor); + const {collectionAddress} = await helper.eth.createCollecion('createNFTCollection', owner, 'A', 'B', 'C'); + const collectionHelper = helper.ethNativeContract.collectionHelpers(owner); + let resutl = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner}); + expect(resutl.events).to.be.like({ + CollectionDestroyed: { + returnValues: { + collectionId: collectionAddress + } + } + }); + }); + + itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => { + const owner = await helper.eth.createAccountWithBalance(donor); + const {collectionAddress} = await helper.eth.createCollecion('createNFTCollection', owner, 'A', 'B', 'C'); + const collection = await helper.ethNativeContract.collection(collectionAddress, 'nft', owner); + const collectionHelper = helper.ethNativeContract.collectionHelpers(owner); + + { + const events: any = []; + collectionHelper.events.allEvents((_: any, event: any) => { + events.push(event); + }); + await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner}); + expect(events).to.be.like([ + { + event: 'CollectionChanged', + returnValues: { + collectionId: collectionAddress + } + } + ]); + } + { + const events: any = []; + collectionHelper.events.allEvents((_: any, event: any) => { + events.push(event); + }); + await collection.methods.deleteCollectionProperties(['A']).send({from:owner}); + expect(events).to.be.like([ + { + event: 'CollectionChanged', + returnValues: { + collectionId: collectionAddress + } + } + ]); + } + + }); + + itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => { + const owner = await helper.eth.createAccountWithBalance(donor); + const {collectionAddress} = await helper.eth.createCollecion('createNFTCollection', owner, 'A', 'B', 'C'); + const collection = await helper.ethNativeContract.collection(collectionAddress, 'nft', owner); + const collectionHelper = helper.ethNativeContract.collectionHelpers(owner); + const events: any = []; + collectionHelper.events.allEvents((_: any, event: any) => { + events.push(event); + }); + await collection.methods.setTokenPropertyPermission('testKey', true, true, true).send({from: owner}); + expect(events).to.be.like([ + { + event: 'CollectionChanged', + returnValues: { + collectionId: collectionAddress + } + } + ]); + }); + + // itEth('CollectionChanged event for AllowListAddressAdded', async ({helper}) => { + // const owner = await helper.eth.createAccountWithBalance(donor); + // const user = await helper.eth.createAccount(); + // const userCross = helper.ethCrossAccount.fromAddress(user); + // const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}); + // // allow list does not need to be enabled to add someone in advance + // const collection = await helper.ethNativeContract.collection(collectionAddress, 'nft', owner); + // const collectionHelper = helper.ethNativeContract.collectionHelpers(owner); + // const events: any = []; + // collectionHelper.events.allEvents((_: any, event: any) => { + // events.push(event); + // }); + // await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address}); + // expect(events).to.be.like([ + // { + // event: 'CollectionChanged', + // returnValues: { + // collectionId: collectionAddress + // } + // } + // ]); + // }); +}); \ No newline at end of file -- gitstuff