From 502dc25b12328b75ec1c3c1eba5115aa1bc8f8b5 Mon Sep 17 00:00:00 2001 From: Nikolay Dorofeev Date: Tue, 14 Nov 2023 19:13:22 +0400 Subject: [PATCH] Create post --- .../contracts/d_social_network_account.tact | 4 ++ .../contracts/d_social_network_post.tact | 10 ++++ contracts/contracts/messages_d.tact | 9 ++++ contracts/tests/DSocialNetworkAccount.spec.ts | 47 ++++++++++++++++++- 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/contracts/contracts/d_social_network_account.tact b/contracts/contracts/d_social_network_account.tact index 8a8dfc14..8eca7364 100644 --- a/contracts/contracts/d_social_network_account.tact +++ b/contracts/contracts/d_social_network_account.tact @@ -40,6 +40,10 @@ contract DSocialNetworkAccount with NftCollection, NftCollectionRoyaltyExtention }; } + get fun get_next_item_index(): Int { + return self.next_item_index; + } + receive(msg: InitializeAccount) { require(!self.is_initialized, "Account is already initialized"); self.requireOwner(); diff --git a/contracts/contracts/d_social_network_post.tact b/contracts/contracts/d_social_network_post.tact index 190e7ea7..6279cee4 100644 --- a/contracts/contracts/d_social_network_post.tact +++ b/contracts/contracts/d_social_network_post.tact @@ -1,6 +1,7 @@ import "@stdlib/deploy"; import "@stdlib/ownable"; import "./lib/trait_nft_item.tact"; +import "./messages_d.tact"; contract DSocialNetworkPost with NftItem { collection_address: Address; @@ -24,5 +25,14 @@ contract DSocialNetworkPost with NftItem { self.is_initialized = false; } + get fun get_post_info(): PostInfo { + return PostInfo{ + account: self.collection_address, + id: self.item_index, + owner: self.owner, + nft_content: self.individual_content + }; + } + } diff --git a/contracts/contracts/messages_d.tact b/contracts/contracts/messages_d.tact index f25af4a1..4351405f 100644 --- a/contracts/contracts/messages_d.tact +++ b/contracts/contracts/messages_d.tact @@ -22,3 +22,12 @@ struct AccountInfo { collection_content: NftCollectionMetadata; is_initialized: Bool; } + +// Post contract + +struct PostInfo { + account: Address; + id: Int; + owner: Address; + nft_content: NftMetadata; +} diff --git a/contracts/tests/DSocialNetworkAccount.spec.ts b/contracts/tests/DSocialNetworkAccount.spec.ts index ea761ae2..c4f988c3 100644 --- a/contracts/tests/DSocialNetworkAccount.spec.ts +++ b/contracts/tests/DSocialNetworkAccount.spec.ts @@ -1,8 +1,12 @@ import { Blockchain, SandboxContract } from '@ton-community/sandbox' -import { toNano } from 'ton-core' +import { toNano, Dictionary } from 'ton-core' import { DSocialNetworkMaster } from '../wrappers/DSocialNetworkMaster' -import { DSocialNetworkAccount } from '../wrappers/DSocialNetworkAccount' +import { + DSocialNetworkAccount, + NftMetadataAttribute +} from '../wrappers/DSocialNetworkAccount' import '@ton-community/test-utils' +import { DSocialNetworkPost } from '../wrappers/DSocialNetworkPost' describe('DSocialNetworkMaster', () => { let blockchain: Blockchain @@ -63,4 +67,43 @@ describe('DSocialNetworkMaster', () => { expect(owner.toRawString()).toEqual(deployer.address.toRawString()) }) + + it('should create post', async () => { + const attributes = Dictionary.empty() + attributes.set(0n, { + $$type: 'NftMetadataAttribute', + trait_type: 'content', + value: 'This is my first post' + }) + const registerResult = await dAccount.send( + deployer.getSender(), + { value: toNano('0.5') }, + { + $$type: 'MintNft', + query_id: 0n, + individual_content: { + $$type: 'NftMetadata', + name: 'Test post', + description: 'Test post description', + image: 'https://test.com/image.png', + content_url: 'https://test.com/content.txt', + attributes + } + } + ) + + const postAddress = await dAccount.getGetNftAddressByIndex(0n) + + expect(postAddress).not.toBeNull() + + expect(registerResult.transactions).toHaveTransaction({ + from: dAccount.address, + to: postAddress!, + success: true + }) + + expect(await dAccount.getGetNextItemIndex()).toBe(1n) + + blockchain.openContract(DSocialNetworkPost.fromAddress(postAddress!)) + }) })