-
Notifications
You must be signed in to change notification settings - Fork 175
Expand file tree
/
Copy pathpayoutStrategy.ts
More file actions
125 lines (108 loc) · 3.6 KB
/
payoutStrategy.ts
File metadata and controls
125 lines (108 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { BigNumber, Signer } from "ethers";
import { useEffect, useMemo, useState } from "react";
import { directPayoutStrategyFactoryContract } from "../contracts";
import { MatchingStatsData } from "../types";
import { useApplicationsByRoundId } from "../../common/useApplicationsByRoundId";
import { Round } from "../types";
/**
* Deploys a QFVotingStrategy contract by invoking the
* create on QuadraticFundingVotingStrategyFactory contract
*
* @param signerOrProvider
* @returns
*/
/**
* @param signerOrProvider
* @returns the factory address.
*/
export const getDirectPayoutFactoryAddress = async (
signerOrProvider: Signer
): Promise<{ payoutContractAddress: string }> => {
const chainId = await signerOrProvider.getChainId();
const factoryAddress = directPayoutStrategyFactoryContract(chainId).address;
return {
payoutContractAddress: factoryAddress,
};
};
interface GroupedProjects {
all: MatchingStatsData[];
paid: MatchingStatsData[];
unpaid: MatchingStatsData[];
}
/**
* Groups projects by payment status
* @param roundId Round ID
* @param chainId Chain ID
* @returns GroupedProjects
*/
export const useGroupProjectsByPaymentStatus = (
chainId: number,
round: Round
): GroupedProjects => {
const [groupedProjects, setGroupedProjects] = useState<GroupedProjects>({
paid: [],
all: [],
unpaid: [],
});
const { data: applications } = useApplicationsByRoundId(round.id);
const paidProjects = applications
?.filter((application) => application.distributionTransaction !== null)
.map((application) => ({
projectId: application.projectId,
distributionTransaction: application.distributionTransaction,
}));
const paidProjectIds = paidProjects?.map((project) => project.projectId);
const allProjects: MatchingStatsData[] = useMemo(
() =>
round.matchingDistribution?.map((matchingStatsData) => {
const anchorAddress = applications?.find(
(application) => application.projectId === matchingStatsData.projectId
)?.anchorAddress;
return {
projectName: matchingStatsData.projectName,
contributionsCount: matchingStatsData.contributionsCount,
matchPoolPercentage: matchingStatsData.matchPoolPercentage,
projectId: matchingStatsData.projectId,
applicationId: matchingStatsData.applicationId,
anchorAddress,
matchAmountInToken: BigNumber.from(
matchingStatsData.matchAmountInToken
),
originalMatchAmountInToken: BigNumber.from(
matchingStatsData.originalMatchAmountInToken
),
projectPayoutAddress: matchingStatsData.projectPayoutAddress,
};
}) ?? [],
[round.matchingDistribution, applications]
);
useEffect(() => {
async function fetchData() {
const groupedProjectsTmp: GroupedProjects = {
all: allProjects,
paid: [],
unpaid: [],
};
allProjects?.forEach((project) => {
const projectStatus = paidProjectIds?.includes(project.projectId)
? "paid"
: "unpaid";
let tmpProject = project;
if (projectStatus === "paid") {
const hash = paidProjects?.find(
(p) => p.projectId === project.projectId
)?.distributionTransaction;
tmpProject = {
...project,
hash: hash || undefined,
status: "",
};
}
groupedProjectsTmp[projectStatus].push(tmpProject);
});
setGroupedProjects(groupedProjectsTmp);
}
fetchData();
}, [allProjects, paidProjects, paidProjectIds]);
return groupedProjects;
};