123456import chai from 'chai';7import chaiAsPromised from 'chai-as-promised';8import privateKey from './substrate/privateKey';9import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api';10import {createCollectionExpectSuccess,11 addCollectionAdminExpectSuccess,12 setCollectionSponsorExpectSuccess,13 confirmSponsorshipExpectSuccess,14 removeCollectionSponsorExpectSuccess,15 enableAllowListExpectSuccess,16 setMintPermissionExpectSuccess,17 destroyCollectionExpectSuccess,18 setCollectionSponsorExpectFailure,19 confirmSponsorshipExpectFailure,20 removeCollectionSponsorExpectFailure,21 enableAllowListExpectFail,22 setMintPermissionExpectFailure,23 destroyCollectionExpectFailure,24 setPublicAccessModeExpectSuccess,25} from './util/helpers';2627chai.use(chaiAsPromised);28const expect = chai.expect;2930describe('Integration Test changeCollectionOwner(collection_id, new_owner):', () => {31 it('Changing owner changes owner address', async () => {32 await usingApi(async api => {33 const collectionId = await createCollectionExpectSuccess();34 const alice = privateKey('//Alice');35 const bob = privateKey('//Bob');3637 const collection = (await api.query.common.collectionById(collectionId)).unwrap();38 expect(collection.owner.toString()).to.be.deep.eq(alice.address);3940 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);41 await submitTransactionAsync(alice, changeOwnerTx);4243 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();44 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address);45 });46 });47});4849describe('Integration Test changeCollectionOwner(collection_id, new_owner) special checks for exOwner:', () => {50 it('Changing the owner of the collection is not allowed for the former owner', async () => {51 await usingApi(async api => {52 const collectionId = await createCollectionExpectSuccess();53 const alice = privateKey('//Alice');54 const bob = privateKey('//Bob');5556 const collection = (await api.query.common.collectionById(collectionId)).unwrap();57 expect(collection.owner.toString()).to.be.deep.eq(alice.address);5859 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);60 await submitTransactionAsync(alice, changeOwnerTx);6162 const badChangeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, alice.address);63 await expect(submitTransactionExpectFailAsync(alice, badChangeOwnerTx)).to.be.rejected;6465 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();66 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address);67 });68 });6970 it('New collectionOwner has access to sponsorship management operations in the collection', async () => {71 await usingApi(async api => {72 const collectionId = await createCollectionExpectSuccess();73 const alice = privateKey('//Alice');74 const bob = privateKey('//Bob');75 const charlie = privateKey('//Charlie');7677 const collection = (await api.query.common.collectionById(collectionId)).unwrap();78 expect(collection.owner.toString()).to.be.deep.eq(alice.address);7980 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);81 await submitTransactionAsync(alice, changeOwnerTx);8283 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();84 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address);8586 87 88 await setCollectionSponsorExpectSuccess(collectionId, charlie.address, '//Bob');89 await confirmSponsorshipExpectSuccess(collectionId, '//Charlie');90 await removeCollectionSponsorExpectSuccess(collectionId, '//Bob');9192 93 const collectionLimits = {94 accountTokenOwnershipLimit: 1,95 sponsoredMintSize: 1,96 tokenLimit: 1,97 sponsorTransferTimeout: 1,98 ownerCanTransfer: true,99 ownerCanDestroy: true,100 };101 const tx1 = api.tx.nft.setCollectionLimits(102 collectionId,103 collectionLimits,104 );105 await submitTransactionAsync(bob, tx1);106107 await setPublicAccessModeExpectSuccess(bob, collectionId, 'AllowList');108 await enableAllowListExpectSuccess(bob, collectionId);109 await setMintPermissionExpectSuccess(bob, collectionId, true);110 await destroyCollectionExpectSuccess(collectionId, '//Bob');111 });112 });113114 it('New collectionOwner has access to changeCollectionOwner', async () => {115 await usingApi(async api => {116 const collectionId = await createCollectionExpectSuccess();117 const alice = privateKey('//Alice');118 const bob = privateKey('//Bob');119 const charlie = privateKey('//Charlie');120121 const collection = (await api.query.common.collectionById(collectionId)).unwrap();122 expect(collection.owner.toString()).to.be.deep.eq(alice.address);123124 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);125 await submitTransactionAsync(alice, changeOwnerTx);126127 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();128 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address);129130 const changeOwnerTx2 = api.tx.nft.changeCollectionOwner(collectionId, charlie.address);131 await submitTransactionAsync(bob, changeOwnerTx2);132133 134 const collectionAfterOwnerChange2 = (await api.query.common.collectionById(collectionId)).unwrap();135 expect(collectionAfterOwnerChange2.owner.toString()).to.be.deep.eq(charlie.address);136 });137 });138});139140describe('Negative Integration Test changeCollectionOwner(collection_id, new_owner):', () => {141 it('Not owner can\'t change owner.', async () => {142 await usingApi(async api => {143 const collectionId = await createCollectionExpectSuccess();144 const alice = privateKey('//Alice');145 const bob = privateKey('//Bob');146147 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);148 await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected;149150 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();151 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(alice.address);152153 154 await createCollectionExpectSuccess();155 });156 });157158 it('Collection admin can\'t change owner.', async () => {159 await usingApi(async api => {160 const collectionId = await createCollectionExpectSuccess();161 const alice = privateKey('//Alice');162 const bob = privateKey('//Bob');163164 await addCollectionAdminExpectSuccess(alice, collectionId, bob.address);165166 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);167 await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected;168169 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();170 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(alice.address);171172 173 await createCollectionExpectSuccess();174 });175 });176177 it('Can\'t change owner of a non-existing collection.', async () => {178 await usingApi(async api => {179 const collectionId = (1<<32) - 1;180 const alice = privateKey('//Alice');181 const bob = privateKey('//Bob');182183 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);184 await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;185186 187 await createCollectionExpectSuccess();188 });189 });190191 it('Former collectionOwner not allowed to sponsorship management operations in the collection', async () => {192 await usingApi(async api => {193 const collectionId = await createCollectionExpectSuccess();194 const alice = privateKey('//Alice');195 const bob = privateKey('//Bob');196 const charlie = privateKey('//Charlie');197198 const collection = (await api.query.common.collectionById(collectionId)).unwrap();199 expect(collection.owner.toString()).to.be.deep.eq(alice.address);200201 const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);202 await submitTransactionAsync(alice, changeOwnerTx);203204 const badChangeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, alice.address);205 await expect(submitTransactionExpectFailAsync(alice, badChangeOwnerTx)).to.be.rejected;206207 const collectionAfterOwnerChange = (await api.query.common.collectionById(collectionId)).unwrap();208 expect(collectionAfterOwnerChange.owner.toString()).to.be.deep.eq(bob.address);209210 await setCollectionSponsorExpectFailure(collectionId, charlie.address, '//Alice');211 await confirmSponsorshipExpectFailure(collectionId, '//Alice');212 await removeCollectionSponsorExpectFailure(collectionId, '//Alice');213214 const collectionLimits = {215 accountTokenOwnershipLimit: 1,216 sponsoredMintSize: 1,217 tokenLimit: 1,218 sponsorTransferTimeout: 1,219 ownerCanTransfer: true,220 ownerCanDestroy: true,221 };222 const tx1 = api.tx.nft.setCollectionLimits(223 collectionId,224 collectionLimits,225 );226 await expect(submitTransactionExpectFailAsync(alice, tx1)).to.be.rejected;227228 await enableAllowListExpectFail(alice, collectionId);229 await setMintPermissionExpectFailure(alice, collectionId, true);230 await destroyCollectionExpectFailure(collectionId, '//Alice');231 });232 });233});