git.delta.rocks / unique-network / refs/commits / 5811ea85a5fa

difftreelog

fmt

Trubnikov Sergey2022-12-09parent: #1a0647e.patch.diff
in: master

5 files changed

modifiedtests/src/eth/collectionSponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/eth/collectionSponsoring.test.ts
+++ b/tests/src/eth/collectionSponsoring.test.ts
@@ -161,19 +161,17 @@
       {
         const result = await collectionEvm.methods.mintWithTokenURI(user, 'Test URI').send({from: user});
         const event = helper.eth.normalizeEvents(result.events)
-        .find(event => event.event === 'Transfer');;
+          .find(event => event.event === 'Transfer');
   
-        expect(event).to.be.deep.equal(
-          {
-            address: collectionAddress,
-            event: 'Transfer',
-            args: {
-              from: '0x0000000000000000000000000000000000000000',
-              to: user,
-              tokenId: '1',
-            },
+        expect(event).to.be.deep.equal({
+          address: collectionAddress,
+          event: 'Transfer',
+          args: {
+            from: '0x0000000000000000000000000000000000000000',
+            to: user,
+            tokenId: '1',
           },
-        );
+        });
   
         const ownerBalanceAfter = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));
         const sponsorBalanceAfter = await helper.balance.getSubstrate(helper.address.ethToSubstrate(sponsorEth));
@@ -276,20 +274,18 @@
       const tokenId = mintingResult.events.Transfer.returnValues.tokenId;
   
       const event = helper.eth.normalizeEvents(mintingResult.events)
-      .find(event => event.event === 'Transfer');
+        .find(event => event.event === 'Transfer');
       const address = helper.ethAddress.fromCollectionId(collectionId);
   
