1234567891011121314151617import {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 await helper.wait.newBlocks(1);35 {36 expect(ethEvents).to.be.like([37 {38 event: 'CollectionCreated',39 args: {40 owner: owner,41 collectionId: collectionAddress,42 },43 },44 ]);45 expect(subEvents).to.be.like([{method: 'CollectionCreated'}]);46 ethEvents.pop();47 subEvents.pop();48 }49 {50 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);51 const result = await collectionHelper.methods.destroyCollection(collectionAddress).send({from:owner});52 await helper.wait.newBlocks(1);53 expect(result.events).to.be.like({54 CollectionDestroyed: {55 returnValues: {56 collectionId: collectionAddress,57 },58 },59 });60 expect(subEvents).to.be.like([{method: 'CollectionDestroyed'}]);61 }62 unsubscribe();63}6465async function testCollectionPropertySetAndCollectionPropertyDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {66 const owner = await helper.eth.createAccountWithBalance(donor);67 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');68 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);69 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);70 71 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPropertySet', 'CollectionPropertyDeleted']}]);72 {73 const ethEvents: any = [];74 collectionHelper.events.allEvents((_: any, event: any) => {75 ethEvents.push(event);76 });77 await collection.methods.setCollectionProperties([{key: 'A', value: [0,1,2,3]}]).send({from:owner});78 await helper.wait.newBlocks(1);79 expect(ethEvents).to.be.like([80 {81 event: 'CollectionChanged',82 returnValues: {83 collectionId: collectionAddress,84 },85 },86 ]);87 expect(subEvents).to.be.like([{method: 'CollectionPropertySet'}]);88 subEvents.pop();89 }90 {91 const ethEvents: any = [];92 collectionHelper.events.allEvents((_: any, event: any) => {93 ethEvents.push(event);94 });95 await collection.methods.deleteCollectionProperties(['A']).send({from:owner});96 await helper.wait.newBlocks(1);97 expect(ethEvents).to.be.like([98 {99 event: 'CollectionChanged',100 returnValues: {101 collectionId: collectionAddress,102 },103 },104 ]);105 expect(subEvents).to.be.like([{method: 'CollectionPropertyDeleted'}]);106 }107 unsubscribe();108}109110async function testPropertyPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {111 const owner = await helper.eth.createAccountWithBalance(donor);112 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');113 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);114 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);115 const eethEvents: any = [];116 collectionHelper.events.allEvents((_: any, event: any) => {117 eethEvents.push(event);118 });119 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['PropertyPermissionSet']}]);120 await collection.methods.setTokenPropertyPermission('testKey', true, true, true).send({from: owner});121 await helper.wait.newBlocks(1);122 expect(eethEvents).to.be.like([123 {124 event: 'CollectionChanged',125 returnValues: {126 collectionId: collectionAddress,127 },128 },129 ]);130 expect(subEvents).to.be.like([{method: 'PropertyPermissionSet'}]);131 unsubscribe();132}133134async function testAllowListAddressAddedAndAllowListAddressRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {135 const owner = await helper.eth.createAccountWithBalance(donor);136 const user = helper.ethCrossAccount.createAccount();137 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');138 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);139 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);140 const ethEvents: any[] = [];141 collectionHelper.events.allEvents((_: any, event: any) => {142 ethEvents.push(event);143 });144145 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['AllowListAddressAdded', 'AllowListAddressRemoved']}]);146 {147 await collection.methods.addToCollectionAllowListCross(user).send({from: owner});148 await helper.wait.newBlocks(1);149 expect(ethEvents).to.be.like([150 {151 event: 'CollectionChanged',152 returnValues: {153 collectionId: collectionAddress,154 },155 },156 ]);157 expect(subEvents).to.be.like([{method: 'AllowListAddressAdded'}]);158 ethEvents.pop();159 subEvents.pop();160 }161 {162 await collection.methods.removeFromCollectionAllowListCross(user).send({from: owner});163 await helper.wait.newBlocks(1);164 expect(ethEvents.length).to.be.eq(1);165 expect(ethEvents).to.be.like([166 {167 event: 'CollectionChanged',168 returnValues: {169 collectionId: collectionAddress,170 },171 },172 ]);173 expect(subEvents).to.be.like([{method: 'AllowListAddressRemoved'}]);174 }175 unsubscribe();176}177178async function testCollectionAdminAddedAndCollectionAdminRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {179 const owner = await helper.eth.createAccountWithBalance(donor);180 const user = helper.ethCrossAccount.createAccount();181 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');182 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);183 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);184 const ethEvents: any = [];185 collectionHelper.events.allEvents((_: any, event: any) => {186 ethEvents.push(event);187 });188 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionAdminAdded', 'CollectionAdminRemoved']}]);189 {190 await collection.methods.addCollectionAdminCross(user).send({from: owner});191 await helper.wait.newBlocks(1);192 expect(ethEvents).to.be.like([193 {194 event: 'CollectionChanged',195 returnValues: {196 collectionId: collectionAddress,197 },198 },199 ]);200 expect(subEvents).to.be.like([{method: 'CollectionAdminAdded'}]);201 ethEvents.pop();202 subEvents.pop();203 }204 {205 await collection.methods.removeCollectionAdminCross(user).send({from: owner});206 await helper.wait.newBlocks(1);207 expect(ethEvents).to.be.like([208 {209 event: 'CollectionChanged',210 returnValues: {211 collectionId: collectionAddress,212 },213 },214 ]);215 expect(subEvents).to.be.like([{method: 'CollectionAdminRemoved'}]);216 }217 unsubscribe();218}219220async function testCollectionLimitSet(helper: EthUniqueHelper, mode: TCollectionMode) {221 const owner = await helper.eth.createAccountWithBalance(donor);222 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');223 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);224 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);225 const ethEvents: any = [];226 collectionHelper.events.allEvents((_: any, event: any) => {227 ethEvents.push(event);228 });229 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionLimitSet']}]);230 {231 await collection.methods.setCollectionLimit('ownerCanTransfer', 0n).send({from: owner});232 await helper.wait.newBlocks(1);233 expect(ethEvents).to.be.like([234 {235 event: 'CollectionChanged',236 returnValues: {237 collectionId: collectionAddress,238 },239 },240 ]);241 expect(subEvents).to.be.like([{method: 'CollectionLimitSet'}]);242 }243 unsubscribe();244}245246async function testCollectionOwnedChanged(helper: EthUniqueHelper, mode: TCollectionMode) {247 const owner = await helper.eth.createAccountWithBalance(donor);248 const new_owner = helper.ethCrossAccount.createAccount();249 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');250 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);251 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);252 const ethEvents: any = [];253 collectionHelper.events.allEvents((_: any, event: any) => {254 ethEvents.push(event);255 });256 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionOwnedChanged']}]);257 {258 await collection.methods.changeCollectionOwnerCross(new_owner).send({from: owner});259 await helper.wait.newBlocks(1);260 expect(ethEvents).to.be.like([261 {262 event: 'CollectionChanged',263 returnValues: {264 collectionId: collectionAddress,265 },266 },267 ]);268 expect(subEvents).to.be.like([{method: 'CollectionOwnedChanged'}]);269 }270 unsubscribe();271}272273async function testCollectionPermissionSet(helper: EthUniqueHelper, mode: TCollectionMode) {274 const owner = await helper.eth.createAccountWithBalance(donor);275 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');276 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);277 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);278 const ethEvents: any = [];279 collectionHelper.events.allEvents((_: any, event: any) => {280 ethEvents.push(event);281 });282 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['CollectionPermissionSet']}]);283 {284 await collection.methods.setCollectionMintMode(true).send({from: owner});285 await helper.wait.newBlocks(1);286 expect(ethEvents).to.be.like([287 {288 event: 'CollectionChanged',289 returnValues: {290 collectionId: collectionAddress,291 },292 },293 ]);294 expect(subEvents).to.be.like([{method: 'CollectionPermissionSet'}]);295 ethEvents.pop();296 subEvents.pop();297 }298 {299 await collection.methods.setCollectionAccess(1).send({from: owner});300 await helper.wait.newBlocks(1);301 expect(ethEvents).to.be.like([302 {303 event: 'CollectionChanged',304 returnValues: {305 collectionId: collectionAddress,306 },307 },308 ]);309 expect(subEvents).to.be.like([{method: 'CollectionPermissionSet'}]);310 }311 unsubscribe();312}313314async function testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper: EthUniqueHelper, mode: TCollectionMode) {315 const owner = await helper.eth.createAccountWithBalance(donor);316 const sponsor = await helper.ethCrossAccount.createAccountWithBalance(donor);317 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');318 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);319 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);320 const ethEvents: any = [];321 collectionHelper.events.allEvents((_: any, event: any) => {322 ethEvents.push(event);323 });324 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{325 section: 'common', names: ['CollectionSponsorSet', 'SponsorshipConfirmed', 'CollectionSponsorRemoved',326 ]}]);327 {328 await collection.methods.setCollectionSponsorCross(sponsor).send({from: owner});329 await helper.wait.newBlocks(1);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: 'CollectionSponsorSet'}]);339 ethEvents.pop();340 subEvents.pop();341 }342 {343 await collection.methods.confirmCollectionSponsorship().send({from: sponsor.eth});344 await helper.wait.newBlocks(1);345 expect(ethEvents).to.be.like([346 {347 event: 'CollectionChanged',348 returnValues: {349 collectionId: collectionAddress,350 },351 },352 ]);353 expect(subEvents).to.be.like([{method: 'SponsorshipConfirmed'}]);354 ethEvents.pop();355 subEvents.pop();356 }357 {358 await collection.methods.removeCollectionSponsor().send({from: owner});359 expect(ethEvents).to.be.like([360 {361 event: 'CollectionChanged',362 returnValues: {363 collectionId: collectionAddress,364 },365 },366 ]);367 expect(subEvents).to.be.like([{method: 'CollectionSponsorRemoved'}]);368 }369 unsubscribe();370}371372async function testTokenPropertySetAndTokenPropertyDeleted(helper: EthUniqueHelper, mode: TCollectionMode) {373 const owner = await helper.eth.createAccountWithBalance(donor);374 const {collectionAddress} = await helper.eth.createCollection(mode, owner, 'A', 'B', 'C');375 const collection = await helper.ethNativeContract.collection(collectionAddress, mode, owner);376 const collectionHelper = helper.ethNativeContract.collectionHelpers(owner);377 const result = await collection.methods.mint(owner).send({from: owner});378 const tokenId = result.events.Transfer.returnValues.tokenId;379 await collection.methods.setTokenPropertyPermission('A', true, true, true).send({from: owner});380381382 const ethEvents: any = [];383 collectionHelper.events.allEvents((_: any, event: any) => {384 ethEvents.push(event);385 });386 const {unsubscribe, collectedEvents: subEvents} = await helper.subscribeEvents([{section: 'common', names: ['TokenPropertySet', 'TokenPropertyDeleted']}]);387 {388 await collection.methods.setProperties(tokenId, [{key: 'A', value: [1,2,3]}]).send({from: owner});389 await helper.wait.newBlocks(1);390 expect(ethEvents).to.be.like([391 {392 event: 'TokenChanged',393 returnValues: {394 collectionId: collectionAddress,395 },396 },397 ]);398 expect(subEvents).to.be.like([{method: 'TokenPropertySet'}]);399 ethEvents.pop();400 subEvents.pop();401 }402 {403 await collection.methods.deleteProperties(tokenId, ['A']).send({from: owner});404 expect(ethEvents).to.be.like([405 {406 event: 'TokenChanged',407 returnValues: {408 collectionId: collectionAddress,409 },410 },411 ]);412 expect(subEvents).to.be.like([{method: 'TokenPropertyDeleted'}]);413 }414 unsubscribe();415}416417describe('[FT] Sync sub & eth events', () => {418 const mode: TCollectionMode = 'ft';419420 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {421 await testCollectionCreatedAndDestroy(helper, mode);422 });423424 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {425 await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);426 });427 428 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {429 await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);430 });431 432 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {433 await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);434 });435 436 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {437 await testCollectionLimitSet(helper, mode);438 });439 440 itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {441 await testCollectionOwnedChanged(helper, mode);442 });443 444 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {445 await testCollectionPermissionSet(helper, mode);446 });447448 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {449 await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);450 });451});452453describe('[NFT] Sync sub & eth events', () => {454 const mode: TCollectionMode = 'nft';455456 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {457 await testCollectionCreatedAndDestroy(helper, mode);458 });459460 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {461 await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);462 });463 464 itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {465 await testPropertyPermissionSet(helper, mode);466 });467 468 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {469 await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);470 });471 472 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {473 await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);474 });475 476 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {477 await testCollectionLimitSet(helper, mode);478 });479 480 itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {481 await testCollectionOwnedChanged(helper, mode);482 });483 484 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {485 await testCollectionPermissionSet(helper, mode);486 });487488 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {489 await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);490 });491 492 itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {493 await testTokenPropertySetAndTokenPropertyDeleted(helper, mode);494 });495});496497describe('[RFT] Sync sub & eth events', () => {498 const mode: TCollectionMode = 'rft';499500 itEth('CollectionCreated and CollectionDestroyed events', async ({helper}) => {501 await testCollectionCreatedAndDestroy(helper, mode);502 });503504 itEth('CollectionChanged event for CollectionPropertySet and CollectionPropertyDeleted', async ({helper}) => {505 await testCollectionPropertySetAndCollectionPropertyDeleted(helper, mode);506 });507 508 itEth('CollectionChanged event for PropertyPermissionSet', async ({helper}) => {509 await testPropertyPermissionSet(helper, mode);510 });511 512 itEth('CollectionChanged event for AllowListAddressAdded, AllowListAddressRemoved', async ({helper}) => {513 await testAllowListAddressAddedAndAllowListAddressRemoved(helper, mode);514 });515 516 itEth('CollectionChanged event for CollectionAdminAdded, CollectionAdminRemoved', async ({helper}) => {517 await testCollectionAdminAddedAndCollectionAdminRemoved(helper, mode);518 });519 520 itEth('CollectionChanged event for CollectionLimitSet', async ({helper}) => {521 await testCollectionLimitSet(helper, mode);522 });523 524 itEth('CollectionChanged event for CollectionOwnedChanged', async ({helper}) => {525 await testCollectionOwnedChanged(helper, mode);526 });527 528 itEth('CollectionChanged event for CollectionPermissionSet', async ({helper}) => {529 await testCollectionPermissionSet(helper, mode);530 });531532 itEth('CollectionChanged event for CollectionSponsorSet, SponsorshipConfirmed, CollectionSponsorRemoved', async ({helper}) => {533 await testCollectionSponsorSetAndSponsorshipConfirmedAndCollectionSponsorRemoved(helper, mode);534 });535 536 itEth('CollectionChanged event for TokenPropertySet, TokenPropertyDeleted', async ({helper}) => {537 await testTokenPropertySetAndTokenPropertyDeleted(helper, mode);538 });539});