From 3903c8aaf16ea6cd9af6ddc1e943652c8f8e201f Mon Sep 17 00:00:00 2001 From: Trubnikov Sergey Date: Tue, 07 Jun 2022 12:07:31 +0000 Subject: [PATCH] CORE-386 Add admin tests --- --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -330,57 +330,7 @@ } } -// Selector: d74d154f -contract ERC721UniqueExtensions is Dummy, ERC165 { - // Selector: transfer(address,uint256) a9059cbb - function transfer(address to, uint256 tokenId) public { - require(false, stub_error); - to; - tokenId; - dummy = 0; - } - - // Selector: burnFrom(address,uint256) 79cc6790 - function burnFrom(address from, uint256 tokenId) public { - require(false, stub_error); - from; - tokenId; - dummy = 0; - } - - // Selector: nextTokenId() 75794a3c - function nextTokenId() public view returns (uint256) { - require(false, stub_error); - dummy; - return 0; - } - - // Selector: mintBulk(address,uint256[]) 44a9945e - function mintBulk(address to, uint256[] memory tokenIds) - public - returns (bool) - { - require(false, stub_error); - to; - tokenIds; - dummy = 0; - return false; - } - - // Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006 - function mintBulkWithTokenURI(address to, Tuple0[] memory tokens) - public - returns (bool) - { - require(false, stub_error); - to; - tokens; - dummy = 0; - return false; - } -} - -// Selector: f56cd7fa +// Selector: 7d9262e6 contract Collection is Dummy, ERC165 { // Selector: setCollectionProperty(string,bytes) 2f073f66 function setCollectionProperty(string memory key, bytes memory value) @@ -449,8 +399,22 @@ return 0x0000000000000000000000000000000000000000; } - // Selector: addAdmin(address) 70480275 - function addAdmin(address newAdmin) public view { + // Selector: addCollectionAdminSubstrate(uint256) 5730062b + function addCollectionAdminSubstrate(uint256 newAdmin) public view { + require(false, stub_error); + newAdmin; + dummy; + } + + // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 + function removeCollectionAdminSubstrate(uint256 newAdmin) public view { + require(false, stub_error); + newAdmin; + dummy; + } + + // Selector: addCollectionAdmin(address) 92e462c7 + function addCollectionAdmin(address newAdmin) public view { require(false, stub_error); newAdmin; dummy; @@ -507,6 +471,56 @@ } } +// Selector: d74d154f +contract ERC721UniqueExtensions is Dummy, ERC165 { + // Selector: transfer(address,uint256) a9059cbb + function transfer(address to, uint256 tokenId) public { + require(false, stub_error); + to; + tokenId; + dummy = 0; + } + + // Selector: burnFrom(address,uint256) 79cc6790 + function burnFrom(address from, uint256 tokenId) public { + require(false, stub_error); + from; + tokenId; + dummy = 0; + } + + // Selector: nextTokenId() 75794a3c + function nextTokenId() public view returns (uint256) { + require(false, stub_error); + dummy; + return 0; + } + + // Selector: mintBulk(address,uint256[]) 44a9945e + function mintBulk(address to, uint256[] memory tokenIds) + public + returns (bool) + { + require(false, stub_error); + to; + tokenIds; + dummy = 0; + return false; + } + + // Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006 + function mintBulkWithTokenURI(address to, Tuple0[] memory tokens) + public + returns (bool) + { + require(false, stub_error); + to; + tokens; + dummy = 0; + return false; + } +} + contract UniqueNFT is Dummy, ERC165, --- a/tests/src/eth/api/UniqueNFT.sol +++ b/tests/src/eth/api/UniqueNFT.sol @@ -191,6 +191,70 @@ function totalSupply() external view returns (uint256); } +// Selector: 7d9262e6 +interface Collection is Dummy, ERC165 { + // Selector: setCollectionProperty(string,bytes) 2f073f66 + function setCollectionProperty(string memory key, bytes memory value) + external; + + // Selector: deleteCollectionProperty(string) 7b7debce + function deleteCollectionProperty(string memory key) external; + + // Throws error if key not found + // + // Selector: collectionProperty(string) cf24fd6d + function collectionProperty(string memory key) + external + view + returns (bytes memory); + + // Selector: setCollectionSponsor(address) 7623402e + function setCollectionSponsor(address sponsor) external; + + // Selector: confirmCollectionSponsorship() 3c50e97a + function confirmCollectionSponsorship() external; + + // Selector: setCollectionLimit(string,uint32) 6a3841db + function setCollectionLimit(string memory limit, uint32 value) external; + + // Selector: setCollectionLimit(string,bool) 993b7fba + function setCollectionLimit(string memory limit, bool value) external; + + // Selector: contractAddress() f6b4dfb4 + function contractAddress() external view returns (address); + + // Selector: addCollectionAdminSubstrate(uint256) 5730062b + function addCollectionAdminSubstrate(uint256 newAdmin) external view; + + // Selector: removeCollectionAdminSubstrate(uint256) 4048fcf9 + function removeCollectionAdminSubstrate(uint256 newAdmin) external view; + + // Selector: addCollectionAdmin(address) 92e462c7 + function addCollectionAdmin(address newAdmin) external view; + + // Selector: removeCollectionAdmin(address) fafd7b42 + function removeCollectionAdmin(address admin) external view; + + // Selector: setCollectionNesting(bool) 112d4586 + function setCollectionNesting(bool enable) external; + + // Selector: setCollectionNesting(bool,address[]) 64872396 + function setCollectionNesting(bool enable, address[] memory collections) + external; + + // Selector: setCollectionAccess(uint8) 41835d4c + function setCollectionAccess(uint8 mode) external; + + // Selector: addToCollectionAllowList(address) 67844fe6 + function addToCollectionAllowList(address user) external view; + + // Selector: removeFromCollectionAllowList(address) 85c51acb + function removeFromCollectionAllowList(address user) external view; + + // Selector: setCollectionMintMode(bool) 00018e84 + function setCollectionMintMode(bool mode) external; +} + // Selector: d74d154f interface ERC721UniqueExtensions is Dummy, ERC165 { // Selector: transfer(address,uint256) a9059cbb --- /dev/null +++ b/tests/src/eth/collectionAdmin.test.ts @@ -0,0 +1,88 @@ +// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. +// This file is part of Unique Network. + +import {expect} from 'chai'; +import privateKey from '../substrate/privateKey'; +import { + createEthAccount, + createEthAccountWithBalance, + evmCollection, + evmCollectionHelpers, + getCollectionAddressFromResult, + itWeb3, +} from './util/helpers'; + +// 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 . + +describe.only('Add collection admins', () => { + itWeb3('Add admin by owner', async ({api, web3}) => { + const owner = await createEthAccountWithBalance(api, web3); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const newAdmin = await createEthAccount(web3); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdmin(newAdmin).send(); + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(newAdmin.toLocaleLowerCase()); + }); + + itWeb3('Add substrate admin by owner', async ({api, web3}) => { + const owner = await createEthAccountWithBalance(api, web3); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const newAdmin = privateKey('//Alice'); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send(); + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asSubstrate.toString().toLocaleLowerCase()) + .to.be.eq(newAdmin.address.toLocaleLowerCase()); + }); + + itWeb3('(!negative tests!) Add admin by admin is not allowed', async ({api, web3}) => { + const owner = await createEthAccountWithBalance(api, web3); + const collectionHelper = evmCollectionHelpers(web3, owner); + + const result = await collectionHelper.methods + .createNonfungibleCollection('A', 'B', 'C') + .send(); + const {collectionIdAddress, collectionId} = await getCollectionAddressFromResult(api, result); + + const admin = await createEthAccountWithBalance(api, web3); + const collectionEvm = evmCollection(web3, owner, collectionIdAddress); + await collectionEvm.methods.addCollectionAdmin(admin).send(); + { + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(admin.toLocaleLowerCase()); + } + + const user = await createEthAccount(web3); + await collectionEvm.methods.addCollectionAdmin(user).send({from: admin}); + const adminList = await api.rpc.unique.adminlist(collectionId); + expect(adminList[0].asEthereum.toString().toLocaleLowerCase()) + .to.be.eq(admin.toLocaleLowerCase()); + expect(adminList.length).to.be.eq(1); + }); +}); \ No newline at end of file --- a/tests/src/eth/nonFungibleAbi.json +++ b/tests/src/eth/nonFungibleAbi.json @@ -91,6 +91,15 @@ }, { "inputs": [ + { "internalType": "uint256", "name": "newAdmin", "type": "uint256" } + ], + "name": "addCollectionAdminSubstrate", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "addToAllowList", @@ -300,6 +309,15 @@ }, { "inputs": [ + { "internalType": "uint256", "name": "newAdmin", "type": "uint256" } + ], + "name": "removeCollectionAdminSubstrate", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "removeFromAllowList", -- gitstuff