-      expect(event).to.be.deep.equal(
-        {
-          address,
-          event: 'Transfer',
-          args: {
-            from: '0x0000000000000000000000000000000000000000',
-            to: user,
-            tokenId: '1',
-          },
+      expect(event).to.be.deep.equal({
+        address,
+        event: 'Transfer',
+        args: {
+          from: '0x0000000000000000000000000000000000000000',
+          to: user,
+          tokenId: '1',
         },
-      );
+      });
       expect(await collectionEvm.methods.tokenURI(tokenId).call({from: user})).to.be.equal('Test URI');
   
       const ownerBalanceAfter = await helper.balance.getSubstrate(helper.address.ethToSubstrate(owner));
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 { EthUniqueHelper, itEth, usingEthPlaygrounds } from './util';20import { TCollectionMode } from '../util/playgrounds/types';2122let donor: IKeyringPair;23  24before(async function () {25    await usingEthPlaygrounds(async (_helper, privateKey) => {26    donor = await privateKey({filename: __filename});27    });28});2930async function testCollectionCreatedAndDestroy(helper: EthUniqueHelper, mode: TCollectionMode) {31    const owner = await helper.eth.createAccountWithBalance(donor);32        const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionCreated', 'CollectionDestroyed']}]);33        const {collectionAddress, events: ethEvents} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');34        {35            expect(ethEvents).to.be.like([36                {37                    event: 'CollectionCreated',38                    args: {39                        owner: owner,40                        collectionId: collectionAddress41                    }42                }43            ]);44            expect(subEvents).to.be.like([{method: 'CollectionCreated'}]);45            ethEvents.pop();46            subEvents.pop();47        }48        {49            const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);50            let result = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner});51            expect(result.events).to.be.like({52                CollectionDestroyed: {53                    returnValues: {54                        collectionId: collectionAddress55                    }56                }57            });58            expect(subEvents).to.be.like([{method: 'CollectionDestroyed'}]);59        }60        unsubscribe();61}6263async function testCollectionPropertySetAndCollectionPropertyDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {64    const owner = await helper.eth.createAccountWithBalance(donor);65    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');66    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);67    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);68    69    let {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPropertySet', 'CollectionPropertyDeleted']}]);70    {71        const ethEvents: any = [];72        collectionHelper.events.allEvents((_: any, event: any) => {73            ethEvents.push(event);74        });75        await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner});76        expect(ethEvents).to.be.like([77            {78                event: 'CollectionChanged',79                returnValues: {80                    collectionId: collectionAddress81                }82            }83        ]);84        expect(subEvents).to.be.like([{method: 'CollectionPropertySet'}]);85        subEvents.pop();86    }87    {88        const ethEvents: any = [];89        collectionHelper.events.allEvents((_: any, event: any) => {90            ethEvents.push(event);91        });92        await collection.methods.deleteCollectionProperties(['A']).send({from:owner});93        expect(ethEvents).to.be.like([94            {95                event: 'CollectionChanged',96                returnValues: {97                    collectionId: collectionAddress98                }99            }100        ]);101        expect(subEvents).to.be.like([{method: 'CollectionPropertyDeleted'}]);102    }103    unsubscribe();104}105106async function testPropertyPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {107    const owner = await helper.eth.createAccountWithBalance(donor);108    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');109    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);110    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);111    const eethEvents: any = [];112    collectionHelper.events.allEvents((_: any, event: any) => {113        eethEvents.push(event);114    });115    const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]);116    await collection.methods.setTokenPropertyPermission('testKey', true, true, true).send({from: owner});117    expect(eethEvents).to.be.like([118        {119            event: 'CollectionChanged',120            returnValues: {121                collectionId: collectionAddress122            }123        }124    ]);125    expect(subEvents).to.be.like([{method: 'PropertyPermissionSet'}]);126    unsubscribe();127}128129async function testAllowListAddressAddedAndAllowListAddressRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {130    const owner = await helper.eth.createAccountWithBalance(donor);131        const user = helper.ethCrossAccount.createAccount();132        const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');133        const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);134        const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);135        const ethEvents: any[] = [];136        collectionHelper.events.allEvents((_: any, event: any) => {137            ethEvents.push(event);138        });139140        const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['AllowListAddressAdded', 'AllowListAddressRemoved']}]);141        {142            await collection.methods.addToCollectionAllowListCross(user).send({from: owner});143            expect(ethEvents).to.be.like([144                {145                    event: 'CollectionChanged',146                    returnValues: {147                        collectionId: collectionAddress148                    }149                }150            ]);151            expect(subEvents).to.be.like([{method: 'AllowListAddressAdded'}]);152            ethEvents.pop();153            subEvents.pop();154        }155        {156            await collection.methods.removeFromCollectionAllowListCross(user).send({from: owner});157            expect(ethEvents.length).to.be.eq(1);158            expect(ethEvents).to.be.like([159                {160                    event: 'CollectionChanged',161                    returnValues: {162                        collectionId: collectionAddress163                    }164                }165            ]);166            expect(subEvents).to.be.like([{method: 'AllowListAddressRemoved'}]);167        }168        unsubscribe();169}170171async function testCollectionAdminAddedAndCollectionAdminRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {172    const owner = await helper.eth.createAccountWithBalance(donor);173    const user = helper.ethCrossAccount.createAccount();174    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');175    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);176    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);177    const ethEvents: any = [];178    collectionHelper.events.allEvents((_: any, event: any) => {179        ethEvents.push(event);180    });181    const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionAdminAdded', 'CollectionAdminRemoved']}]);182    {183        await collection.methods.addCollectionAdminCross(user).send({from: owner});184        expect(ethEvents).to.be.like([185            {186                event: 'CollectionChanged',187                returnValues: {188                    collectionId: collectionAddress189                }190            }191        ]);192        expect(subEvents).to.be.like([{method: 'CollectionAdminAdded'}]);193        ethEvents.pop();194        subEvents.pop();195    }196    {197        await collection.methods.removeCollectionAdminCross(user).send({from: owner});198        expect(ethEvents).to.be.like([199            {200                event: 'CollectionChanged',201                returnValues: {202                    collectionId: collectionAddress203                }204            }205        ]);206        expect(subEvents).to.be.like([{method: 'CollectionAdminRemoved'}]);207    }208    unsubscribe();209}210211async function testCollectionLimitSet(helper: EthUniqueHelper, mode: TCollectionMode) {212    const owner = await helper.eth.createAccountWithBalance(donor);213    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');214    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);215    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);216    const ethEvents: any = [];217    collectionHelper.events.allEvents((_: any, event: any) => {218        ethEvents.push(event);219    });220    const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]);221    {222        await collection.methods.setCollectionLimit('ownerCanTransfer', 0n).send({from: owner});223        expect(ethEvents).to.be.like([224            {225                event: 'CollectionChanged',226                returnValues: {227                    collectionId: collectionAddress228                }229            }230        ]);231        expect(subEvents).to.be.like([{method: 'CollectionLimitSet'}]);232    }233    unsubscribe();234}235236async function testCollectionOwnedChanged(helper: EthUniqueHelper, mode: TCollectionMode) {237    const owner = await helper.eth.createAccountWithBalance(donor);238    const new_owner = helper.ethCrossAccount.createAccount();239    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');240    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);241    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);242    const ethEvents: any = [];243    collectionHelper.events.allEvents((_: any, event: any) => {244        ethEvents.push(event);245    });246    const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionOwnedChanged']}]);247    {248        await collection.methods.changeCollectionOwnerCross(new_owner).send({from: owner});249        expect(ethEvents).to.be.like([250            {251                event: 'CollectionChanged',252                returnValues: {253                    collectionId: collectionAddress254                }255            }256        ]);257        expect(subEvents).to.be.like([{method: 'CollectionOwnedChanged'}]);258    }259    unsubscribe();260}261262async function testCollectionPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {263    const owner = await helper.eth.createAccountWithBalance(donor);264    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');265    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);266    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);267    const ethEvents: any = [];268    collectionHelper.events.allEvents((_: any, event: any) => {269        ethEvents.push(event);270    });271    const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPermissionSet']}]);272    {273        await collection.methods.setCollectionMintMode(true).send({from: owner});274        expect(ethEvents).to.be.like([275            {276                event: 'CollectionChanged',277                returnValues: {278                    collectionId: collectionAddress279                }280            }281        ]);282        expect(subEvents).to.be.like([{method: 'CollectionPermissionSet'}]);283        ethEvents.pop();284        subEvents.pop();285    }286    {287        await collection.methods.setCollectionAccess(1).send({from: owner});288        expect(ethEvents).to.be.like([289            {290                event: 'CollectionChanged',291                returnValues: {292                    collectionId: collectionAddress293                }294            }295        ]);296        expect(subEvents).to.be.like([{method: 'CollectionPermissionSet'}]);297    }298    unsubscribe();299}300301async function testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {302    const owner = await helper.eth.createAccountWithBalance(donor);303        const sponsor = await helper.ethCrossAccount.createAccountWithBalance(donor);304        const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');305        const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);306        const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);307        const ethEvents: any = [];308        collectionHelper.events.allEvents((_: any, event: any) => {309            ethEvents.push(event);310        });311        const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{312            section: 'common', names: ['CollectionSponsorSet', 'SponsorshipConfirmed', 'CollectionSponsorRemoved'313        ]}]);314        {315            await collection.methods.setCollectionSponsorCross(sponsor).send({from: owner});316            expect(ethEvents).to.be.like([317                {318                    event: 'CollectionChanged',319                    returnValues: {320                        collectionId: collectionAddress321                    }322                }323            ]);324            expect(subEvents).to.be.like([{method: 'CollectionSponsorSet'}]);325            ethEvents.pop();326            subEvents.pop();327        }328        {329            await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});330            expect(ethEvents).to.be.like([331                {332                    event: 'CollectionChanged',333                    returnValues: {334                        collectionId: collectionAddress335                    }336                }337            ]);338            expect(subEvents).to.be.like([{method: 'SponsorshipConfirmed'}]);339            ethEvents.pop();340            subEvents.pop();341        }342        {343            await collection.methods.removeCollectionSponsor().send({from: owner});344            expect(ethEvents).to.be.like([345                {346                    event: 'CollectionChanged',347                    returnValues: {348                        collectionId: collectionAddress349                    }350                }351            ]);352            expect(subEvents).to.be.like([{method: 'CollectionSponsorRemoved'}]);353        }354        unsubscribe();355}356357async function testTokenPropertySetAndTokenPropertyDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {358    const owner = await helper.eth.createAccountWithBalance(donor);359    const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');360    const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);361    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);362    const result = await collection.methods.mint(owner).send({from: owner});363    const tokenId = result.events.Transfer.returnValues.tokenId;364    await collection.methods.setTokenPropertyPermission('A', true, true, true).send({from: owner});365366367    const ethEvents: any = [];368    collectionHelper.events.allEvents((_: any, event: any) => {369        ethEvents.push(event);370    });371    const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);372    {373        await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});374        expect(ethEvents).to.be.like([375            {376                event: 'TokenChanged',377                returnValues: {378                    collectionId: collectionAddress379                }380            }381        ]);382        expect(subEvents).to.be.like([{method: 'TokenPropertySet'}]);383        ethEvents.pop();384        subEvents.pop();385    }386    {387        await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});388        expect(ethEvents).to.be.like([389            {390                event: 'TokenChanged',391                returnValues: {392                    collectionId: collectionAddress393                }394            }395        ]);396        expect(subEvents).to.be.like([{method: 'TokenPropertyDeleted'}]);397    }398    unsubscribe();399}400401describe('[FT] Sync sub & eth events', () => {402    const mode: TCollectionMode = 'ft';403404    itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {405        await testCollectionCreatedAndDestroy(helper, mode);406    });407408    itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {409        await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);410    });411    412    itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {413        await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);414    });415    416    itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {417        await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);418    });419    420    itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {421        await testCollectionLimitSet(helper, mode);422    });423    424    itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {425        await testCollectionOwnedChanged(helper, mode);426    });427    428    itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {429        await testCollectionPermissionSet(helper, mode);430    });431432    itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {433        await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);434    });435});436437describe('[NFT] Sync sub & eth events', () => {438    const mode: TCollectionMode = 'nft';439440    itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {441        await testCollectionCreatedAndDestroy(helper, mode);442    });443444    itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {445        await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);446    });447    448    itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {449        await testPropertyPermissionSet(helper, mode);450    });451    452    itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {453        await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);454    });455    456    itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {457        await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);458    });459    460    itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {461        await testCollectionLimitSet(helper, mode);462    });463    464    itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {465        await testCollectionOwnedChanged(helper, mode);466    });467    468    itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {469        await testCollectionPermissionSet(helper, mode);470    });471472    itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {473        await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);474    });475     476    itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {477        await testTokenPropertySetAndTokenPropertyDeleted(helper, mode);478    });479});480481describe('[RFT] Sync sub & eth events', () => {482    const mode: TCollectionMode = 'rft';483484    itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {485        await testCollectionCreatedAndDestroy(helper, mode);486    });487488    itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {489        await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);490    });491    492    itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {493        await testPropertyPermissionSet(helper, mode);494    });495    496    itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {497        await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);498    });499    500    itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {501        await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);502    });503    504    itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {505        await testCollectionLimitSet(helper, mode);506    });507    508    itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {509        await testCollectionOwnedChanged(helper, mode);510    });511    512    itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {513        await testCollectionPermissionSet(helper, mode);514    });515516    itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {517        await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);518    });519     520    itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {521        await testTokenPropertySetAndTokenPropertyDeleted(helper, mode);522    });523});
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 {TCollectionMode} from '../util/playgrounds/types';2122let donor: IKeyringPair;23  24before(async function () {25  await usingEthPlaygrounds(async (_helper, privateKey) => {26    donor = await privateKey({filename: __filename});27  });28});2930async function testCollectionCreatedAndDestroy(helper: EthUniqueHelper, mode: TCollectionMode) {31  const owner = await helper.eth.createAccountWithBalance(donor);32  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionCreated', 'CollectionDestroyed']}]);33  const {collectionAddress, events: ethEvents} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');34  {35    expect(ethEvents).to.be.like([36      {37        event: 'CollectionCreated',38        args: {39          owner: owner,40          collectionId: collectionAddress,41        },42      },43    ]);44    expect(subEvents).to.be.like([{method: 'CollectionCreated'}]);45    ethEvents.pop();46    subEvents.pop();47  }48  {49    const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);50    const result = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner});51    expect(result.events).to.be.like({52      CollectionDestroyed: {53        returnValues: {54          collectionId: collectionAddress,55        },56      },57    });58    expect(subEvents).to.be.like([{method: 'CollectionDestroyed'}]);59  }60  unsubscribe();61}6263async function testCollectionPropertySetAndCollectionPropertyDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {64  const owner = await helper.eth.createAccountWithBalance(donor);65  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');66  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);67  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);68    69  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPropertySet', 'CollectionPropertyDeleted']}]);70  {71    const ethEvents: any = [];72    collectionHelper.events.allEvents((_: any, event: any) => {73      ethEvents.push(event);74    });75    await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner});76    expect(ethEvents).to.be.like([77      {78        event: 'CollectionChanged',79        returnValues: {80          collectionId: collectionAddress,81        },82      },83    ]);84    expect(subEvents).to.be.like([{method: 'CollectionPropertySet'}]);85    subEvents.pop();86  }87  {88    const ethEvents: any = [];89    collectionHelper.events.allEvents((_: any, event: any) => {90      ethEvents.push(event);91    });92    await collection.methods.deleteCollectionProperties(['A']).send({from:owner});93    expect(ethEvents).to.be.like([94      {95        event: 'CollectionChanged',96        returnValues: {97          collectionId: collectionAddress,98        },99      },100    ]);101    expect(subEvents).to.be.like([{method: 'CollectionPropertyDeleted'}]);102  }103  unsubscribe();104}105106async function testPropertyPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {107  const owner = await helper.eth.createAccountWithBalance(donor);108  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');109  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);110  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);111  const eethEvents: any = [];112  collectionHelper.events.allEvents((_: any, event: any) => {113    eethEvents.push(event);114  });115  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]);116  await collection.methods.setTokenPropertyPermission('testKey', true, true, true).send({from: owner});117  expect(eethEvents).to.be.like([118    {119      event: 'CollectionChanged',120      returnValues: {121        collectionId: collectionAddress,122      },123    },124  ]);125  expect(subEvents).to.be.like([{method: 'PropertyPermissionSet'}]);126  unsubscribe();127}128129async function testAllowListAddressAddedAndAllowListAddressRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {130  const owner = await helper.eth.createAccountWithBalance(donor);131  const user = helper.ethCrossAccount.createAccount();132  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');133  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);134  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);135  const ethEvents: any[] = [];136  collectionHelper.events.allEvents((_: any, event: any) => {137    ethEvents.push(event);138  });139140  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['AllowListAddressAdded', 'AllowListAddressRemoved']}]);141  {142    await collection.methods.addToCollectionAllowListCross(user).send({from: owner});143    expect(ethEvents).to.be.like([144      {145        event: 'CollectionChanged',146        returnValues: {147          collectionId: collectionAddress,148        },149      },150    ]);151    expect(subEvents).to.be.like([{method: 'AllowListAddressAdded'}]);152    ethEvents.pop();153    subEvents.pop();154  }155  {156    await collection.methods.removeFromCollectionAllowListCross(user).send({from: owner});157    expect(ethEvents.length).to.be.eq(1);158    expect(ethEvents).to.be.like([159      {160        event: 'CollectionChanged',161        returnValues: {162          collectionId: collectionAddress,163        },164      },165    ]);166    expect(subEvents).to.be.like([{method: 'AllowListAddressRemoved'}]);167  }168  unsubscribe();169}170171async function testCollectionAdminAddedAndCollectionAdminRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {172  const owner = await helper.eth.createAccountWithBalance(donor);173  const user = helper.ethCrossAccount.createAccount();174  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');175  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);176  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);177  const ethEvents: any = [];178  collectionHelper.events.allEvents((_: any, event: any) => {179    ethEvents.push(event);180  });181  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionAdminAdded', 'CollectionAdminRemoved']}]);182  {183    await collection.methods.addCollectionAdminCross(user).send({from: owner});184    expect(ethEvents).to.be.like([185      {186        event: 'CollectionChanged',187        returnValues: {188          collectionId: collectionAddress,189        },190      },191    ]);192    expect(subEvents).to.be.like([{method: 'CollectionAdminAdded'}]);193    ethEvents.pop();194    subEvents.pop();195  }196  {197    await collection.methods.removeCollectionAdminCross(user).send({from: owner});198    expect(ethEvents).to.be.like([199      {200        event: 'CollectionChanged',201        returnValues: {202          collectionId: collectionAddress,203        },204      },205    ]);206    expect(subEvents).to.be.like([{method: 'CollectionAdminRemoved'}]);207  }208  unsubscribe();209}210211async function testCollectionLimitSet(helper: EthUniqueHelper, mode: TCollectionMode) {212  const owner = await helper.eth.createAccountWithBalance(donor);213  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');214  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);215  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);216  const ethEvents: any = [];217  collectionHelper.events.allEvents((_: any, event: any) => {218    ethEvents.push(event);219  });220  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]);221  {222    await collection.methods.setCollectionLimit('ownerCanTransfer', 0n).send({from: owner});223    expect(ethEvents).to.be.like([224      {225        event: 'CollectionChanged',226        returnValues: {227          collectionId: collectionAddress,228        },229      },230    ]);231    expect(subEvents).to.be.like([{method: 'CollectionLimitSet'}]);232  }233  unsubscribe();234}235236async function testCollectionOwnedChanged(helper: EthUniqueHelper, mode: TCollectionMode) {237  const owner = await helper.eth.createAccountWithBalance(donor);238  const new_owner = helper.ethCrossAccount.createAccount();239  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');240  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);241  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);242  const ethEvents: any = [];243  collectionHelper.events.allEvents((_: any, event: any) => {244    ethEvents.push(event);245  });246  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionOwnedChanged']}]);247  {248    await collection.methods.changeCollectionOwnerCross(new_owner).send({from: owner});249    expect(ethEvents).to.be.like([250      {251        event: 'CollectionChanged',252        returnValues: {253          collectionId: collectionAddress,254        },255      },256    ]);257    expect(subEvents).to.be.like([{method: 'CollectionOwnedChanged'}]);258  }259  unsubscribe();260}261262async function testCollectionPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {263  const owner = await helper.eth.createAccountWithBalance(donor);264  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');265  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);266  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);267  const ethEvents: any = [];268  collectionHelper.events.allEvents((_: any, event: any) => {269    ethEvents.push(event);270  });271  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPermissionSet']}]);272  {273    await collection.methods.setCollectionMintMode(true).send({from: owner});274    expect(ethEvents).to.be.like([275      {276        event: 'CollectionChanged',277        returnValues: {278          collectionId: collectionAddress,279        },280      },281    ]);282    expect(subEvents).to.be.like([{method: 'CollectionPermissionSet'}]);283    ethEvents.pop();284    subEvents.pop();285  }286  {287    await collection.methods.setCollectionAccess(1).send({from: owner});288    expect(ethEvents).to.be.like([289      {290        event: 'CollectionChanged',291        returnValues: {292          collectionId: collectionAddress,293        },294      },295    ]);296    expect(subEvents).to.be.like([{method: 'CollectionPermissionSet'}]);297  }298  unsubscribe();299}300301async function testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {302  const owner = await helper.eth.createAccountWithBalance(donor);303  const sponsor = await helper.ethCrossAccount.createAccountWithBalance(donor);304  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');305  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);306  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);307  const ethEvents: any = [];308  collectionHelper.events.allEvents((_: any, event: any) => {309    ethEvents.push(event);310  });311  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{312    section: 'common', names: ['CollectionSponsorSet', 'SponsorshipConfirmed', 'CollectionSponsorRemoved',313    ]}]);314  {315    await collection.methods.setCollectionSponsorCross(sponsor).send({from: owner});316    expect(ethEvents).to.be.like([317      {318        event: 'CollectionChanged',319        returnValues: {320          collectionId: collectionAddress,321        },322      },323    ]);324    expect(subEvents).to.be.like([{method: 'CollectionSponsorSet'}]);325    ethEvents.pop();326    subEvents.pop();327  }328  {329    await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});330    expect(ethEvents).to.be.like([331      {332        event: 'CollectionChanged',333        returnValues: {334          collectionId: collectionAddress,335        },336      },337    ]);338    expect(subEvents).to.be.like([{method: 'SponsorshipConfirmed'}]);339    ethEvents.pop();340    subEvents.pop();341  }342  {343    await collection.methods.removeCollectionSponsor().send({from: owner});344    expect(ethEvents).to.be.like([345      {346        event: 'CollectionChanged',347        returnValues: {348          collectionId: collectionAddress,349        },350      },351    ]);352    expect(subEvents).to.be.like([{method: 'CollectionSponsorRemoved'}]);353  }354  unsubscribe();355}356357async function testTokenPropertySetAndTokenPropertyDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {358  const owner = await helper.eth.createAccountWithBalance(donor);359  const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');360  const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);361  const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);362  const result = await collection.methods.mint(owner).send({from: owner});363  const tokenId = result.events.Transfer.returnValues.tokenId;364  await collection.methods.setTokenPropertyPermission('A', true, true, true).send({from: owner});365366367  const ethEvents: any = [];368  collectionHelper.events.allEvents((_: any, event: any) => {369    ethEvents.push(event);370  });371  const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);372  {373    await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});374    expect(ethEvents).to.be.like([375      {376        event: 'TokenChanged',377        returnValues: {378          collectionId: collectionAddress,379        },380      },381    ]);382    expect(subEvents).to.be.like([{method: 'TokenPropertySet'}]);383    ethEvents.pop();384    subEvents.pop();385  }386  {387    await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});388    expect(ethEvents).to.be.like([389      {390        event: 'TokenChanged',391        returnValues: {392          collectionId: collectionAddress,393        },394      },395    ]);396    expect(subEvents).to.be.like([{method: 'TokenPropertyDeleted'}]);397  }398  unsubscribe();399}400401describe('[FT] Sync sub & eth events', () => {402  const mode: TCollectionMode = 'ft';403404  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {405    await testCollectionCreatedAndDestroy(helper, mode);406  });407408  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {409    await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);410  });411    412  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {413    await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);414  });415    416  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {417    await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);418  });419    420  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {421    await testCollectionLimitSet(helper, mode);422  });423    424  itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {425    await testCollectionOwnedChanged(helper, mode);426  });427    428  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {429    await testCollectionPermissionSet(helper, mode);430  });431432  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {433    await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);434  });435});436437describe('[NFT] Sync sub & eth events', () => {438  const mode: TCollectionMode = 'nft';439440  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {441    await testCollectionCreatedAndDestroy(helper, mode);442  });443444  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {445    await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);446  });447    448  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {449    await testPropertyPermissionSet(helper, mode);450  });451    452  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {453    await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);454  });455    456  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {457    await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);458  });459    460  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {461    await testCollectionLimitSet(helper, mode);462  });463    464  itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {465    await testCollectionOwnedChanged(helper, mode);466  });467    468  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {469    await testCollectionPermissionSet(helper, mode);470  });471472  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {473    await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);474  });475     476  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {477    await testTokenPropertySetAndTokenPropertyDeleted(helper, mode);478  });479});480481describe('[RFT] Sync sub & eth events', () => {482  const mode: TCollectionMode = 'rft';483484  itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {485    await testCollectionCreatedAndDestroy(helper, mode);486  });487488  itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {489    await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);490  });491    492  itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {493    await testPropertyPermissionSet(helper, mode);494  });495    496  itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {497    await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);498  });499    500  itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {501    await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);502  });503    504  itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {505    await testCollectionLimitSet(helper, mode);506  });507    508  itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {509    await testCollectionOwnedChanged(helper, mode);510  });511    512  itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {513    await testCollectionPermissionSet(helper, mode);514  });515516  itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {517    await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);518  });519     520  itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {521    await testTokenPropertySetAndTokenPropertyDeleted(helper, mode);522  });523});
modifiedtests/src/eth/proxy/nonFungibleProxy.test.tsdiffbeforeafterboth
--- a/tests/src/eth/proxy/nonFungibleProxy.test.ts
+++ b/tests/src/eth/proxy/nonFungibleProxy.test.ts
@@ -121,17 +121,15 @@
         .find(event => event.event === 'Transfer')!;
       event.address = event.address.toLocaleLowerCase();
 
-      expect(event).to.be.deep.equal(
-        {
-          address: collectionAddress.toLocaleLowerCase(),
-          event: 'Transfer',
-          args: {
-            from: '0x0000000000000000000000000000000000000000',
-            to: receiver,
-            tokenId,
-          },
+      expect(event).to.be.deep.equal({
+        address: collectionAddress.toLocaleLowerCase(),
+        event: 'Transfer',
+        args: {
+          from: '0x0000000000000000000000000000000000000000',
+          to: receiver,
+          tokenId,
         },
-      );
+      });
 
       expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');
     }
@@ -159,17 +157,15 @@
         .find(event => event.event === 'Transfer')!;
       event.address = event.address.toLocaleLowerCase();
 
-      expect(event).to.be.deep.equal(
-        {
-          address: collectionAddress.toLocaleLowerCase(),
-          event: 'Transfer',
-          args: {
-            from: '0x0000000000000000000000000000000000000000',
-            to: receiver,
-            tokenId,
-          },
+      expect(event).to.be.deep.equal({
+        address: collectionAddress.toLocaleLowerCase(),
+        event: 'Transfer',
+        args: {
+          from: '0x0000000000000000000000000000000000000000',
+          to: receiver,
+          tokenId,
         },
-      );
+      });
 
       expect(await contract.methods.tokenURI(tokenId).call()).to.be.equal('Test URI');
     }
modifiedtests/src/eth/util/playgrounds/unique.dev.tsdiffbeforeafterboth
--- a/tests/src/eth/util/playgrounds/unique.dev.ts
+++ b/tests/src/eth/util/playgrounds/unique.dev.ts
@@ -188,16 +188,16 @@
 
   createCollectionMethodName(mode: TCollectionMode) {
     switch (mode) {
-        case 'ft':
-            return 'createFTCollection';
-        case 'nft':
-            return 'createNFTCollection';
-        case 'rft':
-            return 'createRFTCollection';
+      case 'ft':
+        return 'createFTCollection';
+      case 'nft':
+        return 'createNFTCollection';
+      case 'rft':
+        return 'createRFTCollection';
     }
   }
 
-  async createCollection(mode: TCollectionMode, signer: string, name: string, description: string, tokenPrefix: string, decimals: number = 18): Promise<{ collectionId: number, collectionAddress: string, events: NormalizedEvent[] }> {
+  async createCollection(mode: TCollectionMode, signer: string, name: string, description: string, tokenPrefix: string, decimals = 18): Promise<{ collectionId: number, collectionAddress: string, events: NormalizedEvent[] }> {
     const collectionCreationPrice = this.helper.balance.getCollectionCreationPrice();
     const collectionHelper = this.helper.ethNativeContract.collectionHelpers(signer);
     const functionName: string = this.createCollectionMethodName(mode);
modifiedtests/src/util/playgrounds/unique.tsdiffbeforeafterboth
--- a/tests/src/util/playgrounds/unique.ts
+++ b/tests/src/util/playgrounds/unique.ts
@@ -44,7 +44,7 @@
 } from './types';
 import {RuntimeDispatchInfo} from '@polkadot/types/interfaces';
 import type {Vec} from '@polkadot/types-codec';
-import { FrameSystemEventRecord } from '@polkadot/types/lookup';
+import {FrameSystemEventRecord} from '@polkadot/types/lookup';
 
 export class CrossAccountId implements ICrossAccountId {
   Substrate?: TSubstrateAccount;
@@ -409,17 +409,17 @@
   async subscribeEvents(expectedEvents: {section: string, names: string[]}[]) {
     const collectedEvents: IEvent[] = [];
     const unsubscribe = await this.getApi().query.system.events((events: Vec<FrameSystemEventRecord>) => {
-        const ievents = this.eventHelper.extractEvents(events);
-        ievents.forEach((event) => {
-            expectedEvents.forEach((e => {
-                if (event.section === e.section && e.names.includes(event.method)) {
-                    collectedEvents.push(event);
-                }
-            }))
-        });
+      const ievents = this.eventHelper.extractEvents(events);
+      ievents.forEach((event) => {
+        expectedEvents.forEach((e => {
+          if (event.section === e.section && e.names.includes(event.method)) {
+            collectedEvents.push(event);
+          }
+        }));
+      });
     });
     return {unsubscribe: unsubscribe as any, collectedEvents};
-}
+  }
 
   clearChainLog(): void {
     this.chainLog = [];