--- a/js-packages/playgrounds/types.ts +++ b/js-packages/playgrounds/types.ts @@ -160,6 +160,8 @@ External = 1, /// Supports ERC721Metadata Erc721metadata = 64, + /// Tokens in foreign collections can be transferred, but not burnt + Foreign = 128, } export interface ICollectionCreationOptions { --- a/js-packages/tests/createCollection.test.ts +++ b/js-packages/tests/createCollection.test.ts @@ -106,6 +106,18 @@ name: 'name', description: 'descr', tokenPrefix: 'COL', flags: [CollectionFlag.Erc721metadata], }, 'nft'); + + // User can not set Foreign flag itself + + await expect(mintCollectionHelper(helper, alice, { + name: 'name', description: 'descr', tokenPrefix: 'COL', + flags: [CollectionFlag.Foreign], + }, 'nft')).to.be.rejectedWith(/common.NoPermission/); + + await expect(mintCollectionHelper(helper, alice, { + name: 'name', description: 'descr', tokenPrefix: 'COL', + flags: [CollectionFlag.Erc721metadata, CollectionFlag.Foreign], + }, 'nft')).to.be.rejectedWith(/common.NoPermission/); }); itSub('Create new collection with extra fields', async ({helper}) => { --- a/js-packages/tests/eth/createCollection.test.ts +++ b/js-packages/tests/eth/createCollection.test.ts @@ -1404,16 +1404,16 @@ { const {collectionId} = await helper.eth.createCollection(owner, {...createCollectionData, flags: 0}).send(); - expect((await helper.nft.getData(collectionId))?.raw.flags).to.be.deep.equal({erc721metadata: false}); + expect((await helper.nft.getData(collectionId))?.raw.flags).to.be.deep.equal({foreign: false, erc721metadata: false}); } { const {collectionId} = await helper.eth.createCollection(owner, {...createCollectionData, flags: 64}).send(); - expect((await helper.nft.getData(collectionId))?.raw.flags).to.be.deep.equal({erc721metadata: true}); + expect((await helper.nft.getData(collectionId))?.raw.flags).to.be.deep.equal({foreign: false, erc721metadata: true}); } }); - itEth('NFT: cannot set a reserved flag number', async ({helper}) => { + itEth('NFT: can\'t set foreign flag number', async ({helper}) => { const owner = await helper.eth.createAccountWithBalance(donor); { @@ -1430,7 +1430,19 @@ { const {collectionId} = await helper.eth.createCollection(owner, {...createCollectionData, flags: [CollectionFlag.Erc721metadata]}).send(); - expect((await helper.nft.getData(collectionId))?.raw.flags).to.be.deep.equal({erc721metadata: true}); + expect((await helper.nft.getData(collectionId))?.raw.flags).to.be.deep.equal({foreign: false, erc721metadata: true}); + } + }); + + itEth('NFT: foreign flag enum is ignored', async ({helper}) => { + const owner = await helper.eth.createAccountWithBalance(donor); + + { + await expect(helper.eth.createCollection(owner, {...createCollectionData, flags: [CollectionFlag.Foreign]}).call({from: owner})).to.be.rejectedWith(/internal flags were used/); + } + + { + await expect(helper.eth.createCollection(owner, {...createCollectionData, flags: [CollectionFlag.Erc721metadata | CollectionFlag.Foreign]}).call({from: owner})).to.be.rejectedWith(/internal flags were used/); } }); });