difftreelog
refac: rename substrate methods to cross
in: master
16 files changed
pallets/common/src/erc.rsdiffbeforeafterboth--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -656,7 +656,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
fn collection_owner(&self) -> Result<(address, uint256)> {
Ok(convert_cross_account_to_tuple::<T>(
pallets/fungible/src/stubs/UniqueFungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/fungible/src/stubs/UniqueFungible.soldiffbeforeafterboth--- a/pallets/fungible/src/stubs/UniqueFungible.sol
+++ b/pallets/fungible/src/stubs/UniqueFungible.sol
@@ -385,7 +385,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
/// @dev EVM selector for this function is: 0xdf727d3b,
/// or in textual repr: collectionOwner()
pallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -471,7 +471,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
/// @dev EVM selector for this function is: 0xdf727d3b,
/// or in textual repr: collectionOwner()
pallets/refungible/src/stubs/UniqueRefungible.rawdiffbeforeafterbothbinary blob — no preview
pallets/refungible/src/stubs/UniqueRefungible.soldiffbeforeafterboth--- a/pallets/refungible/src/stubs/UniqueRefungible.sol
+++ b/pallets/refungible/src/stubs/UniqueRefungible.sol
@@ -471,7 +471,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
/// @dev EVM selector for this function is: 0xdf727d3b,
/// or in textual repr: collectionOwner()
tests/src/eth/allowlist.test.tsdiffbeforeafterboth--- a/tests/src/eth/allowlist.test.ts
+++ b/tests/src/eth/allowlist.test.ts
@@ -89,21 +89,21 @@
expect(await collectionEvm.methods.allowed(user).call({from: owner})).to.be.false;
});
- //itEth('Collection allowlist can be added and removed by [cross] address', async ({helper}) => {
- // const owner = await helper.eth.createAccountWithBalance(donor);
- // const user = donor;
- //
- // const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');
- // const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
- // const userCross = helper.ethCrossAccount.fromKeyringPair(user);
- //
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
- // await collectionEvm.methods.addToCollectionAllowListCross(userCross).send({from: owner});
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.true;
- //
- // await collectionEvm.methods.removeFromCollectionAllowListCross(userCross).send({from: owner});
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
- //});
+ itEth('Collection allowlist can be added and removed by [cross] address', async ({helper}) => {
+ const owner = await helper.eth.createAccountWithBalance(donor);
+ const user = donor;
+
+ const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');
+ const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
+ const userCross = helper.ethCrossAccount.fromKeyringPair(user);
+
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
+ await collectionEvm.methods.addToCollectionAllowListCross(userCross).send({from: owner});
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.true;
+
+ await collectionEvm.methods.removeFromCollectionAllowListCross(userCross).send({from: owner});
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
+ });
itEth('Collection allowlist can not be add and remove [eth] address by not owner', async ({helper}) => {
const owner = await helper.eth.createAccountWithBalance(donor);
@@ -122,22 +122,22 @@
expect(await collectionEvm.methods.allowed(user).call({from: owner})).to.be.true;
});
- //itEth('Collection allowlist can not be add and remove [cross] address by not owner', async ({helper}) => {
- // const owner = await helper.eth.createAccountWithBalance(donor);
- // const notOwner = await helper.eth.createAccountWithBalance(donor);
- // const user = donor;
- //
- // const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');
- // const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
- //
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
- // const userCross = helper.ethCrossAccount.fromKeyringPair(user);
- // await expect(collectionEvm.methods.addToCollectionAllowListCross(userCross).call({from: notOwner})).to.be.rejectedWith('NoPermission');
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
- // await collectionEvm.methods.addToCollectionAllowListCross(userCross).send({from: owner});
- //
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.true;
- // await expect(collectionEvm.methods.removeFromCollectionAllowListCross(userCross).call({from: notOwner})).to.be.rejectedWith('NoPermission');
- // expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.true;
- //});
+ itEth('Collection allowlist can not be add and remove [cross] address by not owner', async ({helper}) => {
+ const owner = await helper.eth.createAccountWithBalance(donor);
+ const notOwner = await helper.eth.createAccountWithBalance(donor);
+ const user = donor;
+
+ const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');
+ const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
+
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
+ const userCross = helper.ethCrossAccount.fromKeyringPair(user);
+ await expect(collectionEvm.methods.addToCollectionAllowListCross(userCross).call({from: notOwner})).to.be.rejectedWith('NoPermission');
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.false;
+ await collectionEvm.methods.addToCollectionAllowListCross(userCross).send({from: owner});
+
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.true;
+ await expect(collectionEvm.methods.removeFromCollectionAllowListCross(userCross).call({from: notOwner})).to.be.rejectedWith('NoPermission');
+ expect(await helper.collection.allowed(collectionId, {Substrate: user.address})).to.be.true;
+ });
});
tests/src/eth/api/UniqueFungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueFungible.sol
+++ b/tests/src/eth/api/UniqueFungible.sol
@@ -249,7 +249,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
/// @dev EVM selector for this function is: 0xdf727d3b,
/// or in textual repr: collectionOwner()
tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -306,7 +306,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
/// @dev EVM selector for this function is: 0xdf727d3b,
/// or in textual repr: collectionOwner()
tests/src/eth/api/UniqueRefungible.soldiffbeforeafterboth--- a/tests/src/eth/api/UniqueRefungible.sol
+++ b/tests/src/eth/api/UniqueRefungible.sol
@@ -306,7 +306,7 @@
/// Get collection owner.
///
- /// @return Tuple with sponsor address and his substrate mirror.
+ /// @return Tuble with sponsor address and his substrate mirror.
/// If address is canonical then substrate mirror is zero and vice versa.
/// @dev EVM selector for this function is: 0xdf727d3b,
/// or in textual repr: collectionOwner()
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 {IEthCrossAccountId} from '../util/playgrounds/types';18import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds';1920async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise<any>) {21 const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));22 await call();23 await helper.wait.newBlocks(1);24 const after = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));2526 expect(after < before).to.be.true;2728 return before - after;29}3031describe('Add collection admins', () => {32 let donor: IKeyringPair;3334 before(async function() {35 await usingEthPlaygrounds(async (_helper, privateKey) => {36 donor = await privateKey({filename: __filename});37 });38 });3940 itEth('Add admin by owner', async ({helper}) => {41 const owner = await helper.eth.createAccountWithBalance(donor);42 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');43 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);4445 const newAdmin = helper.eth.createAccount();4647 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();48 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);49 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())50 .to.be.eq(newAdmin.toLocaleLowerCase());51 });5253 itEth('Add cross account admin by owner', async ({helper, privateKey}) => {54 const owner = await helper.eth.createAccountWithBalance(donor);55 56 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');57 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);58 59 const newAdmin = await privateKey('//Bob');60 const newAdminCross = helper.ethCrossAccount.fromKeyringPair(newAdmin);61 await collectionEvm.methods.addCollectionAdminCross(newAdminCross).send();6263 const adminList = await helper.collection.getAdmins(collectionId);64 expect(adminList).to.be.like([{Substrate: newAdmin.address}]);65 });6667 // itEth('Check adminlist', async ({helper, privateKey}) => {68 // const owner = await helper.eth.createAccountWithBalance(donor);69 70 // const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');71 // const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);7273 // const admin1 = helper.eth.createAccount();74 // const admin2 = await privateKey('admin');75 // await collectionEvm.methods.addCollectionAdmin(admin1).send();76 // await collectionEvm.methods.addCollectionAdminCross(helper.ethCrossAccount.fromKeyringPair(admin2)).send();7778 // const adminListRpc = await helper.collection.getAdmins(collectionId);79 // let adminListEth = await collectionEvm.methods.collectionAdmins().call();80 // adminListEth = adminListEth.map((element: IEthCrossAccountId) => {81 // return helper.address.convertCrossAccountFromEthCrossAcoount(element);82 // });83 // expect(adminListRpc).to.be.like(adminListEth);84 // });8586 itEth('Verify owner or admin', async ({helper}) => {87 const owner = await helper.eth.createAccountWithBalance(donor);88 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');8990 const newAdmin = helper.eth.createAccount();91 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);92 93 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.false;94 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();95 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.true;96 });97 98 itEth.skip('Check adminlist', async ({helper, privateKey}) => {99 const owner = await helper.eth.createAccountWithBalance(donor);100 101 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');102 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);103104 const admin1 = helper.eth.createAccount();105 const admin2 = privateKey('admin');106 await collectionEvm.methods.addCollectionAdmin(admin1).send();107 await collectionEvm.methods.addCollectionAdminSubstrate(admin2.addressRaw).send();108109 const adminListRpc = await helper.collection.getAdmins(collectionId);110 let adminListEth = await collectionEvm.methods.collectionAdmins().call();111 adminListEth = adminListEth.map((element: IEthCrossAccountId) => {112 return helper.address.convertCrossAccountFromEthCrossAcoount(element);113 });114 expect(adminListRpc).to.be.like(adminListEth);115 }); 116 117 itEth('(!negative tests!) Add admin by ADMIN is not allowed', async ({helper}) => {118 const owner = await helper.eth.createAccountWithBalance(donor);119 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');120121 const admin = await helper.eth.createAccountWithBalance(donor);122 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);123 await collectionEvm.methods.addCollectionAdmin(admin).send();124125 const user = helper.eth.createAccount();126 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: admin}))127 .to.be.rejectedWith('NoPermission');128129 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);130 expect(adminList.length).to.be.eq(1);131 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())132 .to.be.eq(admin.toLocaleLowerCase());133 });134135 itEth('(!negative tests!) Add admin by USER is not allowed', async ({helper}) => {136 const owner = await helper.eth.createAccountWithBalance(donor);137 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');138139 const notAdmin = await helper.eth.createAccountWithBalance(donor);140 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);141142 const user = helper.eth.createAccount();143 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: notAdmin}))144 .to.be.rejectedWith('NoPermission');145146 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);147 expect(adminList.length).to.be.eq(0);148 });149150 itEth.skip('(!negative tests!) Add substrate admin by ADMIN is not allowed', async ({helper}) => {151 const owner = await helper.eth.createAccountWithBalance(donor);152 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');153154 const admin = await helper.eth.createAccountWithBalance(donor);155 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);156 await collectionEvm.methods.addCollectionAdmin(admin).send();157158 const [notAdmin] = await helper.arrange.createAccounts([10n], donor);159 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin.addressRaw).call({from: admin}))160 .to.be.rejectedWith('NoPermission');161162 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);163 expect(adminList.length).to.be.eq(1);164 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())165 .to.be.eq(admin.toLocaleLowerCase());166 });167168 itEth.skip('(!negative tests!) Add substrate admin by USER is not allowed', async ({helper}) => {169 const owner = await helper.eth.createAccountWithBalance(donor);170 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');171172 const notAdmin0 = await helper.eth.createAccountWithBalance(donor);173 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);174 const [notAdmin1] = await helper.arrange.createAccounts([10n], donor);175 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin1.addressRaw).call({from: notAdmin0}))176 .to.be.rejectedWith('NoPermission');177178 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);179 expect(adminList.length).to.be.eq(0);180 });181});182183describe('Remove collection admins', () => {184 let donor: IKeyringPair;185186 before(async function() {187 await usingEthPlaygrounds(async (_helper, privateKey) => {188 donor = await privateKey({filename: __filename});189 });190 });191192 itEth('Remove admin by owner', async ({helper}) => {193 const owner = await helper.eth.createAccountWithBalance(donor);194 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');195196 const newAdmin = helper.eth.createAccount();197 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);198 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();199200 {201 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);202 expect(adminList.length).to.be.eq(1);203 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())204 .to.be.eq(newAdmin.toLocaleLowerCase());205 }206207 await collectionEvm.methods.removeCollectionAdmin(newAdmin).send();208 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);209 expect(adminList.length).to.be.eq(0);210 });211212 itEth.skip('Remove substrate admin by owner', async ({helper}) => {213 const owner = await helper.eth.createAccountWithBalance(donor);214 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');215216 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);217 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);218 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();219 {220 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);221 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())222 .to.be.eq(newAdmin.address.toLocaleLowerCase());223 }224225 await collectionEvm.methods.removeCollectionAdminSubstrate(newAdmin.addressRaw).send();226 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);227 expect(adminList.length).to.be.eq(0);228 });229230 itEth('(!negative tests!) Remove admin by ADMIN is not allowed', async ({helper}) => {231 const owner = await helper.eth.createAccountWithBalance(donor);232 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');233234 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);235236 const admin0 = await helper.eth.createAccountWithBalance(donor);237 await collectionEvm.methods.addCollectionAdmin(admin0).send();238 const admin1 = await helper.eth.createAccountWithBalance(donor);239 await collectionEvm.methods.addCollectionAdmin(admin1).send();240241 await expect(collectionEvm.methods.removeCollectionAdmin(admin1).call({from: admin0}))242 .to.be.rejectedWith('NoPermission');243 {244 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(admin0.toLocaleLowerCase())248 .to.be.deep.contains(admin1.toLocaleLowerCase());249 }250 });251252 itEth('(!negative tests!) Remove admin by USER is not allowed', async ({helper}) => {253 const owner = await helper.eth.createAccountWithBalance(donor);254 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');255256 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);257258 const admin = await helper.eth.createAccountWithBalance(donor);259 await collectionEvm.methods.addCollectionAdmin(admin).send();260 const notAdmin = helper.eth.createAccount();261262 await expect(collectionEvm.methods.removeCollectionAdmin(admin).call({from: notAdmin}))263 .to.be.rejectedWith('NoPermission');264 {265 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);266 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())267 .to.be.eq(admin.toLocaleLowerCase());268 expect(adminList.length).to.be.eq(1);269 }270 });271272 itEth.skip('(!negative tests!) Remove substrate admin by ADMIN is not allowed', async ({helper}) => {273 const owner = await helper.eth.createAccountWithBalance(donor);274 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');275276 const [adminSub] = await helper.arrange.createAccounts([10n], donor);277 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);278 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();279 const adminEth = await helper.eth.createAccountWithBalance(donor);280 await collectionEvm.methods.addCollectionAdmin(adminEth).send();281282 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: adminEth}))283 .to.be.rejectedWith('NoPermission');284285 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);286 expect(adminList.length).to.be.eq(2);287 expect(adminList.toString().toLocaleLowerCase())288 .to.be.deep.contains(adminSub.address.toLocaleLowerCase())289 .to.be.deep.contains(adminEth.toLocaleLowerCase());290 });291292 itEth.skip('(!negative tests!) Remove substrate admin by USER is not allowed', async ({helper}) => {293 const owner = await helper.eth.createAccountWithBalance(donor);294 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');295296 const [adminSub] = await helper.arrange.createAccounts([10n], donor);297 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);298 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();299 const notAdminEth = await helper.eth.createAccountWithBalance(donor);300301 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: notAdminEth}))302 .to.be.rejectedWith('NoPermission');303304 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);305 expect(adminList.length).to.be.eq(1);306 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())307 .to.be.eq(adminSub.address.toLocaleLowerCase());308 });309});310311describe('Change owner tests', () => {312 let donor: IKeyringPair;313314 before(async function() {315 await usingEthPlaygrounds(async (_helper, privateKey) => {316 donor = await privateKey({filename: __filename});317 });318 });319320 itEth('Change owner', async ({helper}) => {321 const owner = await helper.eth.createAccountWithBalance(donor);322 const newOwner = await helper.eth.createAccountWithBalance(donor);323 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');324 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);325326 await collectionEvm.methods.changeCollectionOwner(newOwner).send();327328 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;329 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.true;330 });331332 itEth('change owner call fee', async ({helper}) => {333 const owner = await helper.eth.createAccountWithBalance(donor);334 const newOwner = await helper.eth.createAccountWithBalance(donor);335 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');336 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);337 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.changeCollectionOwner(newOwner).send());338 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));339 expect(cost > 0);340 });341342 itEth('(!negative tests!) call setOwner by non owner', async ({helper}) => {343 const owner = await helper.eth.createAccountWithBalance(donor);344 const newOwner = await helper.eth.createAccountWithBalance(donor);345 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');346 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);347348 await expect(collectionEvm.methods.changeCollectionOwner(newOwner).send({from: newOwner})).to.be.rejected;349 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.false;350 });351});352353describe('Change substrate owner tests', () => {354 let donor: IKeyringPair;355356 before(async function() {357 await usingEthPlaygrounds(async (_helper, privateKey) => {358 donor = await privateKey({filename: __filename});359 });360 });361362 itEth.skip('Change owner', async ({helper}) => {363 const owner = await helper.eth.createAccountWithBalance(donor);364 const [newOwner] = await helper.arrange.createAccounts([10n], donor);365 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');366 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);367368 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.true;369 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;370371 await collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send();372373 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;374 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.true;375 });376377 itEth.skip('change owner call fee', async ({helper}) => {378 const owner = await helper.eth.createAccountWithBalance(donor);379 const [newOwner] = await helper.arrange.createAccounts([10n], donor);380 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');381 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);382383 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send());384 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));385 expect(cost > 0);386 });387388 itEth.skip('(!negative tests!) call setOwner by non owner', async ({helper}) => {389 const owner = await helper.eth.createAccountWithBalance(donor);390 const otherReceiver = await helper.eth.createAccountWithBalance(donor);391 const [newOwner] = await helper.arrange.createAccounts([10n], donor);392 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');393 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);394395 await expect(collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send({from: otherReceiver})).to.be.rejected;396 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;397 });398});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 {IEthCrossAccountId} from '../util/playgrounds/types';18import {usingEthPlaygrounds, itEth, expect, EthUniqueHelper} from './util/playgrounds';1920async function recordEthFee(helper: EthUniqueHelper, userAddress: string, call: () => Promise<any>) {21 const before = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));22 await call();23 await helper.wait.newBlocks(1);24 const after = await helper.balance.getSubstrate(helper.address.ethToSubstrate(userAddress));2526 expect(after < before).to.be.true;2728 return before - after;29}3031describe('Add collection admins', () => {32 let donor: IKeyringPair;3334 before(async function() {35 await usingEthPlaygrounds(async (_helper, privateKey) => {36 donor = await privateKey({filename: __filename});37 });38 });3940 itEth('Add admin by owner', async ({helper}) => {41 const owner = await helper.eth.createAccountWithBalance(donor);42 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');43 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);4445 const newAdmin = helper.eth.createAccount();4647 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();48 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);49 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())50 .to.be.eq(newAdmin.toLocaleLowerCase());51 });5253 itEth('Add cross account admin by owner', async ({helper, privateKey}) => {54 const owner = await helper.eth.createAccountWithBalance(donor);55 56 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');57 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);58 59 const newAdmin = privateKey('//Bob');60 const newAdminCross = helper.ethCrossAccount.fromKeyringPair(newAdmin);61 await collectionEvm.methods.addCollectionAdminCross(newAdminCross).send();6263 const adminList = await helper.collection.getAdmins(collectionId);64 expect(adminList).to.be.like([{Substrate: newAdmin.address}]);65 });6667 // itEth('Check adminlist', async ({helper, privateKey}) => {68 // const owner = await helper.eth.createAccountWithBalance(donor);69 70 // const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');71 // const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);7273 // const admin1 = helper.eth.createAccount();74 // const admin2 = await privateKey('admin');75 // await collectionEvm.methods.addCollectionAdmin(admin1).send();76 // await collectionEvm.methods.addCollectionAdminCross(helper.ethCrossAccount.fromKeyringPair(admin2)).send();7778 // const adminListRpc = await helper.collection.getAdmins(collectionId);79 // let adminListEth = await collectionEvm.methods.collectionAdmins().call();80 // adminListEth = adminListEth.map((element: IEthCrossAccountId) => {81 // return helper.address.convertCrossAccountFromEthCrossAcoount(element);82 // });83 // expect(adminListRpc).to.be.like(adminListEth);84 // });8586 itEth('Verify owner or admin', async ({helper}) => {87 const owner = await helper.eth.createAccountWithBalance(donor);88 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');8990 const newAdmin = helper.eth.createAccount();91 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);92 93 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.false;94 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();95 expect(await collectionEvm.methods.isOwnerOrAdmin(newAdmin).call()).to.be.true;96 });97 98 itEth.skip('Check adminlist', async ({helper, privateKey}) => {99 const owner = await helper.eth.createAccountWithBalance(donor);100 101 const {collectionAddress, collectionId} = await helper.eth.createNonfungibleCollection(owner, 'A', 'B', 'C');102 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);103104 const admin1 = helper.eth.createAccount();105 const admin2 = privateKey('admin');106 await collectionEvm.methods.addCollectionAdmin(admin1).send();107 await collectionEvm.methods.addCollectionAdminSubstrate(admin2.addressRaw).send();108109 const adminListRpc = await helper.collection.getAdmins(collectionId);110 let adminListEth = await collectionEvm.methods.collectionAdmins().call();111 adminListEth = adminListEth.map((element: IEthCrossAccountId) => {112 return helper.address.convertCrossAccountFromEthCrossAcoount(element);113 });114 expect(adminListRpc).to.be.like(adminListEth);115 }); 116 117 itEth('(!negative tests!) Add admin by ADMIN is not allowed', async ({helper}) => {118 const owner = await helper.eth.createAccountWithBalance(donor);119 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');120121 const admin = await helper.eth.createAccountWithBalance(donor);122 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);123 await collectionEvm.methods.addCollectionAdmin(admin).send();124125 const user = helper.eth.createAccount();126 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: admin}))127 .to.be.rejectedWith('NoPermission');128129 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);130 expect(adminList.length).to.be.eq(1);131 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())132 .to.be.eq(admin.toLocaleLowerCase());133 });134135 itEth('(!negative tests!) Add admin by USER is not allowed', async ({helper}) => {136 const owner = await helper.eth.createAccountWithBalance(donor);137 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');138139 const notAdmin = await helper.eth.createAccountWithBalance(donor);140 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);141142 const user = helper.eth.createAccount();143 await expect(collectionEvm.methods.addCollectionAdmin(user).call({from: notAdmin}))144 .to.be.rejectedWith('NoPermission');145146 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);147 expect(adminList.length).to.be.eq(0);148 });149150 itEth.skip('(!negative tests!) Add substrate admin by ADMIN is not allowed', async ({helper}) => {151 const owner = await helper.eth.createAccountWithBalance(donor);152 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');153154 const admin = await helper.eth.createAccountWithBalance(donor);155 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);156 await collectionEvm.methods.addCollectionAdmin(admin).send();157158 const [notAdmin] = await helper.arrange.createAccounts([10n], donor);159 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin.addressRaw).call({from: admin}))160 .to.be.rejectedWith('NoPermission');161162 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);163 expect(adminList.length).to.be.eq(1);164 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())165 .to.be.eq(admin.toLocaleLowerCase());166 });167168 itEth.skip('(!negative tests!) Add substrate admin by USER is not allowed', async ({helper}) => {169 const owner = await helper.eth.createAccountWithBalance(donor);170 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');171172 const notAdmin0 = await helper.eth.createAccountWithBalance(donor);173 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);174 const [notAdmin1] = await helper.arrange.createAccounts([10n], donor);175 await expect(collectionEvm.methods.addCollectionAdminSubstrate(notAdmin1.addressRaw).call({from: notAdmin0}))176 .to.be.rejectedWith('NoPermission');177178 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);179 expect(adminList.length).to.be.eq(0);180 });181});182183describe('Remove collection admins', () => {184 let donor: IKeyringPair;185186 before(async function() {187 await usingEthPlaygrounds(async (_helper, privateKey) => {188 donor = await privateKey({filename: __filename});189 });190 });191192 itEth('Remove admin by owner', async ({helper}) => {193 const owner = await helper.eth.createAccountWithBalance(donor);194 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');195196 const newAdmin = helper.eth.createAccount();197 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);198 await collectionEvm.methods.addCollectionAdmin(newAdmin).send();199200 {201 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);202 expect(adminList.length).to.be.eq(1);203 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())204 .to.be.eq(newAdmin.toLocaleLowerCase());205 }206207 await collectionEvm.methods.removeCollectionAdmin(newAdmin).send();208 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);209 expect(adminList.length).to.be.eq(0);210 });211212 itEth.skip('Remove substrate admin by owner', async ({helper}) => {213 const owner = await helper.eth.createAccountWithBalance(donor);214 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');215216 const [newAdmin] = await helper.arrange.createAccounts([10n], donor);217 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);218 await collectionEvm.methods.addCollectionAdminSubstrate(newAdmin.addressRaw).send();219 {220 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);221 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())222 .to.be.eq(newAdmin.address.toLocaleLowerCase());223 }224225 await collectionEvm.methods.removeCollectionAdminSubstrate(newAdmin.addressRaw).send();226 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);227 expect(adminList.length).to.be.eq(0);228 });229230 itEth('(!negative tests!) Remove admin by ADMIN is not allowed', async ({helper}) => {231 const owner = await helper.eth.createAccountWithBalance(donor);232 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');233234 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);235236 const admin0 = await helper.eth.createAccountWithBalance(donor);237 await collectionEvm.methods.addCollectionAdmin(admin0).send();238 const admin1 = await helper.eth.createAccountWithBalance(donor);239 await collectionEvm.methods.addCollectionAdmin(admin1).send();240241 await expect(collectionEvm.methods.removeCollectionAdmin(admin1).call({from: admin0}))242 .to.be.rejectedWith('NoPermission');243 {244 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(admin0.toLocaleLowerCase())248 .to.be.deep.contains(admin1.toLocaleLowerCase());249 }250 });251252 itEth('(!negative tests!) Remove admin by USER is not allowed', async ({helper}) => {253 const owner = await helper.eth.createAccountWithBalance(donor);254 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');255256 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);257258 const admin = await helper.eth.createAccountWithBalance(donor);259 await collectionEvm.methods.addCollectionAdmin(admin).send();260 const notAdmin = helper.eth.createAccount();261262 await expect(collectionEvm.methods.removeCollectionAdmin(admin).call({from: notAdmin}))263 .to.be.rejectedWith('NoPermission');264 {265 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);266 expect(adminList[0].asEthereum.toString().toLocaleLowerCase())267 .to.be.eq(admin.toLocaleLowerCase());268 expect(adminList.length).to.be.eq(1);269 }270 });271272 itEth.skip('(!negative tests!) Remove substrate admin by ADMIN is not allowed', async ({helper}) => {273 const owner = await helper.eth.createAccountWithBalance(donor);274 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');275276 const [adminSub] = await helper.arrange.createAccounts([10n], donor);277 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);278 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();279 const adminEth = await helper.eth.createAccountWithBalance(donor);280 await collectionEvm.methods.addCollectionAdmin(adminEth).send();281282 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: adminEth}))283 .to.be.rejectedWith('NoPermission');284285 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);286 expect(adminList.length).to.be.eq(2);287 expect(adminList.toString().toLocaleLowerCase())288 .to.be.deep.contains(adminSub.address.toLocaleLowerCase())289 .to.be.deep.contains(adminEth.toLocaleLowerCase());290 });291292 itEth.skip('(!negative tests!) Remove substrate admin by USER is not allowed', async ({helper}) => {293 const owner = await helper.eth.createAccountWithBalance(donor);294 const {collectionAddress, collectionId} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');295296 const [adminSub] = await helper.arrange.createAccounts([10n], donor);297 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);298 await collectionEvm.methods.addCollectionAdminSubstrate(adminSub.addressRaw).send();299 const notAdminEth = await helper.eth.createAccountWithBalance(donor);300301 await expect(collectionEvm.methods.removeCollectionAdminSubstrate(adminSub.addressRaw).call({from: notAdminEth}))302 .to.be.rejectedWith('NoPermission');303304 const adminList = await helper.callRpc('api.rpc.unique.adminlist', [collectionId]);305 expect(adminList.length).to.be.eq(1);306 expect(adminList[0].asSubstrate.toString().toLocaleLowerCase())307 .to.be.eq(adminSub.address.toLocaleLowerCase());308 });309});310311describe('Change owner tests', () => {312 let donor: IKeyringPair;313314 before(async function() {315 await usingEthPlaygrounds(async (_helper, privateKey) => {316 donor = await privateKey({filename: __filename});317 });318 });319320 itEth('Change owner', async ({helper}) => {321 const owner = await helper.eth.createAccountWithBalance(donor);322 const newOwner = await helper.eth.createAccountWithBalance(donor);323 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');324 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);325326 await collectionEvm.methods.changeCollectionOwner(newOwner).send();327328 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;329 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.true;330 });331332 itEth('change owner call fee', async ({helper}) => {333 const owner = await helper.eth.createAccountWithBalance(donor);334 const newOwner = await helper.eth.createAccountWithBalance(donor);335 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');336 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);337 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.changeCollectionOwner(newOwner).send());338 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));339 expect(cost > 0);340 });341342 itEth('(!negative tests!) call setOwner by non owner', async ({helper}) => {343 const owner = await helper.eth.createAccountWithBalance(donor);344 const newOwner = await helper.eth.createAccountWithBalance(donor);345 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');346 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);347348 await expect(collectionEvm.methods.changeCollectionOwner(newOwner).send({from: newOwner})).to.be.rejected;349 expect(await collectionEvm.methods.isOwnerOrAdmin(newOwner).call()).to.be.false;350 });351});352353describe('Change substrate owner tests', () => {354 let donor: IKeyringPair;355356 before(async function() {357 await usingEthPlaygrounds(async (_helper, privateKey) => {358 donor = await privateKey({filename: __filename});359 });360 });361362 itEth.skip('Change owner', async ({helper}) => {363 const owner = await helper.eth.createAccountWithBalance(donor);364 const [newOwner] = await helper.arrange.createAccounts([10n], donor);365 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');366 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);367368 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.true;369 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;370371 await collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send();372373 expect(await collectionEvm.methods.isOwnerOrAdmin(owner).call()).to.be.false;374 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.true;375 });376377 itEth.skip('change owner call fee', async ({helper}) => {378 const owner = await helper.eth.createAccountWithBalance(donor);379 const [newOwner] = await helper.arrange.createAccounts([10n], donor);380 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');381 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);382383 const cost = await recordEthFee(helper, owner, () => collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send());384 expect(cost < BigInt(0.2 * Number(helper.balance.getOneTokenNominal())));385 expect(cost > 0);386 });387388 itEth.skip('(!negative tests!) call setOwner by non owner', async ({helper}) => {389 const owner = await helper.eth.createAccountWithBalance(donor);390 const otherReceiver = await helper.eth.createAccountWithBalance(donor);391 const [newOwner] = await helper.arrange.createAccounts([10n], donor);392 const {collectionAddress} = await helper.eth.createNFTCollection(owner, 'A', 'B', 'C');393 const collectionEvm = helper.ethNativeContract.collection(collectionAddress, 'nft', owner);394395 await expect(collectionEvm.methods.setOwnerSubstrate(newOwner.addressRaw).send({from: otherReceiver})).to.be.rejected;396 expect(await collectionEvm.methods.isOwnerOrAdminSubstrate(newOwner.addressRaw).call()).to.be.false;397 });398});tests/src/eth/fungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/fungible.test.ts
+++ b/tests/src/eth/fungible.test.ts
@@ -149,7 +149,7 @@
});
itEth('Can perform burnFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const sender = await helper.eth.createAccountWithBalance(alice, 100n);
const collection = await helper.ft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'}, 0);
@@ -261,7 +261,7 @@
});
itEth('Can perform transferFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const sender = await helper.eth.createAccountWithBalance(alice, 100n);
const collection = await helper.ft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'}, 0);
@@ -455,7 +455,7 @@
});
itEth('Events emitted for transferFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const sender = await helper.eth.createAccountWithBalance(alice, 100n);
const collection = await helper.ft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'}, 0);
tests/src/eth/nonFungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/nonFungible.test.ts
+++ b/tests/src/eth/nonFungible.test.ts
@@ -247,10 +247,10 @@
});
itEth('Can perform burnFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const collection = await helper.nft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
- const owner = await privateKey('//Bob');
+ const owner = privateKey('//Bob');
const spender = await helper.eth.createAccountWithBalance(alice, 100n);
const token = await collection.mintToken(alice, {Substrate: owner.address});
@@ -277,11 +277,11 @@
});
itEth('Can perform approveCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const collection = await helper.nft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
const owner = await helper.eth.createAccountWithBalance(alice, 100n);
- const receiver = await privateKey('//Charlie');
+ const receiver = privateKey('//Charlie');
const token = await collection.mintToken(alice, {Ethereum: owner});
@@ -410,12 +410,12 @@
});
itEth('Can perform transferFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const collection = await helper.nft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
- const owner = await privateKey('//Bob');
+ const owner = privateKey('//Bob');
const spender = await helper.eth.createAccountWithBalance(alice, 100n);
- const receiver = await privateKey('//Charlie');
+ const receiver = privateKey('//Charlie');
const token = await collection.mintToken(alice, {Substrate: owner.address});
tests/src/eth/reFungible.test.tsdiffbeforeafterboth--- a/tests/src/eth/reFungible.test.ts
+++ b/tests/src/eth/reFungible.test.ts
@@ -228,7 +228,7 @@
});
itEth('Can perform burnFrom()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const collection = await helper.rft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
const owner = await helper.eth.createAccountWithBalance(alice, 100n);
@@ -262,10 +262,10 @@
});
itEth('Can perform burnFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const collection = await helper.rft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
- const owner = await privateKey('//Bob');
+ const owner = privateKey('//Bob');
const spender = await helper.eth.createAccountWithBalance(alice, 100n);
const token = await collection.mintToken(alice, 100n, {Substrate: owner.address});
@@ -295,12 +295,12 @@
});
itEth('Can perform transferFromCross()', async ({helper, privateKey}) => {
- const alice = await privateKey('//Alice');
+ const alice = privateKey('//Alice');
const collection = await helper.rft.mintCollection(alice, {name: 'A', description: 'B', tokenPrefix: 'C'});
- const owner = await privateKey('//Bob');
+ const owner = privateKey('//Bob');
const spender = await helper.eth.createAccountWithBalance(alice, 100n);
- const receiver = await privateKey('//Charlie');
+ const receiver = privateKey('//Charlie');
const token = await collection.mintToken(alice, 100n, {Substrate: owner.address});
tests/src/eth/util/playgrounds/unique.dev.tsdiffbeforeafterboth--- a/tests/src/eth/util/playgrounds/unique.dev.ts
+++ b/tests/src/eth/util/playgrounds/unique.dev.ts
@@ -381,6 +381,46 @@
}
}
+export class EthCrossAccountGroup extends EthGroupBase {
+ fromAddress(address: TEthereumAccount): TEthCrossAccount {
+ return {
+ 0: address,
+ 1: '0',
+ field_0: address,
+ field_1: '0',
+ };
+ }
+
+ fromKeyringPair(keyring: IKeyringPair): TEthCrossAccount {
+ return {
+ 0: '0x0000000000000000000000000000000000000000',
+ 1: keyring.addressRaw,
+ field_0: '0x0000000000000000000000000000000000000000',
+ field_1: keyring.addressRaw,
+ };
+ }
+}
+
+export class EthCrossAccountGroup extends EthGroupBase {
+ fromAddress(address: TEthereumAccount): TEthCrossAccount {
+ return {
+ 0: address,
+ 1: '0',
+ field_0: address,
+ field_1: '0',
+ };
+ }
+
+ fromKeyringPair(keyring: IKeyringPair): TEthCrossAccount {
+ return {
+ 0: '0x0000000000000000000000000000000000000000',
+ 1: keyring.addressRaw,
+ field_0: '0x0000000000000000000000000000000000000000',
+ field_1: keyring.addressRaw,
+ };
+ }
+}
+
export class EthUniqueHelper extends DevUniqueHelper {
web3: Web3 | null = null;
web3Provider: WebsocketProvider | null = null;