difftreelog
fix use newBlocks from playgrounds
in: master
1 file changed
tests/src/eth/collectionAdmin.test.tsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.3// Unique Network is free software: you can redistribute it and/or modify4// it under the terms of the GNU General Public License as published by5// the Free Software Foundation, either version 3 of the License, or6// (at your option) any later version.7//8// Unique Network is distributed in the hope that it will be useful,9// but WITHOUT ANY WARRANTY; without even the implied warranty of10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11// GNU General Public License for more details.1213// You should have received a copy of the GNU General Public License14// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1516import {IKeyringPair} from '@polkadot/types/types';17import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds';1819async function waitNewBlocks(helper: EthUniqueHelper, count: number) {20 // eslint-disable-next-line no-async-promise-executor21 return new Promise<void>(async (resolve) => {22 const unsubscribe = await helper.callRpc('api.rpc.chain.subscribeNewHeads', [() => {23 if (count > 0) {24 count--;25 } else {26 unsubscribe();27 resolve();28 }29 }]);30 });31}3233async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise<any>) {34 const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));35 await call();36 waitNewBlocks(helper, 1);37 const after = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));3839 expect(after < before).to.be.true;4041 return before - after;42}4344describe('Add collection admins', () => {45 let donor: IKeyringPair;4647 before(async function() {48 await usingEthPlaygrounds(async (_helper, privateKey) => {49 donor = privateKey('//Alice');50 });51 });5253 itEth('Add admin by owner', async ({helper}) => {54 const owner = await helper.eth.createAccountWithBalance(donor);55 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');56 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);5758 const newAdmin = helper.eth.createAccount();5960 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();61 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);62 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())63 .to.be.eq(newAdmin.toLocaleLowerCase());64 });6566 itEth.skip('Add substrate admin by owner', async ({helper}) => {67 const owner = await helper.eth.createAccountWithBalance(donor);68 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');69 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);7071 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);72 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();7374 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);75 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())76 .to.be.eq(newAdmin.address.toLocaleLowerCase());77 });7879 itEth('Verify owner or admin', async ({helper}) => {80 const owner = await helper.eth.createAccountWithBalance(donor);81 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');8283 const newAdmin = helper.eth.createAccount();84 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);85 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.false;86 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();87 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.true;88 });8990 itEth('(!negative tests!) Add admin by ADMIN is not allowed', async ({helper}) => {91 const owner = await helper.eth.createAccountWithBalance(donor);92 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');9394 const admin = await helper.eth.createAccountWithBalance(donor);95 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);96 await collectionEvm.methods.addCollectionAdmin(admin).send();9798 const user = helper.eth.createAccount();99 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: admin}))100 .to.be.rejectedWith('NoPermission');101102 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);103 expect(adminList.length).to.be.eq(1);104 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())105 .to.be.eq(admin.toLocaleLowerCase());106 });107108 itEth('(!negative tests!) Add admin by USER is not allowed', async ({helper}) => {109 const owner = await helper.eth.createAccountWithBalance(donor);110 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');111112 const notAdmin = await helper.eth.createAccountWithBalance(donor);113 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);114115 const user = helper.eth.createAccount();116 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: notAdmin}))117 .to.be.rejectedWith('NoPermission');118119 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);120 expect(adminList.length).to.be.eq(0);121 });122123 itEth.skip('(!negative tests!) Add substrate admin by ADMIN is not allowed', async ({helper}) => {124 const owner = await helper.eth.createAccountWithBalance(donor);125 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');126127 const admin = await helper.eth.createAccountWithBalance(donor);128 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);129 await collectionEvm.methods.addCollectionAdmin(admin).send();130131 const [notAdmin] = await helper.arrange.createAccounts([10n], donor);132 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin.addressRaw).call({from: admin}))133 .to.be.rejectedWith('NoPermission');134135 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);136 expect(adminList.length).to.be.eq(1);137 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())138 .to.be.eq(admin.toLocaleLowerCase());139 });140141 itEth.skip('(!negative tests!) Add substrate admin by USER is not allowed', async ({helper}) => {142 const owner = await helper.eth.createAccountWithBalance(donor);143 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');144145 const notAdmin0 = await helper.eth.createAccountWithBalance(donor);146 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);147 const [notAdmin1] = await helper.arrange.createAccounts([10n], donor);148 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin1.addressRaw).call({from: notAdmin0}))149 .to.be.rejectedWith('NoPermission');150151 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);152 expect(adminList.length).to.be.eq(0);153 });154});155156describe('Remove collection admins', () => {157 let donor: IKeyringPair;158159 before(async function() {160 await usingEthPlaygrounds(async (_helper, privateKey) => {161 donor = privateKey('//Alice');162 });163 });164165 itEth('Remove admin by owner', async ({helper}) => {166 const owner = await helper.eth.createAccountWithBalance(donor);167 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');168169 const newAdmin = helper.eth.createAccount();170 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);171 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();172173 {174 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);175 expect(adminList.length).to.be.eq(1);176 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())177 .to.be.eq(newAdmin.toLocaleLowerCase());178 }179180 await collectionEvm.methods.removeCollectionAdmin(newAdmin).send();181 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);182 expect(adminList.length).to.be.eq(0);183 });184185 itEth.skip('Remove substrate admin by owner', async ({helper}) => {186 const owner = await helper.eth.createAccountWithBalance(donor);187 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');188189 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);190 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);191 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();192 {193 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);194 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())195 .to.be.eq(newAdmin.address.toLocaleLowerCase());196 }197198 await collectionEvm.methods.removeCollectionAdminSubstrate(newAdmin.addressRaw).send();199 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);200 expect(adminList.length).to.be.eq(0);201 });202203 itEth('(!negative tests!) Remove admin by ADMIN is not allowed', async ({helper}) => {204 const owner = await helper.eth.createAccountWithBalance(donor);205 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');206207 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);208209 const admin0 = await helper.eth.createAccountWithBalance(donor);210 await collectionEvm.methods.addCollectionAdmin(admin0).send();211 const admin1 = await helper.eth.createAccountWithBalance(donor);212 await collectionEvm.methods.addCollectionAdmin(admin1).send();213214 await expect(collectionEvm.methods.removeCollectionAdmin(admin1).call({from: admin0}))215 .to.be.rejectedWith('NoPermission');216 {217 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);218 expect(adminList.length).to.be.eq(2);219 expect(adminList.toString().toLocaleLowerCase())220 .to.be.deep.contains(admin0.toLocaleLowerCase())221 .to.be.deep.contains(admin1.toLocaleLowerCase());222 }223 });224225 itEth('(!negative tests!) Remove admin by USER is not allowed', async ({helper}) => {226 const owner = await helper.eth.createAccountWithBalance(donor);227 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');228229 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);230231 const admin = await helper.eth.createAccountWithBalance(donor);232 await collectionEvm.methods.addCollectionAdmin(admin).send();233 const notAdmin = helper.eth.createAccount();234235 await expect(collectionEvm.methods.removeCollectionAdmin(admin).call({from: notAdmin}))236 .to.be.rejectedWith('NoPermission');237 {238 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);239 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())240 .to.be.eq(admin.toLocaleLowerCase());241 expect(adminList.length).to.be.eq(1);242 }243 });244245 itEth.skip('(!negative tests!) Remove substrate admin by ADMIN is not allowed', async ({helper}) => {246 const owner = await helper.eth.createAccountWithBalance(donor);247 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');248249 const [adminSub] = await helper.arrange.createAccounts([10n], donor);250 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);251 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();252 const adminEth = await helper.eth.createAccountWithBalance(donor);253 await collectionEvm.methods.addCollectionAdmin(adminEth).send();254255 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: adminEth}))256 .to.be.rejectedWith('NoPermission');257258 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);259 expect(adminList.length).to.be.eq(2);260 expect(adminList.toString().toLocaleLowerCase())261 .to.be.deep.contains(adminSub.address.toLocaleLowerCase())262 .to.be.deep.contains(adminEth.toLocaleLowerCase());263 });264265 itEth.skip('(!negative tests!) Remove substrate admin by USER is not allowed', async ({helper}) => {266 const owner = await helper.eth.createAccountWithBalance(donor);267 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');268269 const [adminSub] = await helper.arrange.createAccounts([10n], donor);270 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);271 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();272 const notAdminEth = await helper.eth.createAccountWithBalance(donor);273274 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: notAdminEth}))275 .to.be.rejectedWith('NoPermission');276277 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);278 expect(adminList.length).to.be.eq(1);279 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())280 .to.be.eq(adminSub.address.toLocaleLowerCase());281 });282});283284describe('Change owner tests', () => {285 let donor: IKeyringPair;286287 before(async function() {288 await usingEthPlaygrounds(async (_helper, privateKey) => {289 donor = privateKey('//Alice');290 });291 });292293 itEth('Change owner', async ({helper}) => {294 const owner = await helper.eth.createAccountWithBalance(donor);295 const newOwner = await helper.eth.createAccountWithBalance(donor);296 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');297 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);298299 await collectionEvm.methods.setOwner(newOwner).send();300301 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;302 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.true;303 });304305 itEth('change owner call fee', async ({helper}) => {306 const owner = await helper.eth.createAccountWithBalance(donor);307 const newOwner = await helper.eth.createAccountWithBalance(donor);308 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');309 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);310 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.setOwner(newOwner).send());311 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));312 expect(cost > 0);313 });314315 itEth('(!negative tests!) call setOwner by non owner', async ({helper}) => {316 const owner = await helper.eth.createAccountWithBalance(donor);317 const newOwner = await helper.eth.createAccountWithBalance(donor);318 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');319 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);320321 await expect(collectionEvm.methods.setOwner(newOwner).send({from: newOwner})).to.be.rejected;322 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.false;323 });324});325326describe('Change substrate owner tests', () => {327 let donor: IKeyringPair;328329 before(async function() {330 await usingEthPlaygrounds(async (_helper, privateKey) => {331 donor = privateKey('//Alice');332 });333 });334335 itEth.skip('Change owner', async ({helper}) => {336 const owner = await helper.eth.createAccountWithBalance(donor);337 const [newOwner] = await helper.arrange.createAccounts([10n], donor);338 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');339 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);340341 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.true;342 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;343344 await collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send();345346 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;347 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.true;348 });349350 itEth.skip('change owner call fee', async ({helper}) => {351 const owner = await helper.eth.createAccountWithBalance(donor);352 const [newOwner] = await helper.arrange.createAccounts([10n], donor);353 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');354 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);355356 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send());357 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));358 expect(cost > 0);359 });360361 itEth.skip('(!negative tests!) call setOwner by non owner', async ({helper}) => {362 const owner = await helper.eth.createAccountWithBalance(donor);363 const otherReceiver = await helper.eth.createAccountWithBalance(donor);364 const [newOwner] = await helper.arrange.createAccounts([10n], donor);365 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');366 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);367368 await expect(collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send({from: otherReceiver})).to.be.rejected;369 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;370 });371});1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.3// Unique Network is free software: you can redistribute it and/or modify4// it under the terms of the GNU General Public License as published by5// the Free Software Foundation, either version 3 of the License, or6// (at your option) any later version.7//8// Unique Network is distributed in the hope that it will be useful,9// but WITHOUT ANY WARRANTY; without even the implied warranty of10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11// GNU General Public License for more details.1213// You should have received a copy of the GNU General Public License14// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1516import {IKeyringPair} from '@polkadot/types/types';17import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds';1819async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise<any>) {20 const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));21 await call();22 await helper.wait.newBlocks(1);23 const after = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));2425 expect(after < before).to.be.true;2627 return before - after;28}2930describe('Add collection admins', () => {31 let donor: IKeyringPair;3233 before(async function() {34 await usingEthPlaygrounds(async (_helper, privateKey) => {35 donor = privateKey('//Alice');36 });37 });3839 itEth('Add admin by owner', async ({helper}) => {40 const owner = await helper.eth.createAccountWithBalance(donor);41 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');42 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);4344 const newAdmin = helper.eth.createAccount();4546 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();47 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);48 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())49 .to.be.eq(newAdmin.toLocaleLowerCase());50 });5152 itEth.skip('Add substrate admin by owner', async ({helper}) => {53 const owner = await helper.eth.createAccountWithBalance(donor);54 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');55 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);5657 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);58 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();5960 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);61 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())62 .to.be.eq(newAdmin.address.toLocaleLowerCase());63 });6465 itEth('Verify owner or admin', async ({helper}) => {66 const owner = await helper.eth.createAccountWithBalance(donor);67 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');6869 const newAdmin = helper.eth.createAccount();70 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);71 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.false;72 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();73 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.true;74 });7576 itEth('(!negative tests!) Add admin by ADMIN is not allowed', async ({helper}) => {77 const owner = await helper.eth.createAccountWithBalance(donor);78 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');7980 const admin = await helper.eth.createAccountWithBalance(donor);81 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);82 await collectionEvm.methods.addCollectionAdmin(admin).send();8384 const user = helper.eth.createAccount();85 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: admin}))86 .to.be.rejectedWith('NoPermission');8788 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);89 expect(adminList.length).to.be.eq(1);90 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())91 .to.be.eq(admin.toLocaleLowerCase());92 });9394 itEth('(!negative tests!) Add admin by USER is not allowed', async ({helper}) => {95 const owner = await helper.eth.createAccountWithBalance(donor);96 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');9798 const notAdmin = await helper.eth.createAccountWithBalance(donor);99 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);100101 const user = helper.eth.createAccount();102 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: notAdmin}))103 .to.be.rejectedWith('NoPermission');104105 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);106 expect(adminList.length).to.be.eq(0);107 });108109 itEth.skip('(!negative tests!) Add substrate admin by ADMIN is not allowed', async ({helper}) => {110 const owner = await helper.eth.createAccountWithBalance(donor);111 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');112113 const admin = await helper.eth.createAccountWithBalance(donor);114 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);115 await collectionEvm.methods.addCollectionAdmin(admin).send();116117 const [notAdmin] = await helper.arrange.createAccounts([10n], donor);118 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin.addressRaw).call({from: admin}))119 .to.be.rejectedWith('NoPermission');120121 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);122 expect(adminList.length).to.be.eq(1);123 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())124 .to.be.eq(admin.toLocaleLowerCase());125 });126127 itEth.skip('(!negative tests!) Add substrate admin by USER is not allowed', async ({helper}) => {128 const owner = await helper.eth.createAccountWithBalance(donor);129 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');130131 const notAdmin0 = await helper.eth.createAccountWithBalance(donor);132 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);133 const [notAdmin1] = await helper.arrange.createAccounts([10n], donor);134 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin1.addressRaw).call({from: notAdmin0}))135 .to.be.rejectedWith('NoPermission');136137 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);138 expect(adminList.length).to.be.eq(0);139 });140});141142describe('Remove collection admins', () => {143 let donor: IKeyringPair;144145 before(async function() {146 await usingEthPlaygrounds(async (_helper, privateKey) => {147 donor = privateKey('//Alice');148 });149 });150151 itEth('Remove admin by owner', async ({helper}) => {152 const owner = await helper.eth.createAccountWithBalance(donor);153 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');154155 const newAdmin = helper.eth.createAccount();156 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);157 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();158159 {160 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);161 expect(adminList.length).to.be.eq(1);162 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())163 .to.be.eq(newAdmin.toLocaleLowerCase());164 }165166 await collectionEvm.methods.removeCollectionAdmin(newAdmin).send();167 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);168 expect(adminList.length).to.be.eq(0);169 });170171 itEth.skip('Remove substrate admin by owner', async ({helper}) => {172 const owner = await helper.eth.createAccountWithBalance(donor);173 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');174175 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);176 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);177 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();178 {179 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);180 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())181 .to.be.eq(newAdmin.address.toLocaleLowerCase());182 }183184 await collectionEvm.methods.removeCollectionAdminSubstrate(newAdmin.addressRaw).send();185 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);186 expect(adminList.length).to.be.eq(0);187 });188189 itEth('(!negative tests!) Remove admin by ADMIN is not allowed', async ({helper}) => {190 const owner = await helper.eth.createAccountWithBalance(donor);191 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');192193 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);194195 const admin0 = await helper.eth.createAccountWithBalance(donor);196 await collectionEvm.methods.addCollectionAdmin(admin0).send();197 const admin1 = await helper.eth.createAccountWithBalance(donor);198 await collectionEvm.methods.addCollectionAdmin(admin1).send();199200 await expect(collectionEvm.methods.removeCollectionAdmin(admin1).call({from: admin0}))201 .to.be.rejectedWith('NoPermission');202 {203 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);204 expect(adminList.length).to.be.eq(2);205 expect(adminList.toString().toLocaleLowerCase())206 .to.be.deep.contains(admin0.toLocaleLowerCase())207 .to.be.deep.contains(admin1.toLocaleLowerCase());208 }209 });210211 itEth('(!negative tests!) Remove admin by USER is not allowed', async ({helper}) => {212 const owner = await helper.eth.createAccountWithBalance(donor);213 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');214215 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);216217 const admin = await helper.eth.createAccountWithBalance(donor);218 await collectionEvm.methods.addCollectionAdmin(admin).send();219 const notAdmin = helper.eth.createAccount();220221 await expect(collectionEvm.methods.removeCollectionAdmin(admin).call({from: notAdmin}))222 .to.be.rejectedWith('NoPermission');223 {224 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);225 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())226 .to.be.eq(admin.toLocaleLowerCase());227 expect(adminList.length).to.be.eq(1);228 }229 });230231 itEth.skip('(!negative tests!) Remove substrate admin by ADMIN is not allowed', async ({helper}) => {232 const owner = await helper.eth.createAccountWithBalance(donor);233 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');234235 const [adminSub] = await helper.arrange.createAccounts([10n], donor);236 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);237 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();238 const adminEth = await helper.eth.createAccountWithBalance(donor);239 await collectionEvm.methods.addCollectionAdmin(adminEth).send();240241 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: adminEth}))242 .to.be.rejectedWith('NoPermission');243244 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);245 expect(adminList.length).to.be.eq(2);246 expect(adminList.toString().toLocaleLowerCase())247 .to.be.deep.contains(adminSub.address.toLocaleLowerCase())248 .to.be.deep.contains(adminEth.toLocaleLowerCase());249 });250251 itEth.skip('(!negative tests!) Remove substrate admin by USER is not allowed', async ({helper}) => {252 const owner = await helper.eth.createAccountWithBalance(donor);253 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');254255 const [adminSub] = await helper.arrange.createAccounts([10n], donor);256 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);257 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();258 const notAdminEth = await helper.eth.createAccountWithBalance(donor);259260 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: notAdminEth}))261 .to.be.rejectedWith('NoPermission');262263 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);264 expect(adminList.length).to.be.eq(1);265 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())266 .to.be.eq(adminSub.address.toLocaleLowerCase());267 });268});269270describe('Change owner tests', () => {271 let donor: IKeyringPair;272273 before(async function() {274 await usingEthPlaygrounds(async (_helper, privateKey) => {275 donor = privateKey('//Alice');276 });277 });278279 itEth('Change owner', async ({helper}) => {280 const owner = await helper.eth.createAccountWithBalance(donor);281 const newOwner = await helper.eth.createAccountWithBalance(donor);282 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');283 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);284285 await collectionEvm.methods.setOwner(newOwner).send();286287 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;288 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.true;289 });290291 itEth('change owner call fee', async ({helper}) => {292 const owner = await helper.eth.createAccountWithBalance(donor);293 const newOwner = await helper.eth.createAccountWithBalance(donor);294 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');295 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);296 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.setOwner(newOwner).send());297 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));298 expect(cost > 0);299 });300301 itEth('(!negative tests!) call setOwner by non owner', async ({helper}) => {302 const owner = await helper.eth.createAccountWithBalance(donor);303 const newOwner = await helper.eth.createAccountWithBalance(donor);304 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');305 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);306307 await expect(collectionEvm.methods.setOwner(newOwner).send({from: newOwner})).to.be.rejected;308 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.false;309 });310});311312describe('Change substrate owner tests', () => {313 let donor: IKeyringPair;314315 before(async function() {316 await usingEthPlaygrounds(async (_helper, privateKey) => {317 donor = privateKey('//Alice');318 });319 });320321 itEth.skip('Change owner', async ({helper}) => {322 const owner = await helper.eth.createAccountWithBalance(donor);323 const [newOwner] = await helper.arrange.createAccounts([10n], donor);324 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');325 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);326327 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.true;328 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;329330 await collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send();331332 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;333 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.true;334 });335336 itEth.skip('change owner call fee', async ({helper}) => {337 const owner = await helper.eth.createAccountWithBalance(donor);338 const [newOwner] = await helper.arrange.createAccounts([10n], donor);339 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');340 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);341342 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send());343 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));344 expect(cost > 0);345 });346347 itEth.skip('(!negative tests!) call setOwner by non owner', async ({helper}) => {348 const owner = await helper.eth.createAccountWithBalance(donor);349 const otherReceiver = await helper.eth.createAccountWithBalance(donor);350 const [newOwner] = await helper.arrange.createAccounts([10n], donor);351 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');352 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);353354 await expect(collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send({from: otherReceiver})).to.be.rejected;355 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;356 });357});