import { useRef, useMemo, useState, useEffect } from "react"; import { encodeFunctionData } from 'viem'; import { Box, Typography, TableRow, TableCell, useTheme } from "@mui/material"; import Modal from "../../../../components/Modal/Modal"; import Select from "../../../../components/Select/Select"; import { PrimaryButton, TertiaryButton } from "../../../../components/Button"; import { shorten } from "../../../../helpers"; import { useTokenSymbol } from "../../../../hooks/tokens"; import { ArgumentsWrapper, BooleanTrigger, ArgumentInput, ParsedCell } from "./index"; import { RESERVE_ADDRESSES, FTSO_DAI_LP_ADDRESSES, BOND_DEPOSITORY_ADDRESSES, } from "../../../../constants/addresses"; import { abi as DepositoryAbi } from "../../../../abi/GhostBondDepository.json"; export const prepareCreateBondCalldata = (chainId, markets, terms, quoteToken, intervals, booleans) => { const value = 0n; const label = "create"; const target = BOND_DEPOSITORY_ADDRESSES[chainId]; const calldata = encodeFunctionData({ abi: DepositoryAbi, functionName: 'create', args: [markets, terms, quoteToken, intervals, booleans] }); return { label, target, calldata, value }; } export const prepareCreateBondDescription = "function creates a new bond market by processing pricing, capacity, and term inputs. It initializes and stores the new bond market's complete configuration in the protocol."; export const CreateBondParsed = (props) => { const [isOpened, setIsOpened] = useState(false); const { symbol: ftsoSymbol } = useTokenSymbol(props.chainId, "FTSO"); return ( <> View create } open={isOpened} onClose={() => setIsOpened(false)} maxWidth="460px" minHeight="200px" > {props.isTable && } ) } const CreateBondParsedCell = (props) => { return } export const CreateBondSteps = ({ nativeCurrency, ftsoSymbol, chainId, toInitialStep, addCalldata, args }) => { const createMode = args === undefined; const [step, setStep] = useState(1); const [nextDisabled, setNextDisabled] = useState(false); const [capacity, setCapacity] = useState(args?.at(0)?.at(0)); const [initialPrice, setInitialPrice] = useState(args?.at(0)?.at(1)); const [debtBuffer, setDebtBuffer] = useState(args?.at(0)?.at(2)); const [depositInterval, setDepositInterval] = useState(args?.at(3)?.at(0)); const [tuneInterval, setTuneInterval] = useState(args?.at(3)?.at(1)); const [tokenAddress, setTokenAddress] = useState(args?.at(2)); const [capacityInQuote, setCapacityInQuote] = useState(args?.at(4)?.at(0) ?? true); const [fixedTerm, setFixedTerm] = useState(args?.at(4)?.at(1) ?? false); const [vestingLength, setVestingLength] = useState(args?.at(1)?.at(0)); const [conclusionTimestamp, setConclusionTimestamp] = useState(args?.at(1)?.at(1)); const { symbol: reserveSymbol } = useTokenSymbol(chainId, RESERVE_ADDRESSES[chainId]); const handleProceed = () => { const markets = [capacity, initialPrice, debtBuffer]; const terms = [vestingLength, conclusionTimestamp]; const intervals = [depositInterval, tuneInterval]; const booleans = [capacityInQuote, fixedTerm]; addCalldata(prepareCreateBondCalldata(chainId, markets, terms, tokenAddress, intervals, booleans)) } const empty = () => {}; const incrementStep = () => { setStep(prev => prev + 1); } const decrementStep = () => { if (step > 1) setStep(prev => prev - 1); else toInitialStep(); } const isNextDisabled = useMemo(() => { switch (step) { case 1: return tokenAddress === undefined; case 2: return !capacity || !initialPrice || !debtBuffer; case 3: return !depositInterval || !tuneInterval; case 4: return true; default: return false; } }, [step, tokenAddress, capacity, initialPrice, debtBuffer, depositInterval, tuneInterval]); const possibleTokens = [ { value: FTSO_DAI_LP_ADDRESSES[chainId], symbol: `${ftsoSymbol}-${reserveSymbol} LP`, label: `${ftsoSymbol}-${reserveSymbol} LP: ${shorten(FTSO_DAI_LP_ADDRESSES[chainId])}` }, { value: RESERVE_ADDRESSES[chainId], symbol: reserveSymbol, label: `${reserveSymbol}: ${shorten(RESERVE_ADDRESSES[chainId])}` }, ]; return ( {step === 1 && } {step === 2 && token.value === tokenAddress).symbol} ftsoSymbol={ftsoSymbol} capacity={capacity} setCapacity={createMode ? setCapacity : empty} initialPrice={initialPrice} setInitialPrice={createMode ? setInitialPrice : empty} debtBuffer={debtBuffer} setDebtBuffer={createMode ? setDebtBuffer : empty} />} {step === 3 && } {step === 4 && } decrementStep()} fullWidth>Back incrementStep()} fullWidth>Next {(step === 4 && createMode) && handleProceed()} fullWidth>Create Function} ); } const MarketArguments = ({ capacityInQuote, currencySymbol, ftsoSymbol, capacity, setCapacity, initialPrice, setInitialPrice, debtBuffer, setDebtBuffer }) => { return ( ) } const IntervalsArguments = ({ depositInterval, setDepositInterval, tuneInterval, setTuneInterval, }) => { return ( ) } const TermsAgruments = ({ fixedTerm, vestingLength, setVestingLength, conclusionTimestamp, setConclusionTimestamp, }) => { return ( ) } const TokenAndBooleansArguments = ({ createMode, tokenAddress, possibleTokens, nativeCurrency, ftsoSymbol, setTokenAddress, capacityInQuote, setCapacityInQuote, fixedTerm, setFixedTerm, }) => { const theme = useTheme(); const [selectedOption, setSelectedOption] = useState(tokenAddress); const handleChange = (event) => { if (createMode) { setSelectedOption(event.target.value); setTokenAddress(event.target.value); } }; return ( setCapacityInQuote(true)} setRightValue={() => setCapacityInQuote(false)} tooltip={`Determines how the bond market capacity is measured. True = measured in _quoteToken, False = measured in ${ftsoSymbol}.`} /> setFixedTerm(true)} setRightValue={() => setFixedTerm(false)} tooltip={`Defines the bond maturity model. True = each purchase matures after vesting duration from its purchase date. False = all purchases mature at the conclusion timestamp.`} />