difftreelog
fix eth tests
in: master
5 files changed
tests/src/eth/base.test.tsdiffbeforeafterboth--- a/tests/src/eth/base.test.ts
+++ b/tests/src/eth/base.test.ts
@@ -23,7 +23,6 @@
import {IKeyringPair} from '@polkadot/types/types';
import {EthUniqueHelper, itEth, usingEthPlaygrounds, expect} from './util/playgrounds';
-import {UNIQUE} from '../util/helpers';
describe('Contract calls', () => {
let donor: IKeyringPair;
@@ -39,7 +38,7 @@
const flipper = await helper.eth.deployFlipper(deployer);
const cost = await recordEthFee(helper.api!, deployer, () => flipper.methods.flip().send({from: deployer}));
- expect(cost < BigInt(0.2 * Number(UNIQUE))).to.be.true;
+ expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal()))).to.be.true;
});
itEth('Balance transfer fee is less than 0.2 UNQ', async ({helper}) => {
@@ -47,7 +46,7 @@
const userB = helper.eth.createAccount();
const cost = await recordEthFee(helper.api!, userA, () => helper.web3!.eth.sendTransaction({from: userA, to: userB, value: '1000000', ...GAS_ARGS}));
const balanceB = await ethBalanceViaSub(helper.api!, userB);
- expect(cost - balanceB < BigInt(0.2 * Number(UNIQUE))).to.be.true;
+ expect(cost - balanceB < BigInt(0.2 * Number(helper.balance.getOneTokenNominal()))).to.be.true;
});
itEth('NFT transfer is close to 0.15 UNQ', async ({helper}) => {
@@ -63,7 +62,7 @@
const cost = await recordEthFee(helper.api!, caller, () => contract.methods.transfer(receiver, tokenId).send(caller));
- const fee = Number(cost) / Number(UNIQUE);
+ const fee = Number(cost) / Number(helper.balance.getOneTokenNominal());
const expectedFee = 0.15;
const tolerance = 0.001;
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 {UNIQUE} from '../util/helpers';18import {19 recordEthFee,20} from './util/helpers';21import {usingEthPlaygrounds, itEth, expect} from './util/playgrounds';2223describe('Add collection admins', () => {24 let donor: IKeyringPair;2526 before(async function() {27 await usingEthPlaygrounds(async (_helper, privateKey) => {28 donor = privateKey('//Alice');29 });30 });3132 itEth('Add admin by owner', async ({helper}) => {33 const owner = await helper.eth.createAccountWithBalance(donor);34 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');35 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);3637 const newAdmin = helper.eth.createAccount();3839 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();40 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);41 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())42 .to.be.eq(newAdmin.toLocaleLowerCase());43 });4445 itEth.skip('Add substrate admin by owner', async ({helper}) => {46 const owner = await helper.eth.createAccountWithBalance(donor);47 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');48 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);4950 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);51 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();5253 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);54 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())55 .to.be.eq(newAdmin.address.toLocaleLowerCase());56 });5758 //FIXME:59 itEth('Verify owner or admin', async ({helper}) => {60 const owner = await helper.eth.createAccountWithBalance(donor);61 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');6263 const newAdmin = helper.eth.createAccount();64 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);65 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.false;66 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();67 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.true;68 });6970 itEth('(!negative tests!) Add admin by ADMIN is not allowed', async ({helper}) => {71 const owner = await helper.eth.createAccountWithBalance(donor);72 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');7374 const admin = await helper.eth.createAccountWithBalance(donor);75 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);76 await collectionEvm.methods.addCollectionAdmin(admin).send();7778 const user = helper.eth.createAccount();79 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: admin}))80 .to.be.rejectedWith('NoPermission');8182 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);83 expect(adminList.length).to.be.eq(1);84 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())85 .to.be.eq(admin.toLocaleLowerCase());86 });8788 itEth('(!negative tests!) Add admin by USER is not allowed', async ({helper}) => {89 const owner = await helper.eth.createAccountWithBalance(donor);90 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');9192 const notAdmin = await helper.eth.createAccountWithBalance(donor);93 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);9495 const user = helper.eth.createAccount();96 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: notAdmin}))97 .to.be.rejectedWith('NoPermission');9899 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);100 expect(adminList.length).to.be.eq(0);101 });102103 itEth.skip('(!negative tests!) Add substrate admin by ADMIN is not allowed', async ({helper}) => {104 const owner = await helper.eth.createAccountWithBalance(donor);105 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');106107 const admin = await helper.eth.createAccountWithBalance(donor);108 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);109 await collectionEvm.methods.addCollectionAdmin(admin).send();110111 const [notAdmin] = await helper.arrange.createAccounts([10n], donor);112 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin.addressRaw).call({from: admin}))113 .to.be.rejectedWith('NoPermission');114115 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);116 expect(adminList.length).to.be.eq(1);117 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())118 .to.be.eq(admin.toLocaleLowerCase());119 });120121 itEth.skip('(!negative tests!) Add substrate admin by USER is not allowed', async ({helper}) => {122 const owner = await helper.eth.createAccountWithBalance(donor);123 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');124125 const notAdmin0 = await helper.eth.createAccountWithBalance(donor);126 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);127 const [notAdmin1] = await helper.arrange.createAccounts([10n], donor);128 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin1.addressRaw).call({from: notAdmin0}))129 .to.be.rejectedWith('NoPermission');130131 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);132 expect(adminList.length).to.be.eq(0);133 });134});135136describe('Remove collection admins', () => {137 let donor: IKeyringPair;138139 before(async function() {140 await usingEthPlaygrounds(async (_helper, privateKey) => {141 donor = privateKey('//Alice');142 });143 });144145 itEth('Remove admin by owner', async ({helper}) => {146 const owner = await helper.eth.createAccountWithBalance(donor);147 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');148149 const newAdmin = helper.eth.createAccount();150 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);151 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();152153 {154 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);155 expect(adminList.length).to.be.eq(1);156 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())157 .to.be.eq(newAdmin.toLocaleLowerCase());158 }159160 await collectionEvm.methods.removeCollectionAdmin(newAdmin).send();161 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);162 expect(adminList.length).to.be.eq(0);163 });164165 itEth.skip('Remove substrate 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] = await helper.arrange.createAccounts([10n], donor);170 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);171 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();172 {173 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);174 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())175 .to.be.eq(newAdmin.address.toLocaleLowerCase());176 }177178 await collectionEvm.methods.removeCollectionAdminSubstrate(newAdmin.addressRaw).send();179 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);180 expect(adminList.length).to.be.eq(0);181 });182183 itEth('(!negative tests!) Remove admin by ADMIN is not allowed', async ({helper}) => {184 const owner = await helper.eth.createAccountWithBalance(donor);185 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');186187 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);188189 const admin0 = await helper.eth.createAccountWithBalance(donor);190 await collectionEvm.methods.addCollectionAdmin(admin0).send();191 const admin1 = await helper.eth.createAccountWithBalance(donor);192 await collectionEvm.methods.addCollectionAdmin(admin1).send();193194 await expect(collectionEvm.methods.removeCollectionAdmin(admin1).call({from: admin0}))195 .to.be.rejectedWith('NoPermission');196 {197 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);198 expect(adminList.length).to.be.eq(2);199 expect(adminList.toString().toLocaleLowerCase())200 .to.be.deep.contains(admin0.toLocaleLowerCase())201 .to.be.deep.contains(admin1.toLocaleLowerCase());202 }203 });204205 itEth('(!negative tests!) Remove admin by USER is not allowed', async ({helper}) => {206 const owner = await helper.eth.createAccountWithBalance(donor);207 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');208209 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);210211 const admin = await helper.eth.createAccountWithBalance(donor);212 await collectionEvm.methods.addCollectionAdmin(admin).send();213 const notAdmin = helper.eth.createAccount();214215 await expect(collectionEvm.methods.removeCollectionAdmin(admin).call({from: notAdmin}))216 .to.be.rejectedWith('NoPermission');217 {218 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);219 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())220 .to.be.eq(admin.toLocaleLowerCase());221 expect(adminList.length).to.be.eq(1);222 }223 });224225 itEth.skip('(!negative tests!) Remove substrate admin by ADMIN 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 [adminSub] = await helper.arrange.createAccounts([10n], donor);230 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);231 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();232 const adminEth = await helper.eth.createAccountWithBalance(donor);233 await collectionEvm.methods.addCollectionAdmin(adminEth).send();234235 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: adminEth}))236 .to.be.rejectedWith('NoPermission');237238 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);239 expect(adminList.length).to.be.eq(2);240 expect(adminList.toString().toLocaleLowerCase())241 .to.be.deep.contains(adminSub.address.toLocaleLowerCase())242 .to.be.deep.contains(adminEth.toLocaleLowerCase());243 });244245 itEth.skip('(!negative tests!) Remove substrate admin by USER 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 notAdminEth = await helper.eth.createAccountWithBalance(donor);253254 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: notAdminEth}))255 .to.be.rejectedWith('NoPermission');256257 const adminList = await helper.api!.rpc.unique.adminlist(collectionId);258 expect(adminList.length).to.be.eq(1);259 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())260 .to.be.eq(adminSub.address.toLocaleLowerCase());261 });262});263264describe('Change owner tests', () => {265 let donor: IKeyringPair;266267 before(async function() {268 await usingEthPlaygrounds(async (_helper, privateKey) => {269 donor = privateKey('//Alice');270 });271 });272273 itEth('Change owner', async ({helper}) => {274 const owner = await helper.eth.createAccountWithBalance(donor);275 const newOwner = await helper.eth.createAccountWithBalance(donor);276 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');277 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);278279 await collectionEvm.methods.setOwner(newOwner).send();280281 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;282 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.true;283 });284285 itEth('change owner call fee', async ({helper}) => {286 const owner = await helper.eth.createAccountWithBalance(donor);287 const newOwner = await helper.eth.createAccountWithBalance(donor);288 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');289 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);290291 const cost = await recordEthFee(helper.api!, owner, () => collectionEvm.methods.setOwner(newOwner).send());292 expect(cost < BigInt(0.2 * Number(UNIQUE)));293 expect(cost > 0);294 });295296 //FIXME297 itEth('(!negative tests!) call setOwner by non owner', async ({helper}) => {298 const owner = await helper.eth.createAccountWithBalance(donor);299 const newOwner = await helper.eth.createAccountWithBalance(donor);300 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');301 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);302303 await expect(collectionEvm.methods.setOwner(newOwner).send({from: newOwner})).to.be.rejected;304 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.false;305 });306});307308describe('Change substrate owner tests', () => {309 let donor: IKeyringPair;310311 before(async function() {312 await usingEthPlaygrounds(async (_helper, privateKey) => {313 donor = privateKey('//Alice');314 });315 });316317 //FIXME318 itEth.skip('Change owner', async ({helper}) => {319 const owner = await helper.eth.createAccountWithBalance(donor);320 const [newOwner] = await helper.arrange.createAccounts([10n], donor);321 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');322 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);323324 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.true;325 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;326327 await collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send();328329 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;330 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.true;331 });332333 itEth.skip('change owner call fee', async ({helper}) => {334 const owner = await helper.eth.createAccountWithBalance(donor);335 const [newOwner] = await helper.arrange.createAccounts([10n], donor);336 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');337 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);338339 const cost = await recordEthFee(helper.api!, owner, () => collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send());340 expect(cost < BigInt(0.2 * Number(UNIQUE)));341 expect(cost > 0);342 });343344 //FIXME345 itEth.skip('(!negative tests!) call setOwner by non owner', async ({helper}) => {346 const owner = await helper.eth.createAccountWithBalance(donor);347 const otherReceiver = await helper.eth.createAccountWithBalance(donor);348 const [newOwner] = await helper.arrange.createAccounts([10n], donor);349 const {collectionAddress} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');350 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);351352 await expect(collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send({from: otherReceiver})).to.be.rejected;353 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;354 });355});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 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});tests/src/eth/collectionProperties.test.tsdiffbeforeafterboth--- a/tests/src/eth/collectionProperties.test.ts
+++ b/tests/src/eth/collectionProperties.test.ts
@@ -51,6 +51,6 @@
const contract = helper.ethNativeContract.collection(address, 'nft', caller);
const value = await contract.methods.collectionProperty('testKey').call();
- expect(value).to.equal(helper.web3?.utils.toHex('testValue'));
+ expect(value).to.equal(helper.getWeb3().utils.toHex('testValue'));
});
});
tests/src/eth/proxy/fungibleProxy.test.tsdiffbeforeafterboth--- a/tests/src/eth/proxy/fungibleProxy.test.ts
+++ b/tests/src/eth/proxy/fungibleProxy.test.ts
@@ -23,7 +23,8 @@
async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) {
// Proxy owner has no special privilegies, we don't need to reuse them
const owner = await helper.eth.createAccountWithBalance(donor);
- const proxyContract = new helper.web3!.eth.Contract(JSON.parse((await readFile(`${__dirname}/UniqueFungibleProxy.abi`)).toString()), undefined, {
+ const web3 = helper.getWeb3();
+ const proxyContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/UniqueFungibleProxy.abi`)).toString()), undefined, {
from: owner,
...GAS_ARGS,
});
tests/src/eth/proxy/nonFungibleProxy.test.tsdiffbeforeafterboth--- a/tests/src/eth/proxy/nonFungibleProxy.test.ts
+++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts
@@ -23,7 +23,8 @@
async function proxyWrap(helper: EthUniqueHelper, wrapped: any, donor: IKeyringPair) {
// Proxy owner has no special privilegies, we don't need to reuse them
const owner = await helper.eth.createAccountWithBalance(donor);
- const proxyContract = new helper.web3!.eth.Contract(JSON.parse((await readFile(`${__dirname}/UniqueNFTProxy.abi`)).toString()), undefined, {
+ const web3 = helper.getWeb3();
+ const proxyContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/UniqueNFTProxy.abi`)).toString()), undefined, {
from: owner,
...GAS_ARGS,
});