1234567891011121314151617import {IKeyringPair} from '@polkadot/types/types';18import chai from 'chai';19import chaiAsPromised from 'chai-as-promised';20import {usingPlaygrounds} from './util/playgrounds';2122chai.use(chaiAsPromised);23const expect = chai.expect;2425let donor: IKeyringPair;2627let alice: IKeyringPair;28let bob: IKeyringPair;29let charlie: IKeyringPair;3031describe('Integration Test ext. Allow list tests', () => {3233 before(async () => {34 await usingPlaygrounds(async (helper, privateKey) => {35 donor = privateKey('//Alice');36 [alice, bob, charlie] = await helper.arrange.createAccounts([100n, 100n, 100n], donor);37 });38 });3940 it('Owner can add address to allow list', async () => {41 await usingPlaygrounds(async (helper) => {42 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});43 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});44 const allowList = await helper.nft.getAllowList(collectionId);45 expect(allowList).to.be.deep.contains({Substrate: bob.address});46 });47 });4849 it('Admin can add address to allow list', async () => {50 await usingPlaygrounds(async (helper) => {51 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});52 await helper.nft.addAdmin(alice, collectionId, {Substrate: bob.address});5354 await helper.nft.addToAllowList(bob, collectionId, {Substrate: charlie.address});55 const allowList = await helper.nft.getAllowList(collectionId);56 expect(allowList).to.be.deep.contains({Substrate: charlie.address});57 });58 });5960 it('Non-privileged user cannot add address to allow list', async () => {61 await usingPlaygrounds(async (helper) => {62 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});63 const addToAllowListTx = async () => helper.nft.addToAllowList(bob, collectionId, {Substrate: charlie.address});64 await expect(addToAllowListTx()).to.be.rejected;65 });66 });6768 it('Nobody can add address to allow list of non-existing collection', async () => {69 const collectionId = (1<<32) - 1;70 await usingPlaygrounds(async (helper) => {71 const addToAllowListTx = async () => helper.nft.addToAllowList(bob, collectionId, {Substrate: charlie.address});72 await expect(addToAllowListTx()).to.be.rejected;73 });74 });7576 it('Nobody can add address to allow list of destroyed collection', async () => {77 await usingPlaygrounds(async (helper) => {78 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});79 await helper.collection.burn(alice, collectionId);80 const addToAllowListTx = async () => helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});81 await expect(addToAllowListTx()).to.be.rejected;82 });83 });8485 it('If address is already added to allow list, nothing happens', async () => {86 await usingPlaygrounds(async (helper) => {87 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});88 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});89 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});90 const allowList = await helper.nft.getAllowList(collectionId);91 expect(allowList).to.be.deep.contains({Substrate: bob.address});92 });93 });9495 it('Owner can remove address from allow list', async () => {96 await usingPlaygrounds(async (helper) => {97 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});98 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});99100 await helper.collection.removeFromAllowList(alice, collectionId, {Substrate: bob.address});101102 const allowList = await helper.nft.getAllowList(collectionId);103104 expect(allowList).to.be.not.deep.contains({Substrate: bob.address});105 });106 });107108 it('Admin can remove address from allow list', async () => {109 await usingPlaygrounds(async (helper) => {110 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});111 await helper.nft.addAdmin(alice, collectionId, {Substrate: charlie.address});112 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});113 await helper.collection.removeFromAllowList(charlie, collectionId, {Substrate: bob.address});114115 const allowList = await helper.nft.getAllowList(collectionId);116117 expect(allowList).to.be.not.deep.contains({Substrate: bob.address});118 });119 });120121 it('Non-privileged user cannot remove address from allow list', async () => {122 await usingPlaygrounds(async (helper) => {123 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});124 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});125 const removeTx = async () => helper.collection.removeFromAllowList(bob, collectionId, {Substrate: charlie.address});126 await expect(removeTx()).to.be.rejected;127 const allowList = await helper.nft.getAllowList(collectionId);128129 expect(allowList).to.be.deep.contains({Substrate: charlie.address});130 });131 });132133 it('Nobody can remove address from allow list of non-existing collection', async () => {134 const collectionId = (1<<32) - 1;135 await usingPlaygrounds(async (helper) => {136 const removeTx = async () => helper.collection.removeFromAllowList(bob, collectionId, {Substrate: charlie.address});137 await expect(removeTx()).to.be.rejected;138 });139 });140141 it('Nobody can remove address from allow list of deleted collection', async () => {142 await usingPlaygrounds(async (helper) => {143 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});144 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});145 await helper.collection.burn(alice, collectionId);146 const removeTx = async () => helper.collection.removeFromAllowList(alice, collectionId, {Substrate: bob.address});147148 await expect(removeTx()).to.be.rejected;149 });150 });151152 it('If address is already removed from allow list, nothing happens', async () => {153 await usingPlaygrounds(async (helper) => {154 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});155 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});156 await helper.collection.removeFromAllowList(alice, collectionId, {Substrate: bob.address});157 const allowListBefore = await helper.nft.getAllowList(collectionId);158 expect(allowListBefore).to.be.not.deep.contains({Substrate: bob.address});159160 await helper.collection.removeFromAllowList(alice, collectionId, {Substrate: bob.address});161162 const allowListAfter = await helper.nft.getAllowList(collectionId);163 expect(allowListAfter).to.be.not.deep.contains({Substrate: bob.address});164 });165 });166167 it('If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom. Test1', async () => {168 await usingPlaygrounds(async (helper) => {169 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});170 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});171 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});172 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});173174 const transferResult = async () => helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});175 await expect(transferResult()).to.be.rejected;176 });177 });178179 it('If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom. Test2', async () => {180 await usingPlaygrounds(async (helper) => {181 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});182 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});183 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});184 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});185 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});186 await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: charlie.address});187 await helper.collection.removeFromAllowList(alice, collectionId, {Substrate: alice.address});188189 const transferResult = async () => helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});190 await expect(transferResult()).to.be.rejected;191 });192 });193194 it('If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom. Test1', async () => {195 await usingPlaygrounds(async (helper) => {196 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});197 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});198 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});199 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});200201 const transferResult = async () => helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});202 await expect(transferResult()).to.be.rejected;203 });204 });205206 it('If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom. Test2', async () => {207 await usingPlaygrounds(async (helper) => {208 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});209 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});210 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});211 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});212 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});213214 await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: charlie.address});215 await helper.collection.removeFromAllowList(alice, collectionId, {Substrate: alice.address});216217 const transferResult = async () => helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});218 await expect(transferResult()).to.be.rejected;219 });220 });221222 it('If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)', async () => {223 await usingPlaygrounds(async (helper) => {224 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});225 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});226 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});227 const burnTx = async () => helper.nft.burnToken(bob, collectionId, tokenId);228 await expect(burnTx()).to.be.rejected;229 });230 });231232 it('If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method)', async () => {233 await usingPlaygrounds(async (helper) => {234 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});235 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});236 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});237 const approveTx = async () => helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: bob.address});238 await expect(approveTx()).to.be.rejected;239 });240 });241242 it('If Public Access mode is set to AllowList, tokens can be transferred to a allowlisted address with transfer.', async () => {243 await usingPlaygrounds(async (helper) => {244 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});245 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});246 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});247 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});248 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});249 await helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});250 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);251 expect(owner.Substrate).to.be.equal(charlie.address);252 });253 });254255 it('If Public Access mode is set to AllowList, tokens can be transferred to a allowlisted address with transferFrom.', async () => {256 await usingPlaygrounds(async (helper) => {257 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});258 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});259 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});260 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});261 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});262 await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: charlie.address});263264 await helper.nft.transferTokenFrom(alice, collectionId, tokenId, {Substrate: alice.address}, {Substrate: charlie.address});265 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);266 expect(owner.Substrate).to.be.equal(charlie.address);267 });268 });269270 it('If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer', async () => {271 await usingPlaygrounds(async (helper) => {272 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});273 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});274 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});275 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});276 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});277278 await helper.nft.transferToken(alice, collectionId, tokenId, {Substrate: charlie.address});279 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);280 expect(owner.Substrate).to.be.equal(charlie.address);281 });282 });283284 it('If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transferFrom', async () => {285 await usingPlaygrounds(async (helper) => {286 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});287 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});288 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList'});289 await helper.nft.addToAllowList(alice, collectionId, {Substrate: alice.address});290 await helper.nft.addToAllowList(alice, collectionId, {Substrate: charlie.address});291 await helper.nft.approveToken(alice, collectionId, tokenId, {Substrate: charlie.address});292293 await helper.nft.transferTokenFrom(alice, collectionId, tokenId, {Substrate: alice.address}, {Substrate: charlie.address});294 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);295 expect(owner.Substrate).to.be.equal(charlie.address);296 });297 });298299 it('If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner', async () => {300 await usingPlaygrounds(async (helper) => {301 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});302 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: false});303 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});304 const token = await helper.nft.getToken(collectionId, tokenId);305 expect(token).to.be.not.null;306 });307 });308309 it('If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin', async () => {310 await usingPlaygrounds(async (helper) => {311 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});312 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: false});313 await helper.collection.addAdmin(alice, collectionId, {Substrate: bob.address});314 const {tokenId} = await helper.nft.mintToken(bob, {collectionId: collectionId, owner: bob.address});315 const token = await helper.nft.getToken(collectionId, tokenId);316 expect(token).to.be.not.null;317 });318 });319320 it('If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow-listed address', async () => {321 await usingPlaygrounds(async (helper) => {322 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});323 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: false});324 await helper.collection.addToAllowList(alice, collectionId, {Substrate: bob.address});325 const mintTokenTx = async () => helper.nft.mintToken(bob, {collectionId: collectionId, owner: bob.address});326 await expect(mintTokenTx()).to.be.rejected;327 });328 });329330 it('If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address', async () => {331 await usingPlaygrounds(async (helper) => {332 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});333 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: false});334 const mintTokenTx = async () => helper.nft.mintToken(bob, {collectionId: collectionId, owner: bob.address});335 await expect(mintTokenTx()).to.be.rejected;336 });337 });338339 it('If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner', async () => {340 await usingPlaygrounds(async (helper) => {341 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});342 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: true});343 const {tokenId} = await helper.nft.mintToken(alice, {collectionId: collectionId, owner: alice.address});344 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);345 expect(owner.Substrate).to.be.equal(alice.address);346 });347 });348349 it('If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin', async () => {350 await usingPlaygrounds(async (helper) => {351 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});352 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: true});353 await helper.nft.addAdmin(alice, collectionId, {Substrate: bob.address});354 const {tokenId} = await helper.nft.mintToken(bob, {collectionId: collectionId, owner: bob.address});355 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);356 expect(owner.Substrate).to.be.equal(bob.address);357 });358 });359360 it('If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address', async () => {361 await usingPlaygrounds(async (helper) => {362 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});363 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: true});364 const mintTokenTx = async () => helper.nft.mintToken(bob, {collectionId: collectionId, owner: bob.address});365 await expect(mintTokenTx()).to.be.rejected;366 });367 });368369 it('If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address', async () => {370 await usingPlaygrounds(async (helper) => {371 const {collectionId} = await helper.nft.mintCollection(alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'});372 await helper.nft.setPermissions(alice, collectionId, {access: 'AllowList', mintMode: true});373 await helper.nft.addToAllowList(alice, collectionId, {Substrate: bob.address});374 const {tokenId} = await helper.nft.mintToken(bob, {collectionId: collectionId, owner: bob.address});375 const owner = await helper.nft.getTokenOwner(collectionId, tokenId);376 expect(owner.Substrate).to.be.equal(bob.address);377 });378 });379});