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

difftreelog

source

tests/src/eth/events.test.ts20.0 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: 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});