--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -348,8 +348,6 @@ TokenValueTooLow, /// Size of item is too large. NftSizeLimitExceeded, - /// Owned amount is lesser than tried to approve - CantAfford, /// No approve found ApproveNotFound, /// Requested value more than approved. @@ -1111,7 +1109,7 @@ allowance += >::get(collection_id, (item_id, &sender, &spender)); } if let Some(limit) = allowance_limit { - ensure!(limit >= allowance, Error::::CantAfford); + ensure!(limit >= allowance, Error::::TokenValueTooLow); } >::insert(collection_id, (item_id, sender.clone(), spender.clone()), allowance); --- a/tests/src/approve.test.ts +++ b/tests/src/approve.test.ts @@ -4,7 +4,6 @@ // import { IKeyringPair } from '@polkadot/types/types'; import { ApiPromise } from '@polkadot/api'; -import BN from 'bn.js'; import chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; import privateKey from './substrate/privateKey'; @@ -13,66 +12,61 @@ approveExpectFail, approveExpectSuccess, createCollectionExpectSuccess, - createFungibleItemExpectSuccess, createItemExpectSuccess, destroyCollectionExpectSuccess, transferExpectSuccess, - transferFromExpectSuccess, - U128_MAX, } from './util/helpers'; chai.use(chaiAsPromised); -const expect = chai.expect; -describe('Integration Test approve(spender, collection_id, item_id, amount):', () => { - it('Execute the extrinsic and check approvedList', async () => { - await usingApi(async (api: ApiPromise) => { - const Alice = privateKey('//Alice'); - const Bob = privateKey('//Bob'); - const nftCollectionId = await createCollectionExpectSuccess(); - // nft - const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); - await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob); - // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); - const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); - await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob); - // reFungible - const reFungibleCollectionId = - await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); - const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); - await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob); +let Alice: IKeyringPair; +let Bob: IKeyringPair; + +describe.only('Integration Test approve(spender, collection_id, item_id, amount):', () => { + before(async () => { + await usingApi(async () => { + Alice = privateKey('//Alice'); + Bob = privateKey('//Bob'); }); }); + it('Execute the extrinsic and check approvedList', async () => { + const nftCollectionId = await createCollectionExpectSuccess(); + // nft + const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); + await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob); + // fungible + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); + const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); + await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob); + // reFungible + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); + const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); + await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob); + }); + it('Remove approval by using 0 amount', async () => { - await usingApi(async (api: ApiPromise) => { - const Alice = privateKey('//Alice'); - const Bob = privateKey('//Bob'); - const nftCollectionId = await createCollectionExpectSuccess(); - // nft - const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); - await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1); - await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 0); - // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); - const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); - await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1); - await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0); - // reFungible - const reFungibleCollectionId = - await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); - const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); - await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 1); - await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0); - }); + const nftCollectionId = await createCollectionExpectSuccess(); + // nft + const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); + await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1); + await approveExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 0); + // fungible + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); + const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); + await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1); + await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0); + // reFungible + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); + const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); + await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 1); + await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0); }); }); -describe('Negative Integration Test approve(spender, collection_id, item_id, amount):', () => { - let Alice: IKeyringPair; - let Bob: IKeyringPair; - +describe.only('Negative Integration Test approve(spender, collection_id, item_id, amount):', () => { before(async () => { await usingApi(async (api) => { Alice = privateKey('//Alice'); @@ -82,7 +76,6 @@ it('Approve for a collection that does not exist', async () => { await usingApi(async (api: ApiPromise) => { - // nft const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number; await approveExpectFail(nftCollectionCount + 1, 1, Alice, Bob); @@ -96,56 +89,48 @@ }); it('Approve for a collection that was destroyed', async () => { - await usingApi(async (api: ApiPromise) => { - // nft - const nftCollectionId = await createCollectionExpectSuccess(); - await destroyCollectionExpectSuccess(nftCollectionId); - await approveExpectFail(nftCollectionId, 1, Alice, Bob); - // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); - await destroyCollectionExpectSuccess(fungibleCollectionId); - await approveExpectFail(fungibleCollectionId, 1, Alice, Bob); - // reFungible - const reFungibleCollectionId = - await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); - await destroyCollectionExpectSuccess(reFungibleCollectionId); - await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob); - }); + // nft + const nftCollectionId = await createCollectionExpectSuccess(); + await destroyCollectionExpectSuccess(nftCollectionId); + await approveExpectFail(nftCollectionId, 1, Alice, Bob); + // fungible + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); + await destroyCollectionExpectSuccess(fungibleCollectionId); + await approveExpectFail(fungibleCollectionId, 1, Alice, Bob); + // reFungible + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); + await destroyCollectionExpectSuccess(reFungibleCollectionId); + await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob); }); it('Approve transfer of a token that does not exist', async () => { - await usingApi(async (api: ApiPromise) => { - // nft - const nftCollectionId = await createCollectionExpectSuccess(); - await approveExpectFail(nftCollectionId, 2, Alice, Bob); - // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); - await approveExpectFail(fungibleCollectionId, 2, Alice, Bob); - // reFungible - const reFungibleCollectionId = - await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); - await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob); - }); + // nft + const nftCollectionId = await createCollectionExpectSuccess(); + await approveExpectFail(nftCollectionId, 2, Alice, Bob); + // fungible + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); + await approveExpectFail(fungibleCollectionId, 2, Alice, Bob); + // reFungible + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); + await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob); }); it('Approve using the address that does not own the approved token', async () => { - await usingApi(async (api: ApiPromise) => { - const Alice = privateKey('//Alice'); - const Bob = privateKey('//Bob'); - const nftCollectionId = await createCollectionExpectSuccess(); - // nft - const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); - await approveExpectFail(nftCollectionId, newNftTokenId, Bob, Alice); - // fungible - const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); - const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); - await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice); - // reFungible - const reFungibleCollectionId = - await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); - const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); - await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice); - }); + const nftCollectionId = await createCollectionExpectSuccess(); + // nft + const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT'); + await approveExpectFail(nftCollectionId, newNftTokenId, Bob, Alice); + // fungible + const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); + const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible'); + await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice); + // reFungible + const reFungibleCollectionId = + await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); + const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible'); + await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice); }); it('should fail if approved more NFTs than owned', async () => {