From 99e7555e5ee6d27e85c43037e8073559fee1e824 Mon Sep 17 00:00:00 2001 From: Greg Zaitsev Date: Thu, 18 Feb 2021 09:51:40 +0000 Subject: [PATCH] Merge pull request #104 from usetech-llc/feature/NFTPAR-301_transfer_event Add Transfer event --- --- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -507,6 +507,19 @@ /// /// item_id: Identifier of burned NFT. ItemDestroyed(CollectionId, TokenId), + + /// Item was transferred + /// + /// * collection_id: Id of collection to which item is belong + /// + /// * item_id: Id of an item + /// + /// * sender: Original owner of item + /// + /// * recipient: New owner of item + /// + /// * amount: Always 1 for NFT + Transfer(CollectionId, TokenId, AccountId, AccountId, u128), } ); @@ -1558,12 +1571,14 @@ match target_collection.mode { - CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?, + CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient.clone())?, CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, value, &sender, &recipient)?, - CollectionMode::ReFungible => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?, + CollectionMode::ReFungible => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient.clone())?, _ => () }; + Self::deposit_event(RawEvent::Transfer(collection_id, item_id, sender, recipient, value)); + Ok(()) } --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -39,6 +39,15 @@ recipient: string; } +interface TransferResult { + success: boolean; + collectionId: number; + itemId: number; + sender: string; + recipient: string; + value: bigint; +} + interface IReFungibleOwner { Fraction: BN; Owner: number[]; @@ -115,6 +124,31 @@ return result; } +export function getTransferResult(events: EventRecord[]): TransferResult { + const result: TransferResult = { + success: false, + collectionId: 0, + itemId: 0, + sender: '', + recipient: '', + value: 0n, + }; + + events.forEach(({event: {data, method, section}}) => { + if (method === 'ExtrinsicSuccess') { + result.success = true; + } else if (section === 'nft' && method === 'Transfer') { + result.collectionId = +data[0].toString(); + result.itemId = +data[1].toString(); + result.sender = data[2].toString(); + result.recipient = data[3].toString(); + result.value = BigInt(data[4].toString()); + } + }); + + return result; +} + interface Invalid { type: 'Invalid'; } @@ -624,9 +658,14 @@ } const transferTx = await api.tx.nft.transfer(recipient.address, collectionId, tokenId, value); const events = await submitTransactionAsync(sender, transferTx); - const result = getCreateItemResult(events); + const result = getTransferResult(events); // tslint:disable-next-line:no-unused-expression expect(result.success).to.be.true; + expect(result.collectionId).to.be.equal(collectionId); + expect(result.itemId).to.be.equal(tokenId); + expect(result.sender).to.be.equal(sender.address); + expect(result.recipient).to.be.equal(recipient.address); + expect(result.value.toString()).to.be.equal(value.toString()); if (type === 'NFT') { const nftItemData = await api.query.nft.nftItemList(collectionId, tokenId) as unknown as ITokenDataType; expect(nftItemData.Owner.toString()).to.be.equal(recipient.address); -- gitstuff