From b06f11d53911edf6f806e80ed3b13ef0f08bcf0a Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Thu, 02 Feb 2023 16:39:19 +0000 Subject: [PATCH] misk: Move TokenChanged event into ERC721 contracts --- --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -26,7 +26,6 @@ }; use pallet_evm_coder_substrate::dispatch_to_evm; use sp_std::{vec, vec::Vec}; -use sp_core::U256; use up_data_structs::{ CollectionMode, CollectionPermissions, OwnerRestrictedSet, Property, SponsoringRateLimit, SponsorshipState, @@ -62,18 +61,9 @@ }, /// The collection has been changed. CollectionChanged { - /// Collection ID. - #[indexed] - collection_id: Address, - }, - - /// The token has been changed. - TokenChanged { /// Collection ID. #[indexed] collection_id: Address, - /// Token ID. - token_id: U256, }, } --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -1250,6 +1250,7 @@ mut stored_properties: Properties, is_token_owner: impl Fn() -> Result, set_token_properties: impl FnOnce(Properties), + log: evm_coder::ethereum::Log, ) -> DispatchResult { let is_collection_admin = collection.is_owner_or_admin(sender); let permissions = Self::property_permissions(collection.id); @@ -1304,13 +1305,7 @@ } } - >::deposit_log( - CollectionHelpersEvents::TokenChanged { - collection_id: eth::collection_id_to_address(collection.id), - token_id: token_id.into(), - } - .to_log(T::ContractAddress::get()), - ); + >::deposit_log(log.clone()); } set_token_properties(stored_properties); --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -50,13 +50,26 @@ TokenProperties, SelfWeightOf, weights::WeightInfo, }; +/// Nft events. +#[derive(ToLog)] +pub enum ERC721TokenEvent { + /// The token has been changed. + TokenChanged { + /// Collection ID. + #[indexed] + collection_id: Address, + /// Token ID. + token_id: U256, + }, +} + frontier_contract! { macro_rules! NonfungibleHandle_result {...} impl Contract for NonfungibleHandle {...} } /// @title A contract that allows to set and delete token properties and change token property permissions. -#[solidity_interface(name = TokenProperties, enum(derive(PreDispatch)), enum_attr(weight))] +#[solidity_interface(name = TokenProperties, events(ERC721TokenEvent), enum(derive(PreDispatch)), enum_attr(weight))] impl NonfungibleHandle { /// @notice Set permissions for token property. /// @dev Throws error if `msg.sender` is not admin or owner of the collection. --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -112,7 +112,7 @@ }; use pallet_structure::{Pallet as PalletStructure, Error as StructureError}; use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder}; -use sp_core::H160; +use sp_core::{Get, H160}; use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome}; use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap}; use core::ops::Deref; @@ -622,6 +622,11 @@ stored_properties, is_token_owner, |properties| >::set((collection.id, token_id), properties), + erc::ERC721TokenEvent::TokenChanged { + collection_id: collection_id_to_address(collection.id), + token_id: token_id.into(), + } + .to_log(T::ContractAddress::get()), ) } --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -17,9 +17,14 @@ } } +/// @dev inlined interface +contract ERC721TokenEvent { + event TokenChanged(address indexed collectionId, uint256 tokenId); +} + /// @title A contract that allows to set and delete token properties and change token property permissions. /// @dev the ERC-165 identifier for this interface is 0xde0695c2 -contract TokenProperties is Dummy, ERC165 { +contract TokenProperties is Dummy, ERC165, ERC721TokenEvent { // /// @notice Set permissions for token property. // /// @dev Throws error if `msg.sender` is not admin or owner of the collection. // /// @param key Property key. --- a/pallets/refungible/src/erc.rs +++ b/pallets/refungible/src/erc.rs @@ -59,8 +59,21 @@ pub const ADDRESS_FOR_PARTIALLY_OWNED_TOKENS: H160 = H160::repeat_byte(0xff); +/// Rft events. +#[derive(ToLog)] +pub enum ERC721TokenEvent { + /// The token has been changed. + TokenChanged { + /// Collection ID. + #[indexed] + collection_id: Address, + /// Token ID. + token_id: U256, + }, +} + /// @title A contract that allows to set and delete token properties and change token property permissions. -#[solidity_interface(name = TokenProperties, enum(derive(PreDispatch)), enum_attr(weight))] +#[solidity_interface(name = TokenProperties, events(ERC721TokenEvent), enum(derive(PreDispatch)), enum_attr(weight))] impl RefungibleHandle { /// @notice Set permissions for token property. /// @dev Throws error if `msg.sender` is not admin or owner of the collection. --- a/pallets/refungible/src/lib.rs +++ b/pallets/refungible/src/lib.rs @@ -100,7 +100,7 @@ Event as CommonEvent, Pallet as PalletCommon, }; use pallet_structure::Pallet as PalletStructure; -use sp_core::H160; +use sp_core::{Get, H160}; use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome}; use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap}; use up_data_structs::{ @@ -571,6 +571,11 @@ stored_properties, is_token_owner, |properties| >::set((collection.id, token_id), properties), + erc::ERC721TokenEvent::TokenChanged { + collection_id: collection_id_to_address(collection.id), + token_id: token_id.into(), + } + .to_log(T::ContractAddress::get()), ) } --- a/pallets/refungible/src/stubs/UniqueRefungible.sol +++ b/pallets/refungible/src/stubs/UniqueRefungible.sol @@ -17,9 +17,14 @@ } } +/// @dev inlined interface +contract ERC721TokenEvent { + event TokenChanged(address indexed collectionId, uint256 tokenId); +} + /// @title A contract that allows to set and delete token properties and change token property permissions. /// @dev the ERC-165 identifier for this interface is 0xde0695c2 -contract TokenProperties is Dummy, ERC165 { +contract TokenProperties is Dummy, ERC165, ERC721TokenEvent { // /// @notice Set permissions for token property. // /// @dev Throws error if `msg.sender` is not admin or owner of the collection. // /// @param key Property key. --- a/pallets/unique/src/eth/stubs/CollectionHelpers.sol +++ b/pallets/unique/src/eth/stubs/CollectionHelpers.sol @@ -22,7 +22,6 @@ event CollectionCreated(address indexed owner, address indexed collectionId); event CollectionDestroyed(address indexed collectionId); event CollectionChanged(address indexed collectionId); - event TokenChanged(address indexed collectionId, uint256 tokenId); } /// @title Contract, which allows users to operate with collections --- a/tests/src/eth/abi/collectionHelpers.json +++ b/tests/src/eth/abi/collectionHelpers.json @@ -45,25 +45,6 @@ "type": "event" }, { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "collectionId", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "TokenChanged", - "type": "event" - }, - { "inputs": [ { "internalType": "uint32", "name": "collectionId", "type": "uint32" } ], --- a/tests/src/eth/abi/nonFungible.json +++ b/tests/src/eth/abi/nonFungible.json @@ -55,6 +55,25 @@ { "indexed": true, "internalType": "address", + "name": "collectionId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "TokenChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", "name": "from", "type": "address" }, --- a/tests/src/eth/abi/reFungible.json +++ b/tests/src/eth/abi/reFungible.json @@ -55,6 +55,25 @@ { "indexed": true, "internalType": "address", + "name": "collectionId", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "TokenChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", "name": "from", "type": "address" }, --- a/tests/src/eth/api/CollectionHelpers.sol +++ b/tests/src/eth/api/CollectionHelpers.sol @@ -17,7 +17,6 @@ event CollectionCreated(address indexed owner, address indexed collectionId); event CollectionDestroyed(address indexed collectionId); event CollectionChanged(address indexed collectionId); - event TokenChanged(address indexed collectionId, uint256 tokenId); } /// @title Contract, which allows users to operate with collections --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -12,9 +12,14 @@ function supportsInterface(bytes4 interfaceID) external view returns (bool); } +/// @dev inlined interface +interface ERC721TokenEvent { + event TokenChanged(address indexed collectionId, uint256 tokenId); +} + /// @title A contract that allows to set and delete token properties and change token property permissions. /// @dev the ERC-165 identifier for this interface is 0xde0695c2 -interface TokenProperties is Dummy, ERC165 { +interface TokenProperties is Dummy, ERC165, ERC721TokenEvent { // /// @notice Set permissions for token property. // /// @dev Throws error if `msg.sender` is not admin or owner of the collection. // /// @param key Property key. --- a/tests/src/eth/api/UniqueRefungible.sol +++ b/tests/src/eth/api/UniqueRefungible.sol @@ -12,9 +12,14 @@ function supportsInterface(bytes4 interfaceID) external view returns (bool); } +/// @dev inlined interface +interface ERC721TokenEvent { + event TokenChanged(address indexed collectionId, uint256 tokenId); +} + /// @title A contract that allows to set and delete token properties and change token property permissions. /// @dev the ERC-165 identifier for this interface is 0xde0695c2 -interface TokenProperties is Dummy, ERC165 { +interface TokenProperties is Dummy, ERC165, ERC721TokenEvent { // /// @notice Set permissions for token property. // /// @dev Throws error if `msg.sender` is not admin or owner of the collection. // /// @param key Property key. --- a/tests/src/eth/events.test.ts +++ b/tests/src/eth/events.test.ts @@ -29,8 +29,10 @@ }); }); -function clearEvents(ethEvents: NormalizedEvent[], subEvents: IEvent[]) { - ethEvents.splice(0); +function clearEvents(ethEvents: NormalizedEvent[] | null, subEvents: IEvent[]) { + if (ethEvents !== null) { + ethEvents.splice(0); + } subEvents.splice(0); } @@ -374,7 +376,6 @@ const owner = await helper.eth.createAccountWithBalance(donor); const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C'); const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner); - const collectionHelper = await helper.ethNativeContract.collectionHelpers(owner); const result = await collection.methods.mint(owner).send({from: owner}); const tokenId = result.events.Transfer.returnValues.tokenId; await collection.methods.setTokenPropertyPermissions([ @@ -384,38 +385,31 @@ [TokenPermissionField.CollectionAdmin, true]], ], ]).send({from: owner}); - - const ethEvents: any = []; - collectionHelper.events.allEvents((_: any, event: any) => { - ethEvents.push(event); - }); const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]); { - await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner}); + const result = await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner}); await helper.wait.newBlocks(1); - expect(ethEvents).to.containSubset([ - { - event: 'TokenChanged', - returnValues: { - collectionId: collectionAddress, - }, + expect(result.events.TokenChanged).to.be.like({ + event: 'TokenChanged', + returnValues: { + collectionId: collectionAddress, + tokenId: tokenId, }, - ]); + }); expect(subEvents).to.containSubset([{method: 'TokenPropertySet'}]); - clearEvents(ethEvents, subEvents); + clearEvents(null, subEvents); } { - await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner}); + const result = await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner}); await helper.wait.newBlocks(1); - expect(ethEvents).to.containSubset([ - { - event: 'TokenChanged', - returnValues: { - collectionId: collectionAddress, - }, + expect(result.events.TokenChanged).to.be.like({ + event: 'TokenChanged', + returnValues: { + collectionId: collectionAddress, + tokenId: tokenId, }, - ]); + }); expect(subEvents).to.containSubset([{method: 'TokenPropertyDeleted'}]); } unsubscribe(); -- gitstuff