From 27d29dc8094e781f71e0557de6758d8664b2560c Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 10:39:28 +0200 Subject: [PATCH 1/8] fix(238): add time to settlement period to automatic acceptance --- pallets/funding/src/functions.rs | 2 +- pallets/funding/src/tests.rs | 48 +++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/pallets/funding/src/functions.rs b/pallets/funding/src/functions.rs index a2ff23ecb..5957fa485 100644 --- a/pallets/funding/src/functions.rs +++ b/pallets/funding/src/functions.rs @@ -616,7 +616,7 @@ impl Pallet { project_id, project_details, SuccessReason::ReachedTarget, - 1u32.into(), + T::SuccessToSettlementTime::get() ) } } diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index b276caa41..509d7bf22 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -1878,6 +1878,8 @@ mod evaluation_round_success { community_funding_project.buy_for_retail_users(contributions).unwrap(); let finished_project = community_funding_project.finish_funding(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); + test_env.advance_time(10).unwrap(); let project_id = finished_project.project_id; let actual_reward_balances = test_env.in_ext(|| { @@ -1922,6 +1924,8 @@ mod evaluation_round_success { let prev_free_plmc = test_env.get_free_plmc_balances_for(evaluators.clone()); remainder_funding_project.end_funding(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); + test_env.advance_time(10).unwrap(); let post_unbond_amounts: UserToPLMCBalance = prev_reserved_plmc.iter().map(|(evaluator, _amount)| (*evaluator, Zero::zero())).collect(); @@ -2466,7 +2470,7 @@ mod auction_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); - + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); @@ -2528,7 +2532,7 @@ mod auction_round_success { ); }) } - test_env.advance_time(1u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -2586,7 +2590,7 @@ mod auction_round_success { let stored_bids = test_env.in_ext(|| Bids::::iter_prefix_values((project_id,)).collect::>()); - test_env.advance_time(1u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -2637,7 +2641,8 @@ mod auction_round_success { assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); - test_env.advance_time(10u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); + test_env.advance_time(10u64.into()).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); @@ -2700,7 +2705,7 @@ mod auction_round_success { community_contributions, remainder_contributions, ); - + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); @@ -2743,8 +2748,7 @@ mod auction_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); - - test_env.advance_time(1u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -2793,6 +2797,7 @@ mod auction_round_success { community_contributions, remainder_contributions, ); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -2843,7 +2848,7 @@ mod auction_round_success { community_contributions, remainder_contributions, ); - + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(15u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); @@ -3811,7 +3816,7 @@ mod community_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); - + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); @@ -3873,7 +3878,8 @@ mod community_round_success { ); }) } - test_env.advance_time(1u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); + let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -3930,8 +3936,8 @@ mod community_round_success { assert_eq!(details.cleanup, Cleaner::NotReady); let stored_contributions = test_env.in_ext(|| Contributions::::iter_prefix_values((project_id,)).collect::>()); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); - test_env.advance_time(1u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -3981,6 +3987,7 @@ mod community_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -4040,7 +4047,7 @@ mod community_round_success { let price = finished_project.get_project_details().weighted_average_price.unwrap(); let contribution_locked_plmc = calculate_contributed_plmc_spent(community_contributions, price); - + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); @@ -4080,8 +4087,8 @@ mod community_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); - test_env.advance_time(1u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -4137,6 +4144,7 @@ mod community_round_success { community_contributions, remainder_contributions, ); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -4190,6 +4198,7 @@ mod community_round_success { community_contributions, remainder_contributions, ); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(15u64).unwrap(); let details = finished_project.get_project_details(); @@ -4493,6 +4502,7 @@ mod remainder_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -4575,7 +4585,8 @@ mod remainder_round_success { ); }) } - test_env.advance_time(1u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); + let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -4672,7 +4683,8 @@ mod remainder_round_success { ); }) } - test_env.advance_time(1u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); + let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -4766,6 +4778,7 @@ mod remainder_round_success { Contributions::::iter_prefix_values((project_id, BIDDER_1)).next().unwrap(); vec![evaluator_contribution.clone(), buyer_contribution.clone(), bidder_contribution.clone()] }); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -4830,6 +4843,7 @@ mod remainder_round_success { let remainder_locked_plmc = calculate_contributed_plmc_spent(remainder_contributions, price); let all_plmc_locks = merge_add_mappings_by_user(vec![auction_locked_plmc, community_locked_plmc, remainder_locked_plmc]); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -4870,8 +4884,8 @@ mod remainder_round_success { let details = finished_project.get_project_details(); assert_eq!(details.status, ProjectStatus::FundingSuccessful); assert_eq!(details.cleanup, Cleaner::NotReady); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); - test_env.advance_time(1u64).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Initialized(PhantomData))); @@ -4940,6 +4954,7 @@ mod remainder_round_success { community_contributions, remainder_contributions, ); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(10u64).unwrap(); let details = finished_project.get_project_details(); @@ -5002,6 +5017,7 @@ mod remainder_round_success { community_contributions, remainder_contributions, ); + test_env.advance_time(::SuccessToSettlementTime::get()).unwrap(); test_env.advance_time(15u64).unwrap(); let details = finished_project.get_project_details(); From b4d495fd1546c7f5e6717e92943d1abd8267990b Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 10:40:29 +0200 Subject: [PATCH 2/8] fix(238): fmt --- pallets/funding/src/functions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/funding/src/functions.rs b/pallets/funding/src/functions.rs index 5957fa485..5cea64dfd 100644 --- a/pallets/funding/src/functions.rs +++ b/pallets/funding/src/functions.rs @@ -616,7 +616,7 @@ impl Pallet { project_id, project_details, SuccessReason::ReachedTarget, - T::SuccessToSettlementTime::get() + T::SuccessToSettlementTime::get(), ) } } From 233c5e7b878e37b832406a4328fdd0fbce5985e3 Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 16:38:04 +0200 Subject: [PATCH 3/8] fix(238): test fix --- pallets/funding/src/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index 509d7bf22..e99f04954 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -2924,7 +2924,7 @@ mod auction_round_success { community_funding_project.buy_for_retail_users(community_contributions).unwrap(); let finished_project = community_funding_project.finish_funding(); - test_env.advance_time(10u64).unwrap(); + test_env.advance_time(::SuccessToSettlementTime::get() + 1).unwrap(); let details = finished_project.get_project_details(); assert_eq!(details.cleanup, Cleaner::Success(CleanerState::Finished(PhantomData))); From 12e44834d911859436f318c2aee28f36cd77c18b Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 15:00:24 +0200 Subject: [PATCH 4/8] feat(240): test written. impl missing. For some reason test passes already --- pallets/funding/src/tests.rs | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index e99f04954..769eebd52 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -2953,6 +2953,74 @@ mod auction_round_success { .is_some(); assert!(!schedule_exists); } + + #[test] + pub fn bid_funding_assets_are_paid_automatically_to_issuer() { + let test_env = TestEnvironment::new(); + let project = default_project(test_env.get_new_nonce()); + let issuer = ISSUER; + let evaluations = default_evaluations(); + let bids = generate_bids_from_total_usd(project.total_allocation_size, project.minimum_price); + let community_contributions = vec![]; + let remainder_contributions = vec![]; + + let finished_project = FinishedProject::new_with( + &test_env, + project, + issuer, + evaluations, + bids, + community_contributions, + remainder_contributions, + ); + + let final_bid_payouts = test_env.in_ext(|| { + Bids::::iter_prefix_values((finished_project.project_id,)) + .map(|bid| (bid.bidder, bid.funding_asset_amount_locked, bid.funding_asset.to_statemint_id())) + .collect::() + }); + + let prev_issuer_funding_balance = test_env.get_free_statemint_asset_balances_for( + final_bid_payouts[0].2, + vec![issuer.clone()], + )[0].1; + let prev_bidders_funding_balances = test_env.get_free_statemint_asset_balances_for( + final_bid_payouts[0].2, + final_bid_payouts.iter().map(|(acc, _, _)| acc.clone()).collect::>(), + ); + let prev_total_bidder_balance = prev_bidders_funding_balances + .iter() + .map(|(_, balance, _)| balance) + .sum::>(); + + test_env.advance_time(::SuccessToSettlementTime::get() + 1).unwrap(); + assert_eq!( + finished_project.get_project_details().cleanup, + Cleaner::Success(CleanerState::Finished(PhantomData)) + ); + + let post_issuer_funding_balance = test_env.get_free_statemint_asset_balances_for( + final_bid_payouts[0].2, + vec![issuer.clone()], + )[0].1; + let post_bidders_funding_balances = test_env.get_free_statemint_asset_balances_for( + final_bid_payouts[0].2, + final_bid_payouts.iter().map(|(acc, _, _)| acc.clone()).collect::>(), + ); + let post_total_bidder_balance = post_bidders_funding_balances + .iter() + .map(|(_, balance, _)| balance) + .sum::>(); + + let issuer_funding_delta = post_issuer_funding_balance - prev_issuer_funding_balance; + let bidders_funding_delta = prev_total_bidder_balance - post_total_bidder_balance; + + assert_eq!(issuer_funding_delta, bidders_funding_delta); + + for (_bidder, balance, _asset) in post_bidders_funding_balances { + assert_eq!(balance, 0); + } + } } mod auction_round_failure { From b5fe75901b0af18bcae2e23cadc0590b139967fd Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 16:00:40 +0200 Subject: [PATCH 5/8] feat(240): impl written and test passing. Previous pass due to checking user balance instead of the project pot --- pallets/funding/src/functions.rs | 38 ++++++++++++++++++++++++++++---- pallets/funding/src/impls.rs | 8 +------ pallets/funding/src/tests.rs | 19 ++++++++++++++-- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/pallets/funding/src/functions.rs b/pallets/funding/src/functions.rs index 5cea64dfd..2891fe277 100644 --- a/pallets/funding/src/functions.rs +++ b/pallets/funding/src/functions.rs @@ -1517,11 +1517,41 @@ impl Pallet { } pub fn do_payout_bid_funds_for( - _caller: AccountIdOf, - _project_id: T::ProjectIdentifier, - _bidder: AccountIdOf, - _bid_id: StorageItemIdOf, + caller: AccountIdOf, + project_id: T::ProjectIdentifier, + bidder: AccountIdOf, + bid_id: StorageItemIdOf, ) -> Result<(), DispatchError> { + // * Get variables * + let project_metadata = ProjectsMetadata::::get(project_id).ok_or(Error::::ProjectInfoNotFound)?; + let project_details = ProjectsDetails::::get(project_id).ok_or(Error::::ProjectInfoNotFound)?; + let mut bid = Bids::::get((project_id, bidder.clone(), bid_id)).ok_or(Error::::BidNotFound)?; + + + // * Validity checks * + ensure!( + project_details.status == ProjectStatus::FundingSuccessful && + matches!(bid.status, BidStatus::Accepted | BidStatus::PartiallyAccepted(..)), + Error::::NotAllowed + ); + + // * Calculate variables * + let issuer = project_details.issuer; + let project_pot = Self::fund_account_id(project_id); + let payout_amount = bid.funding_asset_amount_locked; + let payout_asset = bid.funding_asset; + + // * Update storage * + T::FundingCurrency::transfer( + payout_asset.to_statemint_id(), + &project_pot, + &issuer, + payout_amount, + Preservation::Expendable, + )?; + bid.funds_released = true; + Bids::::insert((project_id, bidder.clone(), bid_id), bid); + Ok(()) } } diff --git a/pallets/funding/src/impls.rs b/pallets/funding/src/impls.rs index c61ceb9d7..6308ab931 100644 --- a/pallets/funding/src/impls.rs +++ b/pallets/funding/src/impls.rs @@ -615,14 +615,8 @@ fn issuer_funding_payout_one_bid(project_id: T::ProjectIdentifier) -> error: e, }), }; + (Weight::zero(), remaining_bids.count() as u64) - bid.funds_released = true; - - Bids::::insert((project_id, bid.bidder.clone(), bid.id), bid); - - // (Weight::zero(), remaining_bids.count() as u64) - // TODO: Remove this when function is implemented - (Weight::zero(), 0u64) } else { (Weight::zero(), 0u64) } diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index 769eebd52..e01d9a3d8 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -2973,12 +2973,13 @@ mod auction_round_success { community_contributions, remainder_contributions, ); - + let project_id = finished_project.get_project_id(); let final_bid_payouts = test_env.in_ext(|| { Bids::::iter_prefix_values((finished_project.project_id,)) .map(|bid| (bid.bidder, bid.funding_asset_amount_locked, bid.funding_asset.to_statemint_id())) .collect::() }); + let total_expected_bid_payout = final_bid_payouts.iter().map(|bid| bid.1.clone()).sum::>(); let prev_issuer_funding_balance = test_env.get_free_statemint_asset_balances_for( final_bid_payouts[0].2, @@ -2992,6 +2993,10 @@ mod auction_round_success { .iter() .map(|(_, balance, _)| balance) .sum::>(); + let prev_project_pot_funding_balance = test_env.get_free_statemint_asset_balances_for( + final_bid_payouts[0].2, + vec![Pallet::::fund_account_id(project_id)], + )[0].1; test_env.advance_time(::SuccessToSettlementTime::get() + 1).unwrap(); assert_eq!( @@ -3011,15 +3016,25 @@ mod auction_round_success { .iter() .map(|(_, balance, _)| balance) .sum::>(); + let post_project_pot_funding_balance = test_env.get_free_statemint_asset_balances_for( + final_bid_payouts[0].2, + vec![Pallet::::fund_account_id(project_id)], + )[0].1; let issuer_funding_delta = post_issuer_funding_balance - prev_issuer_funding_balance; let bidders_funding_delta = prev_total_bidder_balance - post_total_bidder_balance; + let project_pot_funding_delta = prev_project_pot_funding_balance - post_project_pot_funding_balance; - assert_eq!(issuer_funding_delta, bidders_funding_delta); + assert_eq!(issuer_funding_delta, total_expected_bid_payout); + assert_eq!(issuer_funding_delta, project_pot_funding_delta); for (_bidder, balance, _asset) in post_bidders_funding_balances { assert_eq!(balance, 0); } + // 1_052_631_5_789_473_682 + // 894_736_8_421_052_630 + + assert_eq!(post_project_pot_funding_balance, 0u128); } } From 50d75187cfb0b943e377a15e5615ec8d2ff3ebdb Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 16:02:31 +0200 Subject: [PATCH 6/8] chore(240): fmt --- pallets/funding/src/functions.rs | 1 - pallets/funding/src/impls.rs | 1 - pallets/funding/src/tests.rs | 47 ++++++++++++++------------------ 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/pallets/funding/src/functions.rs b/pallets/funding/src/functions.rs index 2891fe277..2cb1b2b15 100644 --- a/pallets/funding/src/functions.rs +++ b/pallets/funding/src/functions.rs @@ -1527,7 +1527,6 @@ impl Pallet { let project_details = ProjectsDetails::::get(project_id).ok_or(Error::::ProjectInfoNotFound)?; let mut bid = Bids::::get((project_id, bidder.clone(), bid_id)).ok_or(Error::::BidNotFound)?; - // * Validity checks * ensure!( project_details.status == ProjectStatus::FundingSuccessful && diff --git a/pallets/funding/src/impls.rs b/pallets/funding/src/impls.rs index 6308ab931..d69c47753 100644 --- a/pallets/funding/src/impls.rs +++ b/pallets/funding/src/impls.rs @@ -616,7 +616,6 @@ fn issuer_funding_payout_one_bid(project_id: T::ProjectIdentifier) -> }), }; (Weight::zero(), remaining_bids.count() as u64) - } else { (Weight::zero(), 0u64) } diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index e01d9a3d8..e9d95ac82 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -2965,13 +2965,13 @@ mod auction_round_success { let remainder_contributions = vec![]; let finished_project = FinishedProject::new_with( - &test_env, - project, - issuer, - evaluations, - bids, - community_contributions, - remainder_contributions, + &test_env, + project, + issuer, + evaluations, + bids, + community_contributions, + remainder_contributions, ); let project_id = finished_project.get_project_id(); let final_bid_payouts = test_env.in_ext(|| { @@ -2979,24 +2979,22 @@ mod auction_round_success { .map(|bid| (bid.bidder, bid.funding_asset_amount_locked, bid.funding_asset.to_statemint_id())) .collect::() }); - let total_expected_bid_payout = final_bid_payouts.iter().map(|bid| bid.1.clone()).sum::>(); + let total_expected_bid_payout = + final_bid_payouts.iter().map(|bid| bid.1.clone()).sum::>(); - let prev_issuer_funding_balance = test_env.get_free_statemint_asset_balances_for( - final_bid_payouts[0].2, - vec![issuer.clone()], - )[0].1; + let prev_issuer_funding_balance = + test_env.get_free_statemint_asset_balances_for(final_bid_payouts[0].2, vec![issuer.clone()])[0].1; let prev_bidders_funding_balances = test_env.get_free_statemint_asset_balances_for( final_bid_payouts[0].2, final_bid_payouts.iter().map(|(acc, _, _)| acc.clone()).collect::>(), ); - let prev_total_bidder_balance = prev_bidders_funding_balances - .iter() - .map(|(_, balance, _)| balance) - .sum::>(); + let prev_total_bidder_balance = + prev_bidders_funding_balances.iter().map(|(_, balance, _)| balance).sum::>(); let prev_project_pot_funding_balance = test_env.get_free_statemint_asset_balances_for( final_bid_payouts[0].2, vec![Pallet::::fund_account_id(project_id)], - )[0].1; + )[0] + .1; test_env.advance_time(::SuccessToSettlementTime::get() + 1).unwrap(); assert_eq!( @@ -3004,22 +3002,19 @@ mod auction_round_success { Cleaner::Success(CleanerState::Finished(PhantomData)) ); - let post_issuer_funding_balance = test_env.get_free_statemint_asset_balances_for( - final_bid_payouts[0].2, - vec![issuer.clone()], - )[0].1; + let post_issuer_funding_balance = + test_env.get_free_statemint_asset_balances_for(final_bid_payouts[0].2, vec![issuer.clone()])[0].1; let post_bidders_funding_balances = test_env.get_free_statemint_asset_balances_for( final_bid_payouts[0].2, final_bid_payouts.iter().map(|(acc, _, _)| acc.clone()).collect::>(), ); - let post_total_bidder_balance = post_bidders_funding_balances - .iter() - .map(|(_, balance, _)| balance) - .sum::>(); + let post_total_bidder_balance = + post_bidders_funding_balances.iter().map(|(_, balance, _)| balance).sum::>(); let post_project_pot_funding_balance = test_env.get_free_statemint_asset_balances_for( final_bid_payouts[0].2, vec![Pallet::::fund_account_id(project_id)], - )[0].1; + )[0] + .1; let issuer_funding_delta = post_issuer_funding_balance - prev_issuer_funding_balance; let bidders_funding_delta = prev_total_bidder_balance - post_total_bidder_balance; From 7c7975a0a9b6e15d8150aacc1fc4c7dea8e57241 Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Thu, 10 Aug 2023 16:52:04 +0200 Subject: [PATCH 7/8] chore(240): fix warnings --- pallets/funding/src/functions.rs | 10 +++++++++- pallets/funding/src/impls.rs | 2 +- pallets/funding/src/lib.rs | 7 +++++++ pallets/funding/src/tests.rs | 20 ++++++++------------ 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pallets/funding/src/functions.rs b/pallets/funding/src/functions.rs index 2cb1b2b15..4501e1ad2 100644 --- a/pallets/funding/src/functions.rs +++ b/pallets/funding/src/functions.rs @@ -1523,7 +1523,6 @@ impl Pallet { bid_id: StorageItemIdOf, ) -> Result<(), DispatchError> { // * Get variables * - let project_metadata = ProjectsMetadata::::get(project_id).ok_or(Error::::ProjectInfoNotFound)?; let project_details = ProjectsDetails::::get(project_id).ok_or(Error::::ProjectInfoNotFound)?; let mut bid = Bids::::get((project_id, bidder.clone(), bid_id)).ok_or(Error::::BidNotFound)?; @@ -1551,6 +1550,15 @@ impl Pallet { bid.funds_released = true; Bids::::insert((project_id, bidder.clone(), bid_id), bid); + // * Emit events * + Self::deposit_event(Event::::BidFundingPaidOut { + project_id, + bidder: bidder.clone(), + id: bid_id, + amount: payout_amount, + caller, + }); + Ok(()) } } diff --git a/pallets/funding/src/impls.rs b/pallets/funding/src/impls.rs index d69c47753..13426d5d7 100644 --- a/pallets/funding/src/impls.rs +++ b/pallets/funding/src/impls.rs @@ -600,7 +600,7 @@ fn issuer_funding_payout_one_bid(project_id: T::ProjectIdentifier) -> let mut remaining_bids = project_bids.filter(|bid| !bid.funds_released); - if let Some(mut bid) = remaining_bids.next() { + if let Some(bid) = remaining_bids.next() { match Pallet::::do_payout_bid_funds_for( T::PalletId::get().into_account_truncating(), bid.project_id, diff --git a/pallets/funding/src/lib.rs b/pallets/funding/src/lib.rs index f83772274..5874c8c25 100644 --- a/pallets/funding/src/lib.rs +++ b/pallets/funding/src/lib.rs @@ -658,6 +658,13 @@ pub mod pallet { amount: BalanceOf, caller: AccountIdOf, }, + BidFundingPaidOut { + project_id: ProjectIdOf, + bidder: AccountIdOf, + id: StorageItemIdOf, + amount: BalanceOf, + caller: AccountIdOf, + }, } #[pallet::error] diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index e9d95ac82..99ecd7215 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -2903,7 +2903,7 @@ mod auction_round_success { let auctioning_project = AuctioningProject::new_with(&test_env, project, issuer, evaluations); let mut bidders_plmc = calculate_auction_plmc_spent(bids.clone()); - bidders_plmc.iter_mut().for_each(|(acc, amount)| *amount += get_ed()); + bidders_plmc.iter_mut().for_each(|(_acc, amount)| *amount += get_ed()); test_env.mint_plmc_to(bidders_plmc.clone()); let bidders_funding_assets = calculate_auction_funding_asset_spent(bids.clone()); @@ -2914,7 +2914,7 @@ mod auction_round_success { let community_funding_project = auctioning_project.start_community_funding(); let final_price = community_funding_project.get_project_details().weighted_average_price.unwrap(); let mut contributors_plmc = calculate_contributed_plmc_spent(community_contributions.clone(), final_price); - contributors_plmc.iter_mut().for_each(|(acc, amount)| *amount += get_ed()); + contributors_plmc.iter_mut().for_each(|(_acc, amount)| *amount += get_ed()); test_env.mint_plmc_to(contributors_plmc.clone()); let contributors_funding_assets = @@ -3017,18 +3017,14 @@ mod auction_round_success { .1; let issuer_funding_delta = post_issuer_funding_balance - prev_issuer_funding_balance; - let bidders_funding_delta = prev_total_bidder_balance - post_total_bidder_balance; let project_pot_funding_delta = prev_project_pot_funding_balance - post_project_pot_funding_balance; assert_eq!(issuer_funding_delta, total_expected_bid_payout); assert_eq!(issuer_funding_delta, project_pot_funding_delta); - for (_bidder, balance, _asset) in post_bidders_funding_balances { - assert_eq!(balance, 0); - } - // 1_052_631_5_789_473_682 - // 894_736_8_421_052_630 + assert_eq!(prev_total_bidder_balance, 0u128); + assert_eq!(post_total_bidder_balance, 0u128); assert_eq!(post_project_pot_funding_balance, 0u128); } } @@ -5053,9 +5049,9 @@ mod remainder_round_success { let merged_plmc_balances = generic_map_merge_reduce( vec![contributed_plmc_balances.clone(), bid_plmc_balances.clone()], - |(account, amount)| account.clone(), + |(account, _amount)| account.clone(), BalanceOf::::zero(), - |(account, amount), total| total + amount, + |(_account, amount), total| total + amount, ); test_env.advance_time((1 * DAYS + 1u32).into()).unwrap(); @@ -5122,9 +5118,9 @@ mod remainder_round_success { let merged_plmc_balances = generic_map_merge_reduce( vec![contributed_plmc_balances.clone(), bid_plmc_balances.clone()], - |(account, amount)| account.clone(), + |(account, _amount)| account.clone(), BalanceOf::::zero(), - |(account, amount), total| total + amount, + |(_account, amount), total| total + amount, ); for (contributor, amount) in merged_plmc_balances { From 260c27cf1e46c0a6cb5ff1fa5595f6d23e95541c Mon Sep 17 00:00:00 2001 From: Juan Ignacio Rios Date: Fri, 11 Aug 2023 17:46:41 +0200 Subject: [PATCH 8/8] chore(241): fmt --- pallets/funding/src/tests.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pallets/funding/src/tests.rs b/pallets/funding/src/tests.rs index 99ecd7215..63280d0b7 100644 --- a/pallets/funding/src/tests.rs +++ b/pallets/funding/src/tests.rs @@ -3022,7 +3022,6 @@ mod auction_round_success { assert_eq!(issuer_funding_delta, total_expected_bid_payout); assert_eq!(issuer_funding_delta, project_pot_funding_delta); - assert_eq!(prev_total_bidder_balance, 0u128); assert_eq!(post_total_bidder_balance, 0u128); assert_eq!(post_project_pot_funding_balance, 0u128);