difftreelog
Fix tests: do not check the number of events
in: master
1 file changed
tests/src/eth/events.test.tsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {expect} from 'chai';18import {IKeyringPair} from '@polkadot/types/types';19import {EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';20import {IEvent, TCollectionMode} from '../util/playgrounds/types';21import {Pallets, requirePalletsOrSkip} from '../util';22import {CollectionLimits, EthTokenPermissions, NormalizedEvent} from './util/playgrounds/types';2324let donor: IKeyringPair;25 26before(async function () {27 await usingEthPlaygrounds(async (_helper, privateKey) => {28 donor = await privateKey({filename: __filename});29 });30});3132function clearEvents(ethEvents: NormalizedEvent[], subEvents: IEvent[]) {33 ethEvents.splice(0);34 subEvents.splice(0);35}3637async function testCollectionCreatedAndDestroy(helper: EthUniqueHelper, mode: TCollectionMode) {38 const owner = await helper.eth.createAccountWithBalance(donor);39 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionCreated', 'CollectionDestroyed']}]);40 const {collectionAddress, events: ethEvents} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');41 await helper.wait.newBlocks(1);42 {43 expect(ethEvents).to.containSubset([44 {45 event: 'CollectionCreated',46 args: {47 owner: owner,48 collectionId: collectionAddress,49 },50 },51 ]);52 expect(subEvents).to.containSubset([{method: 'CollectionCreated'}]);53 clearEvents(ethEvents, subEvents);54 }55 {56 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);57 const result = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner});58 await helper.wait.newBlocks(1);59 expect(result.events).to.containSubset({60 CollectionDestroyed: {61 returnValues: {62 collectionId: collectionAddress,63 },64 },65 });66 expect(subEvents).to.containSubset([{method: 'CollectionDestroyed'}]);67 }68 unsubscribe();69}7071async function testCollectionPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {72 const owner = await helper.eth.createAccountWithBalance(donor);73 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');74 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);75 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);76 77 const ethEvents: any = [];78 collectionHelper.events.allEvents((_: any, event: any) => {79 ethEvents.push(event);80 });81 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPropertySet', 'CollectionPropertyDeleted']}]);82 {83 await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner});84 await helper.wait.newBlocks(1);85 expect(ethEvents).to.containSubset([86 {87 event: 'CollectionChanged',88 returnValues: {89 collectionId: collectionAddress,90 },91 },92 ]);93 expect(subEvents).to.containSubset([{method: 'CollectionPropertySet'}]);94 clearEvents(ethEvents, subEvents);95 }96 {97 await collection.methods.deleteCollectionProperties(['A']).send({from:owner});98 await helper.wait.newBlocks(1);99 expect(ethEvents).to.containSubset([100 {101 event: 'CollectionChanged',102 returnValues: {103 collectionId: collectionAddress,104 },105 },106 ]);107 expect(subEvents).to.containSubset([{method: 'CollectionPropertyDeleted'}]);108 }109 unsubscribe();110}111112async function testPropertyPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {113 const owner = await helper.eth.createAccountWithBalance(donor);114 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');115 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);116 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);117 const ethEvents: any = [];118 collectionHelper.events.allEvents((_: any, event: any) => {119 ethEvents.push(event);120 });121 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]);122 await collection.methods.setTokenPropertyPermissions([123 ['A', [124 [EthTokenPermissions.Mutable, true], 125 [EthTokenPermissions.TokenOwner, true], 126 [EthTokenPermissions.CollectionAdmin, true]],127 ],128 ]).send({from: owner});129 await helper.wait.newBlocks(1);130 expect(ethEvents).to.containSubset([131 {132 event: 'CollectionChanged',133 returnValues: {134 collectionId: collectionAddress,135 },136 },137 ]);138 expect(subEvents).to.containSubset([{method: 'PropertyPermissionSet'}]);139 unsubscribe();140}141142async function testAllowListAddressAddedAndRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {143 const owner = await helper.eth.createAccountWithBalance(donor);144 const user = helper.ethCrossAccount.createAccount();145 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');146 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);147 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);148 const ethEvents: any[] = [];149 collectionHelper.events.allEvents((_: any, event: any) => {150 ethEvents.push(event);151 });152153 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['AllowListAddressAdded', 'AllowListAddressRemoved']}]);154 {155 await collection.methods.addToCollectionAllowListCross(user).send({from: owner});156 await helper.wait.newBlocks(1);157 expect(ethEvents).to.containSubset([158 {159 event: 'CollectionChanged',160 returnValues: {161 collectionId: collectionAddress,162 },163 },164 ]);165 expect(subEvents).to.containSubset([{method: 'AllowListAddressAdded'}]);166 clearEvents(ethEvents, subEvents);167 }168 {169 await collection.methods.removeFromCollectionAllowListCross(user).send({from: owner});170 await helper.wait.newBlocks(1);171 expect(ethEvents.length).to.be.eq(1);172 expect(ethEvents).to.containSubset([173 {174 event: 'CollectionChanged',175 returnValues: {176 collectionId: collectionAddress,177 },178 },179 ]);180 expect(subEvents).to.containSubset([{method: 'AllowListAddressRemoved'}]);181 }182 unsubscribe();183}184185async function testCollectionAdminAddedAndRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {186 const owner = await helper.eth.createAccountWithBalance(donor);187 const user = helper.ethCrossAccount.createAccount();188 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');189 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);190 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);191 const ethEvents: any = [];192 collectionHelper.events.allEvents((_: any, event: any) => {193 ethEvents.push(event);194 });195 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionAdminAdded', 'CollectionAdminRemoved']}]);196 {197 await collection.methods.addCollectionAdminCross(user).send({from: owner});198 await helper.wait.newBlocks(1);199 expect(ethEvents).to.containSubset([200 {201 event: 'CollectionChanged',202 returnValues: {203 collectionId: collectionAddress,204 },205 },206 ]);207 expect(subEvents).to.containSubset([{method: 'CollectionAdminAdded'}]);208 clearEvents(ethEvents, subEvents);209 }210 {211 await collection.methods.removeCollectionAdminCross(user).send({from: owner});212 await helper.wait.newBlocks(1);213 expect(ethEvents).to.containSubset([214 {215 event: 'CollectionChanged',216 returnValues: {217 collectionId: collectionAddress,218 },219 },220 ]);221 expect(subEvents).to.containSubset([{method: 'CollectionAdminRemoved'}]);222 }223 unsubscribe();224}225226async function testCollectionLimitSet(helper: EthUniqueHelper, mode: TCollectionMode) {227 const owner = await helper.eth.createAccountWithBalance(donor);228 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');229 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);230 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);231 const ethEvents: any = [];232 collectionHelper.events.allEvents((_: any, event: any) => {233 ethEvents.push(event);234 });235 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]);236 {237 await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, 0).send({from: owner});238 await helper.wait.newBlocks(1);239 expect(ethEvents).to.containSubset([240 {241 event: 'CollectionChanged',242 returnValues: {243 collectionId: collectionAddress,244 },245 },246 ]);247 expect(subEvents).to.containSubset([{method: 'CollectionLimitSet'}]);248 }249 unsubscribe();250}251252async function testCollectionOwnerChanged(helper: EthUniqueHelper, mode: TCollectionMode) {253 const owner = await helper.eth.createAccountWithBalance(donor);254 const newOwner = helper.ethCrossAccount.createAccount();255 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');256 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);257 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);258 const ethEvents: any = [];259 collectionHelper.events.allEvents((_: any, event: any) => {260 ethEvents.push(event);261 });262 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionOwnerChanged']}]);263 {264 await collection.methods.changeCollectionOwnerCross(newOwner).send({from: owner});265 await helper.wait.newBlocks(1);266 expect(ethEvents).to.containSubset([267 {268 event: 'CollectionChanged',269 returnValues: {270 collectionId: collectionAddress,271 },272 },273 ]);274 expect(subEvents).to.containSubset([{method: 'CollectionOwnerChanged'}]);275 }276 unsubscribe();277}278279async function testCollectionPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {280 const owner = await helper.eth.createAccountWithBalance(donor);281 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');282 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);283 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);284 const ethEvents: any = [];285 collectionHelper.events.allEvents((_: any, event: any) => {286 ethEvents.push(event);287 });288 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPermissionSet']}]);289 {290 await collection.methods.setCollectionMintMode(true).send({from: owner});291 await helper.wait.newBlocks(1);292 expect(ethEvents).to.containSubset([293 {294 event: 'CollectionChanged',295 returnValues: {296 collectionId: collectionAddress,297 },298 },299 ]);300 expect(subEvents).to.containSubset([{method: 'CollectionPermissionSet'}]);301 clearEvents(ethEvents, subEvents);302 }303 {304 await collection.methods.setCollectionAccess(1).send({from: owner});305 await helper.wait.newBlocks(1);306 expect(ethEvents).to.containSubset([307 {308 event: 'CollectionChanged',309 returnValues: {310 collectionId: collectionAddress,311 },312 },313 ]);314 expect(subEvents).to.containSubset([{method: 'CollectionPermissionSet'}]);315 }316 unsubscribe();317}318319async function testCollectionSponsorSetAndConfirmedAndThenRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {320 const owner = await helper.eth.createAccountWithBalance(donor);321 const sponsor = await helper.ethCrossAccount.createAccountWithBalance(donor);322 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');323 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);324 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);325 const ethEvents: any = [];326 collectionHelper.events.allEvents((_: any, event: any) => {327 ethEvents.push(event);328 });329 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{330 section: 'common', names: ['CollectionSponsorSet', 'SponsorshipConfirmed', 'CollectionSponsorRemoved',331 ]}]);332 {333 await collection.methods.setCollectionSponsorCross(sponsor).send({from: owner});334 await helper.wait.newBlocks(1);335 expect(ethEvents).to.containSubset([{336 event: 'CollectionChanged',337 returnValues: {338 collectionId: collectionAddress,339 },340 }]);341 expect(subEvents).to.containSubset([{method: 'CollectionSponsorSet'}]);342 clearEvents(ethEvents, subEvents);343 }344 {345 await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});346 await helper.wait.newBlocks(1);347 expect(ethEvents).to.containSubset([348 {349 event: 'CollectionChanged',350 returnValues: {351 collectionId: collectionAddress,352 },353 },354 ]);355 expect(subEvents).to.containSubset([{method: 'SponsorshipConfirmed'}]);356 clearEvents(ethEvents, subEvents);357 }358 {359 await collection.methods.removeCollectionSponsor().send({from: owner});360 await helper.wait.newBlocks(1);361 expect(ethEvents).to.containSubset([362 {363 event: 'CollectionChanged',364 returnValues: {365 collectionId: collectionAddress,366 },367 },368 ]);369 expect(subEvents).to.containSubset([{method: 'CollectionSponsorRemoved'}]);370 }371 unsubscribe();372}373374async function testTokenPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {375 const owner = await helper.eth.createAccountWithBalance(donor);376 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');377 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);378 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);379 const result = await collection.methods.mint(owner).send({from: owner});380 const tokenId = result.events.Transfer.returnValues.tokenId;381 await collection.methods.setTokenPropertyPermissions([382 ['A', [383 [EthTokenPermissions.Mutable, true], 384 [EthTokenPermissions.TokenOwner, true], 385 [EthTokenPermissions.CollectionAdmin, true]],386 ],387 ]).send({from: owner});388389390 const ethEvents: any = [];391 collectionHelper.events.allEvents((_: any, event: any) => {392 ethEvents.push(event);393 });394 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);395 {396 await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});397 await helper.wait.newBlocks(1);398 expect(ethEvents).to.containSubset([399 {400 event: 'TokenChanged',401 returnValues: {402 collectionId: collectionAddress,403 },404 },405 ]);406 expect(subEvents).to.containSubset([{method: 'TokenPropertySet'}]);407 clearEvents(ethEvents, subEvents);408 }409 {410 await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});411 await helper.wait.newBlocks(1);412 expect(ethEvents).to.containSubset([413 {414 event: 'TokenChanged',415 returnValues: {416 collectionId: collectionAddress,417 },418 },419 ]);420 expect(subEvents).to.containSubset([{method: 'TokenPropertyDeleted'}]);421 }422 unsubscribe();423}424425describe('[FT] Sync sub & eth events', () => {426 const mode: TCollectionMode = 'ft';427428 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {429 await testCollectionCreatedAndDestroy(helper, mode);430 });431432 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {433 await testCollectionPropertySetAndDeleted(helper, mode);434 });435 436 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {437 await testAllowListAddressAddedAndRemoved(helper, mode);438 });439 440 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {441 await testCollectionAdminAddedAndRemoved(helper, mode);442 });443 444 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {445 await testCollectionLimitSet(helper, mode);446 });447 448 itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {449 await testCollectionOwnerChanged(helper, mode);450 });451 452 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {453 await testCollectionPermissionSet(helper, mode);454 });455456 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {457 await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);458 });459});460461describe('[NFT] Sync sub & eth events', () => {462 const mode: TCollectionMode = 'nft';463464 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {465 await testCollectionCreatedAndDestroy(helper, mode);466 });467468 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {469 await testCollectionPropertySetAndDeleted(helper, mode);470 });471 472 itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {473 await testPropertyPermissionSet(helper, mode);474 });475 476 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {477 await testAllowListAddressAddedAndRemoved(helper, mode);478 });479 480 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {481 await testCollectionAdminAddedAndRemoved(helper, mode);482 });483 484 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {485 await testCollectionLimitSet(helper, mode);486 });487 488 itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {489 await testCollectionOwnerChanged(helper, mode);490 });491 492 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {493 await testCollectionPermissionSet(helper, mode);494 });495496 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {497 await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);498 });499 500 itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {501 await testTokenPropertySetAndDeleted(helper, mode);502 });503});504505describe('[RFT] Sync sub & eth events', () => {506 const mode: TCollectionMode = 'rft';507508 before(async function() {509 await usingEthPlaygrounds(async (helper, privateKey) => {510 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);511 const _donor = await privateKey({filename: __filename});512 });513 });514515 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {516 await testCollectionCreatedAndDestroy(helper, mode);517 });518519 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {520 await testCollectionPropertySetAndDeleted(helper, mode);521 });522 523 itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {524 await testPropertyPermissionSet(helper, mode);525 });526 527 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {528 await testAllowListAddressAddedAndRemoved(helper, mode);529 });530 531 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {532 await testCollectionAdminAddedAndRemoved(helper, mode);533 });534 535 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {536 await testCollectionLimitSet(helper, mode);537 });538 539 itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {540 await testCollectionOwnerChanged(helper, mode);541 });542 543 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {544 await testCollectionPermissionSet(helper, mode);545 });546547 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {548 await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);549 });550 551 itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {552 await testTokenPropertySetAndDeleted(helper, mode);553 });554});1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617import {expect} from 'chai';18import {IKeyringPair} from '@polkadot/types/types';19import {EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';20import {IEvent, TCollectionMode} from '../util/playgrounds/types';21import {Pallets, requirePalletsOrSkip} from '../util';22import {CollectionLimits, EthTokenPermissions, NormalizedEvent} from './util/playgrounds/types';2324let donor: IKeyringPair;25 26before(async function () {27 await usingEthPlaygrounds(async (_helper, privateKey) => {28 donor = await privateKey({filename: __filename});29 });30});3132function clearEvents(ethEvents: NormalizedEvent[], subEvents: IEvent[]) {33 ethEvents.splice(0);34 subEvents.splice(0);35}3637async function testCollectionCreatedAndDestroy(helper: EthUniqueHelper, mode: TCollectionMode) {38 const owner = await helper.eth.createAccountWithBalance(donor);39 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionCreated', 'CollectionDestroyed']}]);40 const {collectionAddress, events: ethEvents} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');41 await helper.wait.newBlocks(1);42 {43 expect(ethEvents).to.containSubset([44 {45 event: 'CollectionCreated',46 args: {47 owner: owner,48 collectionId: collectionAddress,49 },50 },51 ]);52 expect(subEvents).to.containSubset([{method: 'CollectionCreated'}]);53 clearEvents(ethEvents, subEvents);54 }55 {56 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);57 const result = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner});58 await helper.wait.newBlocks(1);59 expect(result.events).to.containSubset({60 CollectionDestroyed: {61 returnValues: {62 collectionId: collectionAddress,63 },64 },65 });66 expect(subEvents).to.containSubset([{method: 'CollectionDestroyed'}]);67 }68 unsubscribe();69}7071async function testCollectionPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {72 const owner = await helper.eth.createAccountWithBalance(donor);73 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');74 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);75 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);76 77 const ethEvents: any = [];78 collectionHelper.events.allEvents((_: any, event: any) => {79 ethEvents.push(event);80 });81 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPropertySet', 'CollectionPropertyDeleted']}]);82 {83 await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner});84 await helper.wait.newBlocks(1);85 expect(ethEvents).to.containSubset([86 {87 event: 'CollectionChanged',88 returnValues: {89 collectionId: collectionAddress,90 },91 },92 ]);93 expect(subEvents).to.containSubset([{method: 'CollectionPropertySet'}]);94 clearEvents(ethEvents, subEvents);95 }96 {97 await collection.methods.deleteCollectionProperties(['A']).send({from:owner});98 await helper.wait.newBlocks(1);99 expect(ethEvents).to.containSubset([100 {101 event: 'CollectionChanged',102 returnValues: {103 collectionId: collectionAddress,104 },105 },106 ]);107 expect(subEvents).to.containSubset([{method: 'CollectionPropertyDeleted'}]);108 }109 unsubscribe();110}111112async function testPropertyPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {113 const owner = await helper.eth.createAccountWithBalance(donor);114 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');115 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);116 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);117 const ethEvents: any = [];118 collectionHelper.events.allEvents((_: any, event: any) => {119 ethEvents.push(event);120 });121 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]);122 await collection.methods.setTokenPropertyPermissions([123 ['A', [124 [EthTokenPermissions.Mutable, true], 125 [EthTokenPermissions.TokenOwner, true], 126 [EthTokenPermissions.CollectionAdmin, true]],127 ],128 ]).send({from: owner});129 await helper.wait.newBlocks(1);130 expect(ethEvents).to.containSubset([131 {132 event: 'CollectionChanged',133 returnValues: {134 collectionId: collectionAddress,135 },136 },137 ]);138 expect(subEvents).to.containSubset([{method: 'PropertyPermissionSet'}]);139 unsubscribe();140}141142async function testAllowListAddressAddedAndRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {143 const owner = await helper.eth.createAccountWithBalance(donor);144 const user = helper.ethCrossAccount.createAccount();145 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');146 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);147 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);148 const ethEvents: any[] = [];149 collectionHelper.events.allEvents((_: any, event: any) => {150 ethEvents.push(event);151 });152153 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['AllowListAddressAdded', 'AllowListAddressRemoved']}]);154 {155 await collection.methods.addToCollectionAllowListCross(user).send({from: owner});156 await helper.wait.newBlocks(1);157 expect(ethEvents).to.containSubset([158 {159 event: 'CollectionChanged',160 returnValues: {161 collectionId: collectionAddress,162 },163 },164 ]);165 expect(subEvents).to.containSubset([{method: 'AllowListAddressAdded'}]);166 clearEvents(ethEvents, subEvents);167 }168 {169 await collection.methods.removeFromCollectionAllowListCross(user).send({from: owner});170 await helper.wait.newBlocks(1);171 expect(ethEvents).to.containSubset([172 {173 event: 'CollectionChanged',174 returnValues: {175 collectionId: collectionAddress,176 },177 },178 ]);179 expect(subEvents).to.containSubset([{method: 'AllowListAddressRemoved'}]);180 }181 unsubscribe();182}183184async function testCollectionAdminAddedAndRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {185 const owner = await helper.eth.createAccountWithBalance(donor);186 const user = helper.ethCrossAccount.createAccount();187 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');188 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);189 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);190 const ethEvents: any = [];191 collectionHelper.events.allEvents((_: any, event: any) => {192 ethEvents.push(event);193 });194 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionAdminAdded', 'CollectionAdminRemoved']}]);195 {196 await collection.methods.addCollectionAdminCross(user).send({from: owner});197 await helper.wait.newBlocks(1);198 expect(ethEvents).to.containSubset([199 {200 event: 'CollectionChanged',201 returnValues: {202 collectionId: collectionAddress,203 },204 },205 ]);206 expect(subEvents).to.containSubset([{method: 'CollectionAdminAdded'}]);207 clearEvents(ethEvents, subEvents);208 }209 {210 await collection.methods.removeCollectionAdminCross(user).send({from: owner});211 await helper.wait.newBlocks(1);212 expect(ethEvents).to.containSubset([213 {214 event: 'CollectionChanged',215 returnValues: {216 collectionId: collectionAddress,217 },218 },219 ]);220 expect(subEvents).to.containSubset([{method: 'CollectionAdminRemoved'}]);221 }222 unsubscribe();223}224225async function testCollectionLimitSet(helper: EthUniqueHelper, mode: TCollectionMode) {226 const owner = await helper.eth.createAccountWithBalance(donor);227 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');228 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);229 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);230 const ethEvents: any = [];231 collectionHelper.events.allEvents((_: any, event: any) => {232 ethEvents.push(event);233 });234 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]);235 {236 await collection.methods.setCollectionLimit(CollectionLimits.OwnerCanTransfer, true, 0).send({from: owner});237 await helper.wait.newBlocks(1);238 expect(ethEvents).to.containSubset([239 {240 event: 'CollectionChanged',241 returnValues: {242 collectionId: collectionAddress,243 },244 },245 ]);246 expect(subEvents).to.containSubset([{method: 'CollectionLimitSet'}]);247 }248 unsubscribe();249}250251async function testCollectionOwnerChanged(helper: EthUniqueHelper, mode: TCollectionMode) {252 const owner = await helper.eth.createAccountWithBalance(donor);253 const newOwner = helper.ethCrossAccount.createAccount();254 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');255 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);256 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);257 const ethEvents: any = [];258 collectionHelper.events.allEvents((_: any, event: any) => {259 ethEvents.push(event);260 });261 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionOwnerChanged']}]);262 {263 await collection.methods.changeCollectionOwnerCross(newOwner).send({from: owner});264 await helper.wait.newBlocks(1);265 expect(ethEvents).to.containSubset([266 {267 event: 'CollectionChanged',268 returnValues: {269 collectionId: collectionAddress,270 },271 },272 ]);273 expect(subEvents).to.containSubset([{method: 'CollectionOwnerChanged'}]);274 }275 unsubscribe();276}277278async function testCollectionPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {279 const owner = await helper.eth.createAccountWithBalance(donor);280 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');281 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);282 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);283 const ethEvents: any = [];284 collectionHelper.events.allEvents((_: any, event: any) => {285 ethEvents.push(event);286 });287 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPermissionSet']}]);288 {289 await collection.methods.setCollectionMintMode(true).send({from: owner});290 await helper.wait.newBlocks(1);291 expect(ethEvents).to.containSubset([292 {293 event: 'CollectionChanged',294 returnValues: {295 collectionId: collectionAddress,296 },297 },298 ]);299 expect(subEvents).to.containSubset([{method: 'CollectionPermissionSet'}]);300 clearEvents(ethEvents, subEvents);301 }302 {303 await collection.methods.setCollectionAccess(1).send({from: owner});304 await helper.wait.newBlocks(1);305 expect(ethEvents).to.containSubset([306 {307 event: 'CollectionChanged',308 returnValues: {309 collectionId: collectionAddress,310 },311 },312 ]);313 expect(subEvents).to.containSubset([{method: 'CollectionPermissionSet'}]);314 }315 unsubscribe();316}317318async function testCollectionSponsorSetAndConfirmedAndThenRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {319 const owner = await helper.eth.createAccountWithBalance(donor);320 const sponsor = await helper.ethCrossAccount.createAccountWithBalance(donor);321 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');322 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);323 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);324 const ethEvents: any = [];325 collectionHelper.events.allEvents((_: any, event: any) => {326 ethEvents.push(event);327 });328 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{329 section: 'common', names: ['CollectionSponsorSet', 'SponsorshipConfirmed', 'CollectionSponsorRemoved',330 ]}]);331 {332 await collection.methods.setCollectionSponsorCross(sponsor).send({from: owner});333 await helper.wait.newBlocks(1);334 expect(ethEvents).to.containSubset([{335 event: 'CollectionChanged',336 returnValues: {337 collectionId: collectionAddress,338 },339 }]);340 expect(subEvents).to.containSubset([{method: 'CollectionSponsorSet'}]);341 clearEvents(ethEvents, subEvents);342 }343 {344 await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});345 await helper.wait.newBlocks(1);346 expect(ethEvents).to.containSubset([347 {348 event: 'CollectionChanged',349 returnValues: {350 collectionId: collectionAddress,351 },352 },353 ]);354 expect(subEvents).to.containSubset([{method: 'SponsorshipConfirmed'}]);355 clearEvents(ethEvents, subEvents);356 }357 {358 await collection.methods.removeCollectionSponsor().send({from: owner});359 await helper.wait.newBlocks(1);360 expect(ethEvents).to.containSubset([361 {362 event: 'CollectionChanged',363 returnValues: {364 collectionId: collectionAddress,365 },366 },367 ]);368 expect(subEvents).to.containSubset([{method: 'CollectionSponsorRemoved'}]);369 }370 unsubscribe();371}372373async function testTokenPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {374 const owner = await helper.eth.createAccountWithBalance(donor);375 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');376 const collection = helper.ethNativeContract.collection(collectionAddress, mode, owner);377 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);378 const result = await collection.methods.mint(owner).send({from: owner});379 const tokenId = result.events.Transfer.returnValues.tokenId;380 await collection.methods.setTokenPropertyPermissions([381 ['A', [382 [EthTokenPermissions.Mutable, true], 383 [EthTokenPermissions.TokenOwner, true], 384 [EthTokenPermissions.CollectionAdmin, true]],385 ],386 ]).send({from: owner});387388389 const ethEvents: any = [];390 collectionHelper.events.allEvents((_: any, event: any) => {391 ethEvents.push(event);392 });393 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);394 {395 await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});396 await helper.wait.newBlocks(1);397 expect(ethEvents).to.containSubset([398 {399 event: 'TokenChanged',400 returnValues: {401 collectionId: collectionAddress,402 },403 },404 ]);405 expect(subEvents).to.containSubset([{method: 'TokenPropertySet'}]);406 clearEvents(ethEvents, subEvents);407 }408 {409 await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});410 await helper.wait.newBlocks(1);411 expect(ethEvents).to.containSubset([412 {413 event: 'TokenChanged',414 returnValues: {415 collectionId: collectionAddress,416 },417 },418 ]);419 expect(subEvents).to.containSubset([{method: 'TokenPropertyDeleted'}]);420 }421 unsubscribe();422}423424describe('[FT] Sync sub & eth events', () => {425 const mode: TCollectionMode = 'ft';426427 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {428 await testCollectionCreatedAndDestroy(helper, mode);429 });430431 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {432 await testCollectionPropertySetAndDeleted(helper, mode);433 });434 435 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {436 await testAllowListAddressAddedAndRemoved(helper, mode);437 });438 439 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {440 await testCollectionAdminAddedAndRemoved(helper, mode);441 });442 443 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {444 await testCollectionLimitSet(helper, mode);445 });446 447 itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {448 await testCollectionOwnerChanged(helper, mode);449 });450 451 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {452 await testCollectionPermissionSet(helper, mode);453 });454455 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {456 await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);457 });458});459460describe('[NFT] Sync sub & eth events', () => {461 const mode: TCollectionMode = 'nft';462463 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {464 await testCollectionCreatedAndDestroy(helper, mode);465 });466467 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {468 await testCollectionPropertySetAndDeleted(helper, mode);469 });470 471 itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {472 await testPropertyPermissionSet(helper, mode);473 });474 475 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {476 await testAllowListAddressAddedAndRemoved(helper, mode);477 });478 479 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {480 await testCollectionAdminAddedAndRemoved(helper, mode);481 });482 483 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {484 await testCollectionLimitSet(helper, mode);485 });486 487 itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {488 await testCollectionOwnerChanged(helper, mode);489 });490 491 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {492 await testCollectionPermissionSet(helper, mode);493 });494495 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {496 await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);497 });498 499 itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {500 await testTokenPropertySetAndDeleted(helper, mode);501 });502});503504describe('[RFT] Sync sub & eth events', () => {505 const mode: TCollectionMode = 'rft';506507 before(async function() {508 await usingEthPlaygrounds(async (helper, privateKey) => {509 requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);510 const _donor = await privateKey({filename: __filename});511 });512 });513514 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {515 await testCollectionCreatedAndDestroy(helper, mode);516 });517518 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {519 await testCollectionPropertySetAndDeleted(helper, mode);520 });521 522 itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {523 await testPropertyPermissionSet(helper, mode);524 });525 526 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {527 await testAllowListAddressAddedAndRemoved(helper, mode);528 });529 530 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {531 await testCollectionAdminAddedAndRemoved(helper, mode);532 });533 534 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {535 await testCollectionLimitSet(helper, mode);536 });537 538 itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {539 await testCollectionOwnerChanged(helper, mode);540 });541 542 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {543 await testCollectionPermissionSet(helper, mode);544 });545546 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {547 await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);548 });549 550 itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {551 await testTokenPropertySetAndDeleted(helper, mode);552 });553});