From 39837eb909a616c991c1055f2dfcb9e285aaa127 Mon Sep 17 00:00:00 2001 From: EjembiEmmanuel Date: Tue, 11 Jun 2024 17:21:20 +0000 Subject: [PATCH 1/5] feat: implement quote function in publication contract --- src/publication/publication.cairo | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/publication/publication.cairo b/src/publication/publication.cairo index 05edae9..97ca086 100644 --- a/src/publication/publication.cairo +++ b/src/publication/publication.cairo @@ -32,7 +32,9 @@ pub trait IKarstPublications { profile_contract_address: ContractAddress, ) -> u256; fn mirror(ref self: T, mirrorParams: MirrorParams) -> u256; - fn quote(ref self: T, quoteParams: QuoteParams) -> u256; + fn quote( + ref self: T, quoteParams: QuoteParams, profile_contract_address: ContractAddress + ) -> u256; ////// Getters////// fn get_publication(self: @T, user: ContractAddress, pubIdAssigned: u256) -> Publication; fn get_publication_type( @@ -164,9 +166,21 @@ pub mod Publications { 0 } - fn quote(ref self: ContractState, quoteParams: QuoteParams) -> u256 { - // logic here - 0 + fn quote( + ref self: ContractState, + quoteParams: QuoteParams, + profile_contract_address: ContractAddress + ) -> u256 { + let pubIdAssigned = self + ._createReferencePublication( + quoteParams.profile_address, + quoteParams.content_URI, + quoteParams.pointed_profile_address, + quoteParams.pointed_pub_id, + PublicationType::Quote, + profile_contract_address + ); + pubIdAssigned } // ************************************************************************* // GETTERS From e4a6f45926d65b2fe439648f5193e714ac3e9979 Mon Sep 17 00:00:00 2001 From: EjembiEmmanuel Date: Wed, 12 Jun 2024 23:07:04 +0100 Subject: [PATCH 2/5] test: test `quote()` --- src/interfaces/IPublication.cairo | 6 +++-- src/publication/publication.cairo | 2 +- tests/test_publication.cairo | 43 +++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/interfaces/IPublication.cairo b/src/interfaces/IPublication.cairo index e775c29..0f31a53 100644 --- a/src/interfaces/IPublication.cairo +++ b/src/interfaces/IPublication.cairo @@ -2,7 +2,7 @@ // INTERFACE of KARST PUBLICATIONS // ************************************************************************* use starknet::ContractAddress; -use karst::base::types::{PostParams, ReferencePubParams, PublicationType, Publication}; +use karst::base::types::{PostParams, ReferencePubParams, PublicationType, Publication, QuoteParams}; #[starknet::interface] pub trait IKarstPublications { @@ -23,7 +23,9 @@ pub trait IKarstPublications { pointed_pub_id: u256, profile_contract_address: ContractAddress, ) -> u256; - + fn quote( + ref self: T, quoteParams: QuoteParams, profile_contract_address: ContractAddress + ) -> u256; // ************************************************************************* // GETTERS // ************************************************************************* diff --git a/src/publication/publication.cairo b/src/publication/publication.cairo index 97ca086..e002013 100644 --- a/src/publication/publication.cairo +++ b/src/publication/publication.cairo @@ -283,7 +283,7 @@ pub mod Publications { content_URI, pointed_profile_address, pointed_pub_id, - PublicationType::Comment, + referencePubType, profile_contract_address ); diff --git a/tests/test_publication.cairo b/tests/test_publication.cairo index d4caf3f..44331c0 100644 --- a/tests/test_publication.cairo +++ b/tests/test_publication.cairo @@ -19,7 +19,7 @@ use karst::publication::publication::Publications; use karst::interfaces::IPublication::{ IKarstPublicationsDispatcher, IKarstPublicationsDispatcherTrait }; -use karst::base::types::{PostParams, ReferencePubParams, PublicationType}; +use karst::base::types::{PostParams, ReferencePubParams, PublicationType, QuoteParams}; const HUB_ADDRESS: felt252 = 'HUB'; const USER_ONE: felt252 = 'BOB'; @@ -215,7 +215,6 @@ fn test_comment() { user_one_first_post_pointed_pub_id, profile_contract_address ); - let user_one_publication_root_id = publication_dispatcher .get_publication(user_one_profile_address, user_one_comment_assigned_pub_id_1) .root_profile_address; @@ -232,6 +231,46 @@ fn test_comment() { ); } +#[test] +fn test_quote() { + let ( + _, + _, + profile_contract_address, + publication_contract_address, + _, + _, + user_one_profile_address, + user_two_profile_address, + user_one_first_post_pointed_pub_id, + ) = + __setup__(); + let publication_dispatcher = IKarstPublicationsDispatcher { + contract_address: publication_contract_address + }; + start_prank( + CheatTarget::Multiple(array![publication_contract_address, profile_contract_address]), + USER_ONE.try_into().unwrap() + ); + let quote_content_URI = "ipfs://QmSkDCsS32eLpcymxtn1cEn7Rc5hfefLBgfvZysddefzp/"; + + let quote_params = QuoteParams { + profile_address: user_two_profile_address, + content_URI: quote_content_URI, + pointed_profile_address: user_one_profile_address, + pointed_pub_id: user_one_first_post_pointed_pub_id + }; + // user one publish quote to user 2 profile + let quote_pub_id = publication_dispatcher.quote(quote_params, profile_contract_address); + + let publication_type = publication_dispatcher + .get_publication_type(user_two_profile_address, quote_pub_id); + assert(publication_type == PublicationType::Quote, 'invalid pub_type'); + + stop_prank( + CheatTarget::Multiple(array![publication_contract_address, profile_contract_address]), + ); +} fn to_address(name: felt252) -> ContractAddress { name.try_into().unwrap() From f458a85b16a233c83a08d37dcf95a456050d2554 Mon Sep 17 00:00:00 2001 From: EjembiEmmanuel Date: Wed, 12 Jun 2024 22:52:59 +0000 Subject: [PATCH 3/5] fix: fix merge artifacts --- src/interfaces/IPublication.cairo | 5 +++-- tests/test_publication.cairo | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/interfaces/IPublication.cairo b/src/interfaces/IPublication.cairo index 9e4a711..ed3fbb3 100644 --- a/src/interfaces/IPublication.cairo +++ b/src/interfaces/IPublication.cairo @@ -2,7 +2,9 @@ // INTERFACE of KARST PUBLICATIONS // ************************************************************************* use starknet::ContractAddress; -use karst::base::types::{PostParams, MirrorParams, ReferencePubParams, PublicationType, Publication, QuoteParams}; +use karst::base::types::{ + PostParams, MirrorParams, ReferencePubParams, PublicationType, Publication, QuoteParams +}; #[starknet::interface] pub trait IKarstPublications { @@ -29,7 +31,6 @@ pub trait IKarstPublications { fn mirror( ref self: T, mirrorParams: MirrorParams, profile_contract_address: ContractAddress ) -> u256; - fn quote(ref self: T, quoteParams: QuoteParams) -> u256; // ************************************************************************* // GETTERS // ************************************************************************* diff --git a/tests/test_publication.cairo b/tests/test_publication.cairo index 0967835..7850700 100644 --- a/tests/test_publication.cairo +++ b/tests/test_publication.cairo @@ -19,7 +19,9 @@ use karst::publication::publication::Publications; use karst::interfaces::IPublication::{ IKarstPublicationsDispatcher, IKarstPublicationsDispatcherTrait }; -use karst::base::types::{PostParams, MirrorParams, ReferencePubParams, PublicationType, QuoteParams}; +use karst::base::types::{ + PostParams, MirrorParams, ReferencePubParams, PublicationType, QuoteParams +}; const HUB_ADDRESS: felt252 = 'HUB'; const USER_ONE: felt252 = 'BOB'; @@ -270,6 +272,7 @@ fn test_quote() { _, user_one_profile_address, user_two_profile_address, + _, user_one_first_post_pointed_pub_id, ) = __setup__(); From 6f5de5112e6a4e3e2ce324d12dcb10df6a474005 Mon Sep 17 00:00:00 2001 From: EjembiEmmanuel Date: Fri, 14 Jun 2024 11:03:03 +0100 Subject: [PATCH 4/5] feat(quote): emit `QuoteCtreated` event --- src/base/types.cairo | 2 +- src/publication/publication.cairo | 25 +++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/base/types.cairo b/src/base/types.cairo index fba9bb7..6708c17 100644 --- a/src/base/types.cairo +++ b/src/base/types.cairo @@ -132,7 +132,7 @@ pub struct MirrorParams { // * @param pointed_profile_address The profile address of the publication author that is quoted. // * @param pointed_pub_id The publication ID that is quoted. // */ -#[derive(Drop, Serde, starknet::Store)] +#[derive(Drop, Serde, starknet::Store, Clone)] pub struct QuoteParams { profile_address: ContractAddress, content_URI: ByteArray, diff --git a/src/publication/publication.cairo b/src/publication/publication.cairo index cb8e2b9..12efeeb 100644 --- a/src/publication/publication.cairo +++ b/src/publication/publication.cairo @@ -79,6 +79,7 @@ pub mod Publications { pub enum Event { Post: Post, MirrorCreated: MirrorCreated, + QuoteCreated: QuoteCreated, } // ************************************************************************* @@ -101,6 +102,14 @@ pub mod Publications { pub block_timestamp: u64, } + #[derive(Drop, starknet::Event)] + pub struct QuoteCreated { + pub quoteParams: QuoteParams, + pub publication_id: u256, + pub transaction_executor: ContractAddress, + pub block_timestamp: u64, + } + // ************************************************************************* // EXTERNAL FUNCTIONS @@ -217,7 +226,9 @@ pub mod Publications { quoteParams: QuoteParams, profile_contract_address: ContractAddress ) -> u256 { - let pubIdAssigned = self + let ref_quoteParams = quoteParams.clone(); + + let pub_id_assigned = self ._createReferencePublication( quoteParams.profile_address, quoteParams.content_URI, @@ -226,7 +237,17 @@ pub mod Publications { PublicationType::Quote, profile_contract_address ); - pubIdAssigned + + self + .emit( + QuoteCreated { + quoteParams: ref_quoteParams, + publication_id: pub_id_assigned, + transaction_executor: quoteParams.profile_address, + block_timestamp: get_block_timestamp(), + } + ); + pub_id_assigned } // ************************************************************************* // GETTERS From 3017b424938fbe5e56033323a52462ebc7db1e1f Mon Sep 17 00:00:00 2001 From: EjembiEmmanuel Date: Fri, 14 Jun 2024 11:14:49 +0000 Subject: [PATCH 5/5] test(quote): extend test cases test multiple usesrs quoting a post test `root_profile_address` test `pointed_profile_address` --- tests/test_publication.cairo | 80 +++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/tests/test_publication.cairo b/tests/test_publication.cairo index 7850700..b09ff50 100644 --- a/tests/test_publication.cairo +++ b/tests/test_publication.cairo @@ -272,7 +272,7 @@ fn test_quote() { _, user_one_profile_address, user_two_profile_address, - _, + user_three_profile_address, user_one_first_post_pointed_pub_id, ) = __setup__(); @@ -301,6 +301,84 @@ fn test_quote() { stop_prank( CheatTarget::Multiple(array![publication_contract_address, profile_contract_address]), ); + + start_prank( + CheatTarget::Multiple(array![publication_contract_address, profile_contract_address]), + USER_TWO.try_into().unwrap() + ); + let user_two_quote_content_URI = "ipfs://QmSkDCsS32eLpcymxtn1cEn7Rc5hfefLBgfvZysdjbezo/"; + + let user_two_quote_params = QuoteParams { + profile_address: user_three_profile_address, + content_URI: user_two_quote_content_URI, + pointed_profile_address: user_one_profile_address, + pointed_pub_id: user_one_first_post_pointed_pub_id + }; + // user 2 publish quote to user 3 profile + let user_two_quote_pub_id = publication_dispatcher + .quote(user_two_quote_params, profile_contract_address); + + let publication_type = publication_dispatcher + .get_publication_type(user_three_profile_address, user_two_quote_pub_id); + assert(publication_type == PublicationType::Quote, 'invalid pub_type'); + + let user_one_publication_root_id = publication_dispatcher + .get_publication(user_two_profile_address, quote_pub_id) + .root_profile_address; + let user_two_publication_root_id = publication_dispatcher + .get_publication(user_three_profile_address, user_two_quote_pub_id) + .root_profile_address; + assert(user_one_publication_root_id == user_two_publication_root_id, 'Invalid root_id'); + + stop_prank( + CheatTarget::Multiple(array![publication_contract_address, profile_contract_address]), + ); +} + +#[test] +fn test_quote_pointed_profile_address() { + let ( + _, + _, + profile_contract_address, + publication_contract_address, + _, + _, + user_one_profile_address, + user_two_profile_address, + _, + user_one_first_post_pointed_pub_id, + ) = + __setup__(); + let publication_dispatcher = IKarstPublicationsDispatcher { + contract_address: publication_contract_address + }; + start_prank( + CheatTarget::Multiple(array![publication_contract_address, profile_contract_address]), + USER_ONE.try_into().unwrap() + ); + let quote_content_URI = "ipfs://QmSkDCsS32eLpcymxtn1cEn7Rc5hfefLBgfvZysddefzp/"; + + let quote_params = QuoteParams { + profile_address: user_two_profile_address, + content_URI: quote_content_URI, + pointed_profile_address: user_one_profile_address, + pointed_pub_id: user_one_first_post_pointed_pub_id + }; + + start_prank(CheatTarget::One(publication_contract_address), USER_ONE.try_into().unwrap()); + let profileDispatcher = IKarstProfileDispatcher { contract_address: profile_contract_address }; + + publication_dispatcher.quote(quote_params, profile_contract_address); + + let pointed_profile = profileDispatcher.get_profile(user_one_profile_address); + + assert( + pointed_profile.profile_address == user_one_profile_address, + 'Invalid Pointed Profile Address' + ); + + stop_prank(CheatTarget::One(publication_contract_address),); } #[test]