git.delta.rocks / unique-network / refs/commits / d05c19b445d1

difftreelog

source

tests/src/eth/events.test.ts22.1 KiBsourcehistory
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});