git.delta.rocks / unique-network / refs/commits / 6dd2322471d4

difftreelog

refactor `collection_limits`, add docs for `CollectionLimits`

PraetorP2022-12-16parent: #07c2857.patch.diff
in: master

9 files changed

modifiedpallets/common/src/erc.rsdiffbeforeafterboth
--- a/pallets/common/src/erc.rs
+++ b/pallets/common/src/erc.rs
@@ -358,18 +358,16 @@
 			),
 			limits
 				.sponsored_data_rate_limit
-				.map(|limit| {
-					(
-						EvmCollectionLimits::SponsoredDataRateLimit,
-						match limit {
-							SponsoringRateLimit::Blocks(_) => true,
-							_ => false,
-						},
-						match limit {
-							SponsoringRateLimit::Blocks(blocks) => blocks.into(),
-							_ => Default::default(),
-						},
-					)
+				.and_then(|limit| {
+					if let SponsoringRateLimit::Blocks(blocks) = limit {
+						Some((
+							EvmCollectionLimits::SponsoredDataRateLimit,
+							true,
+							blocks.into(),
+						))
+					} else {
+						None
+					}
 				})
 				.unwrap_or((
 					EvmCollectionLimits::SponsoredDataRateLimit,
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -155,6 +155,8 @@
 		}
 	}
 }
+
+/// [`CollectionLimits`](up_data_structs::CollectionLimits) representation for EVM.
 #[derive(Debug, Default, Clone, Copy, AbiCoder)]
 #[repr(u8)]
 pub enum CollectionLimits {
modifiedtests/src/eth/collectionLimits.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionLimits.test.ts
+++ b/tests/src/eth/collectionLimits.test.ts
@@ -1,6 +1,7 @@
 import {IKeyringPair} from '@polkadot/types/types';
 import {Pallets} from '../util';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import {CollectionLimits} from './util/playgrounds/types';
 
 
 describe('Can set collection limits', () => {
@@ -62,15 +63,15 @@
       // Check limits from eth:
       const limitsEvm = await collectionEvm.methods.collectionLimits().call({from: owner});
       expect(limitsEvm).to.have.length(9);
-      expect(limitsEvm[0]).to.deep.eq(['0', true, limits.accountTokenOwnershipLimit.toString()]);
-      expect(limitsEvm[1]).to.deep.eq(['1', true, limits.sponsoredDataSize.toString()]);
-      expect(limitsEvm[2]).to.deep.eq(['2', true, limits.sponsoredDataRateLimit.toString()]);
-      expect(limitsEvm[3]).to.deep.eq(['3', true, limits.tokenLimit.toString()]);
-      expect(limitsEvm[4]).to.deep.eq(['4', true, limits.sponsorTransferTimeout.toString()]);
-      expect(limitsEvm[5]).to.deep.eq(['5', true, limits.sponsorApproveTimeout.toString()]);
-      expect(limitsEvm[6]).to.deep.eq(['6', true, limits.ownerCanTransfer.toString()]);
-      expect(limitsEvm[7]).to.deep.eq(['7', true, limits.ownerCanDestroy.toString()]);
-      expect(limitsEvm[8]).to.deep.eq(['8', true, limits.transfersEnabled.toString()]);
+      expect(limitsEvm[0]).to.deep.eq([CollectionLimits.AccountTokenOwnership.toString(), true, limits.accountTokenOwnershipLimit.toString()]);
+      expect(limitsEvm[1]).to.deep.eq([CollectionLimits.SponsoredDataSize.toString(), true, limits.sponsoredDataSize.toString()]);
+      expect(limitsEvm[2]).to.deep.eq([CollectionLimits.SponsoredDataRateLimit.toString(), true, limits.sponsoredDataRateLimit.toString()]);
+      expect(limitsEvm[3]).to.deep.eq([CollectionLimits.TokenLimit.toString(), true, limits.tokenLimit.toString()]);
+      expect(limitsEvm[4]).to.deep.eq([CollectionLimits.SponsorTransferTimeout.toString(), true, limits.sponsorTransferTimeout.toString()]);
+      expect(limitsEvm[5]).to.deep.eq([CollectionLimits.SponsorApproveTimeout.toString(), true, limits.sponsorApproveTimeout.toString()]);
+      expect(limitsEvm[6]).to.deep.eq([CollectionLimits.OwnerCanTransfer.toString(), true, limits.ownerCanTransfer.toString()]);
+      expect(limitsEvm[7]).to.deep.eq([CollectionLimits.OwnerCanDestroy.toString(), true, limits.ownerCanDestroy.toString()]);
+      expect(limitsEvm[8]).to.deep.eq([CollectionLimits.TransferEnabled.toString(), true, limits.transfersEnabled.toString()]);
     }));
 });
 
