Skip to content

Commit

Permalink
Merge pull request #680 from hats-finance/feat/oauth
Browse files Browse the repository at this point in the history
V3 Fixes
  • Loading branch information
fonstack authored May 7, 2024
2 parents 8cd96ce + 4aeebd2 commit b68ebc9
Show file tree
Hide file tree
Showing 10 changed files with 1,293 additions and 1,389 deletions.
355 changes: 94 additions & 261 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/shared/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hats.finance/shared",
"version": "1.1.92",
"version": "1.1.94",
"description": "",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
6 changes: 4 additions & 2 deletions packages/shared/src/utils/payouts.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ export const getExecutePayoutSafeTransaction = async (

const beneficiariesJointPercentage = beneficiariesToIterate
.reduce((acc, beneficiary) => {
const existingBeneficiary = acc.find((b) => b.beneficiary === beneficiary.beneficiary);
const existingBeneficiary = acc.find((b) => b.beneficiary.toLowerCase() === beneficiary.beneficiary.toLowerCase());
if (existingBeneficiary) {
existingBeneficiary.percentageOfPayout = truncate(
+truncate(+existingBeneficiary.percentageOfPayout, 4) + +truncate(+beneficiary.percentageOfPayout, 4),
Expand Down Expand Up @@ -288,7 +288,9 @@ export const getAllPayoutsWithData = async (env: "all" | "testnet" | "mainnet" =
for (let i = 0; i < subgraphsData.length; i++) {
const chainId = subgraphsData[i].chainId;

if (!subgraphsData[i].request.data || !subgraphsData[i].request.data.data.payouts) continue;
if (!subgraphsData[i].request.data) continue;
if (!subgraphsData[i].request.data?.data) continue;
if (!subgraphsData[i].request.data || !subgraphsData[i].request.data?.data?.payouts) continue;

for (const payout of subgraphsData[i].request.data.data.payouts) {
payouts.push({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ export const SplitPayoutBeneficiaryForm = ({
const percentageToPayOfTheVault = useWatch({ control, name: `percentageToPay` });
const percentageOfPayout = useWatch({ control, name: `beneficiaries.${index}.percentageOfPayout` });
const usingPointingSystem = useWatch({ control, name: `usingPointingSystem` });
const stopAutocalculation = useWatch({ control, name: `stopAutocalculation` });
const constraints = useWatch({ control, name: `rewardsConstraints`, defaultValue: [] });

const beneficiarySubmission = committeeSubmissions?.find((sub) => sub.subId === beneficiaries[index]?.submissionData?.subId);

Expand Down Expand Up @@ -77,6 +79,22 @@ export const SplitPayoutBeneficiaryForm = ({
setValue(`beneficiaries.${index}.nftUrl`, selectedSeverityData["nft-metadata"].image as any, { shouldValidate: true });
});

// Change points when severity changes (points sysmtem only)
const severity = useWatch({ control, name: `beneficiaries.${index}.severity` });
useOnChange(severity, (newSelected, prevSelected) => {
if (!usingPointingSystem) return;
if (newSelected === undefined) return;
if (newSelected === prevSelected) return;
if (!constraints) return;
if (stopAutocalculation) return;

const sevInfo = constraints.find(
(constraint) => constraint.severity.toLowerCase() === beneficiaries[index].severity.toLowerCase()
);
const defaultPoints = sevInfo?.points ? `${sevInfo.points.value.first}` : "";
setValue<any>(`beneficiaries.${index}.percentageOfPayout` as any, defaultPoints, { shouldValidate: true });
});

const getMoreOptions = () => {
if (beneficiariesCount === undefined) return [];
if (beneficiariesCount > 1 && !readOnly && !isPayoutCreated) {
Expand Down Expand Up @@ -184,7 +202,8 @@ export const SplitPayoutBeneficiaryForm = ({
{...register(`beneficiaries.${index}.percentageOfPayout`)}
label={usingPointingSystem ? t("Payouts.points") : t("Payouts.percentageToPayLabel")}
placeholder={usingPointingSystem ? t("Payouts.points") : t("Payouts.percentageToPayLabel")}
onKeyDown={!usingPointingSystem ? () => setValue<any>("stopAutocalculation", true) : undefined}
// onKeyDown={!usingPointingSystem ? () => setValue<any>("stopAutocalculation", true) : undefined}
onKeyDown={() => setValue<any>("stopAutocalculation", true)}
disabled={isPayoutCreated && !readOnly}
readOnly={readOnly}
type="number"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,11 @@ export const SubmissionsListPage = () => {
if (!vault.description || !vault.description.severities) return;

if (vault.destroyed) {
alert("This vault is destroyed and can't be used to create a payout.");
await confirm({
title: t("alert"),
description: t("vaultDestroyedCantCreatePayout"),
confirmText: t("ok"),
});
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,12 @@ import InfoIcon from "@mui/icons-material/InfoOutlined";
import { Button, FormInput } from "components";
import { RC_TOOLTIP_OVERLAY_INNER_STYLE } from "constants/constants";
import { useEnhancedFormContext } from "hooks/form/useEnhancedFormContext";
import { useVaults } from "hooks/subgraph/vaults/useVaults";
import { useIsGovMember } from "hooks/useIsGovMember";
import { useIsReviewer } from "hooks/useIsReviewer";
import Tooltip from "rc-tooltip";
import { useContext, useEffect, useState } from "react";
import { Control, FormProvider, useForm, useWatch } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { appChains } from "settings";
import { toFixedIfNecessary } from "utils/amounts.utils";
import { getEditedDescriptionYupSchema } from "../../formSchema";
import { VaultEditorFormContext } from "../../store";
Expand Down Expand Up @@ -63,39 +61,6 @@ const VaultParametersFormStatusCard = ({ statusCardFormDefaultData, onSubmit }:

const VaultParametersFormOnVaultEditor = () => {
const { allFormDisabled } = useContext(VaultEditorFormContext);
const { masters } = useVaults();
const methodsToUse = useEnhancedFormContext<IEditedVaultDescription>();

const chainId = useWatch({ control: methodsToUse.control, name: "committee.chainId" });

// Set default values for the fixed splits. Getting it from subgraph
useEffect(() => {
const params = methodsToUse.getValues("parameters");
// If we have alredy set a value, we don't want to override it
const hasValue = params.fixedHatsGovPercetange !== undefined && params.fixedHatsGovPercetange !== null;
if (hasValue) return;

const registryAddress = appChains[Number(chainId)]?.vaultsCreatorContract;
if (registryAddress && masters) {
const master = masters.find(
(master) => master.address.toLowerCase() === registryAddress.toLowerCase() && master.chainId === Number(chainId)
);

console.log(masters);

if (master) {
const hatsRewardSplit = Number(master.defaultHackerHatRewardSplit) / 100;
const hatsGovernanceSplit = Number(master.defaultGovernanceHatRewardSplit) / 100;
const committeeControlledSplit = 100 - hatsRewardSplit - hatsGovernanceSplit;
console.log("OVERRIDE", hatsRewardSplit, hatsGovernanceSplit, committeeControlledSplit);

if (!isNaN(committeeControlledSplit))
methodsToUse.setValue("parameters.fixedCommitteeControlledPercetange", committeeControlledSplit);
if (!isNaN(hatsGovernanceSplit)) methodsToUse.setValue("parameters.fixedHatsGovPercetange", hatsGovernanceSplit);
if (!isNaN(hatsRewardSplit)) methodsToUse.setValue("parameters.fixedHatsRewardPercetange", hatsRewardSplit);
}
}
}, [chainId, masters, methodsToUse]);

return <VaultParametersFormShared disabled={allFormDisabled} />;
};
Expand Down Expand Up @@ -159,24 +124,28 @@ function VaultParametersFormShared({ blockMaxBounty, disabled = false }: { block
return (
<StyledVaultEditorForm withoutMargin noPadding>
<StyledVaultParametersForm>
<p className="section-title">{t("maxBounty")}</p>
<div
className="helper-text"
dangerouslySetInnerHTML={{ __html: t("vaultEditorMaxBountyExplanation", { max: version === "v3" ? "100" : "90" }) }}
/>

<div className="input">
<FormInput
{...methodsToUse.register(`parameters.maxBountyPercentage`, { valueAsNumber: true })}
disabled={(blockMaxBounty || disabled || !canEditFixed) && version === "v3"}
type="whole-number"
label={t("VaultEditor.vault-parameters.maxBountyPercentage", { max: version === "v3" ? "100" : "90" })}
placeholder={t("VaultEditor.vault-parameters.maxBountyPercentage-placeholder", {
max: version === "v3" ? "100" : "90",
})}
colorable
/>
</div>
{canEditFixed && (
<>
<p className="section-title">{t("maxBounty")}</p>
<div
className="helper-text"
dangerouslySetInnerHTML={{ __html: t("vaultEditorMaxBountyExplanation", { max: version === "v3" ? "100" : "90" }) }}
/>

<div className="input">
<FormInput
{...methodsToUse.register(`parameters.maxBountyPercentage`, { valueAsNumber: true })}
disabled={(blockMaxBounty || disabled || !canEditFixed) && version === "v3"}
type="whole-number"
label={t("VaultEditor.vault-parameters.maxBountyPercentage", { max: version === "v3" ? "100" : "90" })}
placeholder={t("VaultEditor.vault-parameters.maxBountyPercentage-placeholder", {
max: version === "v3" ? "100" : "90",
})}
colorable
/>
</div>
</>
)}

<p className="section-title">{t("bountySplit")}</p>
<div className="helper-text" dangerouslySetInnerHTML={{ __html: t("vaultEditorBountySplitExplanation") }} />
Expand Down Expand Up @@ -215,7 +184,7 @@ function VaultParametersFormShared({ blockMaxBounty, disabled = false }: { block
<div className="formInput">
<FormInput
{...methodsToUse.register("parameters.immediatePercentage")}
disabled={disabled}
disabled={disabled || !canEditFixed}
onKeyUp={revalidateSplit}
onBlur={revalidateSplit}
type="number"
Expand Down Expand Up @@ -251,7 +220,7 @@ function VaultParametersFormShared({ blockMaxBounty, disabled = false }: { block
<div className="formInput">
<FormInput
{...methodsToUse.register("parameters.vestedPercentage")}
disabled={disabled}
disabled={disabled || !canEditFixed}
onKeyUp={revalidateSplit}
onBlur={revalidateSplit}
type="number"
Expand Down Expand Up @@ -287,7 +256,7 @@ function VaultParametersFormShared({ blockMaxBounty, disabled = false }: { block
<div className="formInput">
<FormInput
{...methodsToUse.register("parameters.committeePercentage")}
disabled={disabled}
disabled={disabled || !canEditFixed}
onKeyUp={revalidateSplit}
onBlur={revalidateSplit}
type="number"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import { useCallback, useEffect, useState } from "react";
import { FormProvider, useFieldArray, useForm, useWatch } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { useNavigate, useParams, useSearchParams } from "react-router-dom";
import { BASE_SERVICE_URL } from "settings";
import { BASE_SERVICE_URL, appChains } from "settings";
import { isValidIpfsHash } from "utils/ipfs.utils";
import { useAccount } from "wagmi";
import { checkIfAddressCanEditTheVault } from "../utils";
Expand All @@ -53,6 +53,7 @@ import { useVaultEditorSteps } from "./useVaultEditorSteps";

const VaultEditorFormPage = () => {
const { t } = useTranslation();
const { masters } = useVaults();
const { address } = useAccount();
const { allVaults } = useVaults();

Expand Down Expand Up @@ -689,6 +690,36 @@ const VaultEditorFormPage = () => {
}
};

const chainId = useWatch({ control, name: "committee.chainId" });
// Set default values for the fixed splits. Getting it from subgraph
useEffect(() => {
const params = getValues("parameters");
if (!params) return;
// If we have alredy set a value, we don't want to override it
const hasValue = params.fixedHatsGovPercetange !== undefined && params.fixedHatsGovPercetange !== null;
if (hasValue) return;

const registryAddress = appChains[Number(chainId)]?.vaultsCreatorContract;
if (registryAddress && masters) {
const master = masters.find(
(master) => master.address.toLowerCase() === registryAddress.toLowerCase() && master.chainId === Number(chainId)
);

if (master) {
const hatsRewardSplit = Number(master.defaultHackerHatRewardSplit) / 100;
const hatsGovernanceSplit = Number(master.defaultGovernanceHatRewardSplit) / 100;
const committeeControlledSplit = 100 - hatsRewardSplit - hatsGovernanceSplit;
console.log("OVERRIDE", hatsRewardSplit, hatsGovernanceSplit, committeeControlledSplit);

if (!isNaN(committeeControlledSplit))
setValue("parameters.fixedCommitteeControlledPercetange", committeeControlledSplit, { shouldDirty: true });
if (!isNaN(hatsGovernanceSplit))
setValue("parameters.fixedHatsGovPercetange", hatsGovernanceSplit, { shouldDirty: true });
if (!isNaN(hatsRewardSplit)) setValue("parameters.fixedHatsRewardPercetange", hatsRewardSplit, { shouldDirty: true });
}
}
}, [chainId, masters, setValue, getValues]);

if (loadingEditSession || loadingSteps || !currentStepInfo || !currentSectionInfo) {
return <Loading fixed extraText={`${t("loadingVaultEditor")}...`} />;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ export const AllEditorSections: IEditorSections = {
component: VaultParametersForm,
formFields: ["parameters"],
backButtonTextKey: { creation: "backToVaultDescription" },
isAdvanced: true,
},
{
id: "preview",
Expand Down
8 changes: 6 additions & 2 deletions packages/web/src/pages/VaultEditor/vaultEditorService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,12 @@ export async function getEditSessionData(editSessionId: string): Promise<IEdited
signerOrProvider: getProvider({ chainId: editSession.chainId }),
});

const maxBountyPercentage = await vaultContract.maxBounty();
(editSession as IEditedSessionResponse).editedDescription.parameters.maxBountyPercentage = maxBountyPercentage / 100;
try {
const maxBountyPercentage = await vaultContract.maxBounty();
(editSession as IEditedSessionResponse).editedDescription.parameters.maxBountyPercentage = maxBountyPercentage / 100;
} catch (error) {
console.log(error);
}
}

return editSession;
Expand Down
Loading

0 comments on commit b68ebc9

Please # to comment.