import { useRef, useMemo } from "react"; import { Box, Typography, Link, TableCell, TableRow, useTheme } from "@mui/material"; import { decodeFunctionData } from 'viem'; import { StyledInputBase } from "../../../../components/Swap/SwapCard"; import { TertiaryButton } from "../../../../components/Button"; import InfoTooltip from "../../../../components/Tooltip/InfoTooltip"; import { abi as TreasuryAbi } from "../../../../abi/GhostTreasury.json"; import { abi as DistributorAbi } from "../../../../abi/GhostDistributor.json"; import { abi as DepositoryAbi } from "../../../../abi/GhostBondDepository.json"; import { config } from "../../../../config"; import { shorten, formatCurrency } from "../../../../helpers"; import { prepareAuditReservesDescription, prepareAuditReservesCalldata, AuditReservesSteps, AuditReservesParsed } from "./AuditReserves"; import { prepareSetAdjustmentDescription, prepareSetAdjustmentCalldata, SetAdjustmentSteps, SetAdjustmentParsed } from "./SetAdjustment"; import { prepareCreateBondDescription, prepareCreateBondCalldata, CreateBondSteps, CreateBondParsed } from "./CreateBond"; const DEFAULT_DESCRIPTION = "Please select the function to include in your proposal. Multi-functional proposals are allowed, but each included function should be clearly specified." export const allPossibleFunctions = [ { value: "auditReserves", label: "Audit Reserves" }, { value: "setAdjustment", label: "Change APY" }, { value: "createBond", label: "Create Bond" }, ]; const allAbis = [TreasuryAbi, DistributorAbi, DepositoryAbi]; const identifyAction = (calldata) => { let decoded = { functionName: "Unknown", args: [] }; for (const abi of allAbis) { try { decoded = decodeFunctionData({ abi: abi, data: calldata, }); return decoded; } catch (err) { continue; } } return decoded; } export const parseFunctionCalldata = (metadata, index, chainId, nativeCoin, removeCalldata) => { const { label, calldata, target, value } = metadata; const { functionName, args } = identifyAction(calldata); const remove = () => removeCalldata(index); console.log(`function arguments for ${label}: ${args}`); switch (functionName) { case "auditReserves": return ; case "setAdjustment": return ; case "create": return ; default: return ; } } export const getFunctionArguments = (functionName) => { switch (functionName) { case "auditReserves": return null; case "setAdjustment": return SetAdjustmentSteps; case "createBond": return CreateBondSteps; default: return null; } } export const getFunctionCalldata = (functionName, chainId) => { switch (functionName) { case "auditReserves": return prepareAuditReservesCalldata(chainId); case "setAdjustment": return prepareSetAdjustmentCalldata(chainId); case "createBond": return prepareCreateBondCalldata(chainId); default: return null; } } export const getFunctionDescription = (functionName) => { switch (functionName) { case "auditReserves": return prepareAuditReservesDescription; case "setAdjustment": return prepareSetAdjustmentDescription; case "createBond": return prepareCreateBondDescription; default: return DEFAULT_DESCRIPTION; } } export const BooleanValue = ({ left, text, isSelected, setSelected }) => { const theme = useTheme(); return ( setSelected()} display="flex" justifyContent="center" alignItems="center" sx={{ cursor: "pointer", borderRadius: left ? "12px 0 0 12px" : "0 12px 12px 0", flex: 1, border: "2px solid #fff", borderLeft: left ? "2px solid #fff" : "none", borderRight: left ? "none" : "2px solid #fff", background: `${isSelected ? "#fff" : theme.colors.gray[600] }` }} > {text} ) } export const ArgumentsWrapper = ({ label, tooltip, children }) => { return ( {label} {children} ) } export const BooleanTrigger = ({ value, label, tooltip, leftText, rightText, setLeftValue, setRightValue }) => { return ( ) } export const ArgumentInput = ({ endString, label, tooltip, value, setValue, disabled, inputType = "number", placeholder = "0", maxWidth = "100%" }) => { const theme = useTheme(); const ref = useRef(null); return ( {label} { ref.current && ref.current.focus(); }} > setValue(e.target.value)} sx={{ flex: 1 }} /> {endString && ( {endString} )} ) } export const ParsedCell = (props) => { const etherscanLink = useMemo(() => { const client = config.getClient(); let url = client?.chain?.blockExplorers?.default?.url; if (url) { url = url + `/address/${props.target}`; } return url; }, [props]); return ( {props.label} {shorten(props.target)} {formatCurrency(props.value, 2, props.nativeCoin)} {props.args && props.setIsOpened(!props.isOpened)}>View} {props.remove && props.remove()}>Delete} ) }