modifiedtests/src/eth/createFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createFTCollection.test.ts
+++ b/tests/src/eth/createFTCollection.test.ts
@@ -17,7 +17,8 @@
 import {IKeyringPair} from '@polkadot/types/types';
 import {evmToAddress} from '@polkadot/util-crypto';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import { CollectionLimits } from './util/playgrounds/types';
 
 const DECIMALS = 18;
 
modifiedtests/src/eth/createNFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createNFTCollection.test.ts
+++ b/tests/src/eth/createNFTCollection.test.ts
@@ -16,7 +16,8 @@
 
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import { CollectionLimits } from './util/playgrounds/types';
 
 
 describe('Create NFT collection from EVM', () => {
modifiedtests/src/eth/createRFTCollection.test.tsdiffbeforeafterboth
--- a/tests/src/eth/createRFTCollection.test.ts
+++ b/tests/src/eth/createRFTCollection.test.ts
@@ -17,7 +17,8 @@
 import {evmToAddress} from '@polkadot/util-crypto';
 import {IKeyringPair} from '@polkadot/types/types';
 import {Pallets, requirePalletsOrSkip} from '../util';
-import {CollectionLimits, expect, itEth, usingEthPlaygrounds} from './util';
+import {expect, itEth, usingEthPlaygrounds} from './util';
+import { CollectionLimits } from './util/playgrounds/types';
 
 
 describe('Create RFT collection from EVM', () => {
modifiedtests/src/eth/events.test.tsdiffbeforeafterboth
before · tests/src/eth/events.test.ts
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 {CollectionLimits, EthUniqueHelper, itEth, usingEthPlaygrounds} from './util';20import {IEvent, TCollectionMode} from '../util/playgrounds/types';21import {Pallets, requirePalletsOrSkip} from '../util';22import {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.be.like([44      {45        event: 'CollectionCreated',46        args: {47          owner: owner,48          collectionId: collectionAddress,49        },50      },51    ]);52    expect(subEvents).to.be.like([{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.be.like({60      CollectionDestroyed: {61        returnValues: {62          collectionId: collectionAddress,63        },64      },65    });66    expect(subEvents).to.be.like([{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.be.like([86      {87        event: 'CollectionChanged',88        returnValues: {89          collectionId: collectionAddress,90        },91      },92    ]);93    expect(subEvents).to.be.like([{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.be.like([100      {101        event: 'CollectionChanged',102        returnValues: {103          collectionId: collectionAddress,104        },105      },106    ]);107    expect(subEvents).to.be.like([{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.be.like([131    {132      event: 'CollectionChanged',133      returnValues: {134        collectionId: collectionAddress,135      },136    },137  ]);138  expect(subEvents).to.be.like([{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.be.like([158      {159        event: 'CollectionChanged',160        returnValues: {161          collectionId: collectionAddress,162        },163      },164    ]);165    expect(subEvents).to.be.like([{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.be.like([173      {174        event: 'CollectionChanged',175        returnValues: {176          collectionId: collectionAddress,177        },178      },179    ]);180    expect(subEvents).to.be.like([{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.be.like([200      {201        event: 'CollectionChanged',202        returnValues: {203          collectionId: collectionAddress,204        },205      },206    ]);207    expect(subEvents).to.be.like([{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.be.like([214      {215        event: 'CollectionChanged',216        returnValues: {217          collectionId: collectionAddress,218        },219      },220    ]);221    expect(subEvents).to.be.like([{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.be.like([240      {241        event: 'CollectionChanged',242        returnValues: {243          collectionId: collectionAddress,244        },245      },246    ]);247    expect(subEvents).to.be.like([{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.be.like([267      {268        event: 'CollectionChanged',269        returnValues: {270          collectionId: collectionAddress,271        },272      },273    ]);274    expect(subEvents).to.be.like([{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.be.like([293      {294        event: 'CollectionChanged',295        returnValues: {296          collectionId: collectionAddress,297        },298      },299    ]);300    expect(subEvents).to.be.like([{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.be.like([307      {308        event: 'CollectionChanged',309        returnValues: {310          collectionId: collectionAddress,311        },312      },313    ]);314    expect(subEvents).to.be.like([{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 = await 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.be.like([336      {337        event: 'CollectionChanged',338        returnValues: {339          collectionId: collectionAddress,340        },341      },342    ]);343    expect(subEvents).to.be.like([{method: 'CollectionSponsorSet'}]);344    clearEvents(ethEvents, subEvents);345  }346  {347    await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});348    await helper.wait.newBlocks(1);349    expect(ethEvents).to.be.like([350      {351        event: 'CollectionChanged',352        returnValues: {353          collectionId: collectionAddress,354        },355      },356    ]);357    expect(subEvents).to.be.like([{method: 'SponsorshipConfirmed'}]);358    clearEvents(ethEvents, subEvents);359  }360  {361    await collection.methods.removeCollectionSponsor().send({from: owner});362    await helper.wait.newBlocks(1);363    expect(ethEvents).to.be.like([364      {365        event: 'CollectionChanged',366        returnValues: {367          collectionId: collectionAddress,368        },369      },370    ]);371    expect(subEvents).to.be.like([{method: 'CollectionSponsorRemoved'}]);372  }373  unsubscribe();374}375376async function testTokenPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {377  const owner = await helper.eth.createAccountWithBalance(donor);378  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');379  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);380  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);381  const result = await collection.methods.mint(owner).send({from: owner});382  const tokenId = result.events.Transfer.returnValues.tokenId;383  await collection.methods.setTokenPropertyPermissions([384    ['A', [385      [EthTokenPermissions.Mutable, true], 386      [EthTokenPermissions.TokenOwner, true], 387      [EthTokenPermissions.CollectionAdmin, true]],388    ],389  ]).send({from: owner});390391392  const ethEvents: any = [];393  collectionHelper.events.allEvents((_: any, event: any) => {394    ethEvents.push(event);395  });396  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);397  {398    await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});399    await helper.wait.newBlocks(1);400    expect(ethEvents).to.be.like([401      {402        event: 'TokenChanged',403        returnValues: {404          collectionId: collectionAddress,405        },406      },407    ]);408    expect(subEvents).to.be.like([{method: 'TokenPropertySet'}]);409    clearEvents(ethEvents, subEvents);410  }411  {412    await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});413    await helper.wait.newBlocks(1);414    expect(ethEvents).to.be.like([415      {416        event: 'TokenChanged',417        returnValues: {418          collectionId: collectionAddress,419        },420      },421    ]);422    expect(subEvents).to.be.like([{method: 'TokenPropertyDeleted'}]);423  }424  unsubscribe();425}426427describe('[FT] Sync sub & eth events', () => {428  const mode: TCollectionMode = 'ft';429430  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {431    await testCollectionCreatedAndDestroy(helper, mode);432  });433434  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {435    await testCollectionPropertySetAndDeleted(helper, mode);436  });437    438  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {439    await testAllowListAddressAddedAndRemoved(helper, mode);440  });441    442  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {443    await testCollectionAdminAddedAndRemoved(helper, mode);444  });445    446  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {447    await testCollectionLimitSet(helper, mode);448  });449    450  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {451    await testCollectionOwnerChanged(helper, mode);452  });453    454  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {455    await testCollectionPermissionSet(helper, mode);456  });457458  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {459    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);460  });461});462463describe('[NFT] Sync sub & eth events', () => {464  const mode: TCollectionMode = 'nft';465466  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {467    await testCollectionCreatedAndDestroy(helper, mode);468  });469470  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {471    await testCollectionPropertySetAndDeleted(helper, mode);472  });473    474  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {475    await testPropertyPermissionSet(helper, mode);476  });477    478  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {479    await testAllowListAddressAddedAndRemoved(helper, mode);480  });481    482  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {483    await testCollectionAdminAddedAndRemoved(helper, mode);484  });485    486  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {487    await testCollectionLimitSet(helper, mode);488  });489    490  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {491    await testCollectionOwnerChanged(helper, mode);492  });493    494  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {495    await testCollectionPermissionSet(helper, mode);496  });497498  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {499    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);500  });501     502  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {503    await testTokenPropertySetAndDeleted(helper, mode);504  });505});506507describe('[RFT] Sync sub & eth events', () => {508  const mode: TCollectionMode = 'rft';509510  before(async function() {511    await usingEthPlaygrounds(async (helper, privateKey) => {512      requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);513      const _donor = await privateKey({filename: __filename});514    });515  });516517  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {518    await testCollectionCreatedAndDestroy(helper, mode);519  });520521  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {522    await testCollectionPropertySetAndDeleted(helper, mode);523  });524    525  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {526    await testPropertyPermissionSet(helper, mode);527  });528    529  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {530    await testAllowListAddressAddedAndRemoved(helper, mode);531  });532    533  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {534    await testCollectionAdminAddedAndRemoved(helper, mode);535  });536    537  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {538    await testCollectionLimitSet(helper, mode);539  });540    541  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {542    await testCollectionOwnerChanged(helper, mode);543  });544    545  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {546    await testCollectionPermissionSet(helper, mode);547  });548549  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {550    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);551  });552     553  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {554    await testTokenPropertySetAndDeleted(helper, mode);555  });556});
after · tests/src/eth/events.test.ts
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.be.like([44      {45        event: 'CollectionCreated',46        args: {47          owner: owner,48          collectionId: collectionAddress,49        },50      },51    ]);52    expect(subEvents).to.be.like([{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.be.like({60      CollectionDestroyed: {61        returnValues: {62          collectionId: collectionAddress,63        },64      },65    });66    expect(subEvents).to.be.like([{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.be.like([86      {87        event: 'CollectionChanged',88        returnValues: {89          collectionId: collectionAddress,90        },91      },92    ]);93    expect(subEvents).to.be.like([{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.be.like([100      {101        event: 'CollectionChanged',102        returnValues: {103          collectionId: collectionAddress,104        },105      },106    ]);107    expect(subEvents).to.be.like([{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.be.like([131    {132      event: 'CollectionChanged',133      returnValues: {134        collectionId: collectionAddress,135      },136    },137  ]);138  expect(subEvents).to.be.like([{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.be.like([158      {159        event: 'CollectionChanged',160        returnValues: {161          collectionId: collectionAddress,162        },163      },164    ]);165    expect(subEvents).to.be.like([{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.be.like([173      {174        event: 'CollectionChanged',175        returnValues: {176          collectionId: collectionAddress,177        },178      },179    ]);180    expect(subEvents).to.be.like([{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.be.like([200      {201        event: 'CollectionChanged',202        returnValues: {203          collectionId: collectionAddress,204        },205      },206    ]);207    expect(subEvents).to.be.like([{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.be.like([214      {215        event: 'CollectionChanged',216        returnValues: {217          collectionId: collectionAddress,218        },219      },220    ]);221    expect(subEvents).to.be.like([{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.be.like([240      {241        event: 'CollectionChanged',242        returnValues: {243          collectionId: collectionAddress,244        },245      },246    ]);247    expect(subEvents).to.be.like([{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.be.like([267      {268        event: 'CollectionChanged',269        returnValues: {270          collectionId: collectionAddress,271        },272      },273    ]);274    expect(subEvents).to.be.like([{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.be.like([293      {294        event: 'CollectionChanged',295        returnValues: {296          collectionId: collectionAddress,297        },298      },299    ]);300    expect(subEvents).to.be.like([{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.be.like([307      {308        event: 'CollectionChanged',309        returnValues: {310          collectionId: collectionAddress,311        },312      },313    ]);314    expect(subEvents).to.be.like([{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 = await 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.be.like([336      {337        event: 'CollectionChanged',338        returnValues: {339          collectionId: collectionAddress,340        },341      },342    ]);343    expect(subEvents).to.be.like([{method: 'CollectionSponsorSet'}]);344    clearEvents(ethEvents, subEvents);345  }346  {347    await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});348    await helper.wait.newBlocks(1);349    expect(ethEvents).to.be.like([350      {351        event: 'CollectionChanged',352        returnValues: {353          collectionId: collectionAddress,354        },355      },356    ]);357    expect(subEvents).to.be.like([{method: 'SponsorshipConfirmed'}]);358    clearEvents(ethEvents, subEvents);359  }360  {361    await collection.methods.removeCollectionSponsor().send({from: owner});362    await helper.wait.newBlocks(1);363    expect(ethEvents).to.be.like([364      {365        event: 'CollectionChanged',366        returnValues: {367          collectionId: collectionAddress,368        },369      },370    ]);371    expect(subEvents).to.be.like([{method: 'CollectionSponsorRemoved'}]);372  }373  unsubscribe();374}375376async function testTokenPropertySetAndDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {377  const owner = await helper.eth.createAccountWithBalance(donor);378  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');379  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);380  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);381  const result = await collection.methods.mint(owner).send({from: owner});382  const tokenId = result.events.Transfer.returnValues.tokenId;383  await collection.methods.setTokenPropertyPermissions([384    ['A', [385      [EthTokenPermissions.Mutable, true], 386      [EthTokenPermissions.TokenOwner, true], 387      [EthTokenPermissions.CollectionAdmin, true]],388    ],389  ]).send({from: owner});390391392  const ethEvents: any = [];393  collectionHelper.events.allEvents((_: any, event: any) => {394    ethEvents.push(event);395  });396  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);397  {398    await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});399    await helper.wait.newBlocks(1);400    expect(ethEvents).to.be.like([401      {402        event: 'TokenChanged',403        returnValues: {404          collectionId: collectionAddress,405        },406      },407    ]);408    expect(subEvents).to.be.like([{method: 'TokenPropertySet'}]);409    clearEvents(ethEvents, subEvents);410  }411  {412    await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});413    await helper.wait.newBlocks(1);414    expect(ethEvents).to.be.like([415      {416        event: 'TokenChanged',417        returnValues: {418          collectionId: collectionAddress,419        },420      },421    ]);422    expect(subEvents).to.be.like([{method: 'TokenPropertyDeleted'}]);423  }424  unsubscribe();425}426427describe('[FT] Sync sub & eth events', () => {428  const mode: TCollectionMode = 'ft';429430  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {431    await testCollectionCreatedAndDestroy(helper, mode);432  });433434  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {435    await testCollectionPropertySetAndDeleted(helper, mode);436  });437    438  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {439    await testAllowListAddressAddedAndRemoved(helper, mode);440  });441    442  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {443    await testCollectionAdminAddedAndRemoved(helper, mode);444  });445    446  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {447    await testCollectionLimitSet(helper, mode);448  });449    450  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {451    await testCollectionOwnerChanged(helper, mode);452  });453    454  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {455    await testCollectionPermissionSet(helper, mode);456  });457458  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {459    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);460  });461});462463describe('[NFT] Sync sub & eth events', () => {464  const mode: TCollectionMode = 'nft';465466  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {467    await testCollectionCreatedAndDestroy(helper, mode);468  });469470  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {471    await testCollectionPropertySetAndDeleted(helper, mode);472  });473    474  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {475    await testPropertyPermissionSet(helper, mode);476  });477    478  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {479    await testAllowListAddressAddedAndRemoved(helper, mode);480  });481    482  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {483    await testCollectionAdminAddedAndRemoved(helper, mode);484  });485    486  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {487    await testCollectionLimitSet(helper, mode);488  });489    490  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {491    await testCollectionOwnerChanged(helper, mode);492  });493    494  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {495    await testCollectionPermissionSet(helper, mode);496  });497498  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {499    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);500  });501     502  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {503    await testTokenPropertySetAndDeleted(helper, mode);504  });505});506507describe('[RFT] Sync sub & eth events', () => {508  const mode: TCollectionMode = 'rft';509510  before(async function() {511    await usingEthPlaygrounds(async (helper, privateKey) => {512      requirePalletsOrSkip(this, helper, [Pallets.ReFungible]);513      const _donor = await privateKey({filename: __filename});514    });515  });516517  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {518    await testCollectionCreatedAndDestroy(helper, mode);519  });520521  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {522    await testCollectionPropertySetAndDeleted(helper, mode);523  });524    525  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {526    await testPropertyPermissionSet(helper, mode);527  });528    529  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {530    await testAllowListAddressAddedAndRemoved(helper, mode);531  });532    533  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {534    await testCollectionAdminAddedAndRemoved(helper, mode);535  });536    537  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {538    await testCollectionLimitSet(helper, mode);539  });540    541  itEth('CollectionChanged event for CollectionOwnerChanged', async ({helper}) => {542    await testCollectionOwnerChanged(helper, mode);543  });544    545  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {546    await testCollectionPermissionSet(helper, mode);547  });548549  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {550    await testCollectionSponsorSetAndConfirmedAndThenRemoved(helper, mode);551  });552     553  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {554    await testTokenPropertySetAndDeleted(helper, mode);555  });556});
modifiedtests/src/eth/util/index.tsdiffbeforeafterboth
--- a/tests/src/eth/util/index.ts
+++ b/tests/src/eth/util/index.ts
@@ -26,18 +26,8 @@
   Allowlisted = 1,
   Generous = 2,
 }
-export enum CollectionLimits {
-  AccountTokenOwnership,
-	SponsoredDataSize,
-	SponsoredDataRateLimit,
-	TokenLimit,
-	SponsorTransferTimeout,
-	SponsorApproveTimeout,
-	OwnerCanTransfer,
-	OwnerCanDestroy,
-	TransferEnabled
-}
 
+
 export const usingEthPlaygrounds = async (code: (helper: EthUniqueHelper, privateKey: (seed: string | {filename: string}) => Promise<IKeyringPair>) => Promise<void>) => {
   const silentConsole = new SilentConsole();
   silentConsole.enable();
modifiedtests/src/eth/util/playgrounds/types.tsdiffbeforeafterboth
--- a/tests/src/eth/util/playgrounds/types.ts
+++ b/tests/src/eth/util/playgrounds/types.ts
@@ -24,4 +24,15 @@
   Mutable,
   TokenOwner,
   CollectionAdmin
-}
\ No newline at end of file
+}
+export enum CollectionLimits {
+  AccountTokenOwnership,
+	SponsoredDataSize,
+	SponsoredDataRateLimit,
+	TokenLimit,
+	SponsorTransferTimeout,
+	SponsorApproveTimeout,
+	OwnerCanTransfer,
+	OwnerCanDestroy,
+	TransferEnabled
+}