import { Button, Collapse, Flex, HStack, Icon, Input, InputGroup, InputRightElement, LightMode, Text, Tooltip, useColorModeValue, useDisclosure, VStack, } from "@chakra-ui/react"; import { useWallet } from "@solana/wallet-adapter-react"; import { PublicKey } from "@solana/web3.js"; import { Notification, useBondingPricing, useCapInfo, useErrorHandler, useProvider, useStrataSdks, useTokenBonding, useUserOwnedAmount, } from "@strata-foundation/react"; import { SplTokenBonding } from "@strata-foundation/spl-token-bonding"; import React, { useState } from "react"; import { useAsyncCallback } from "react-async-hook"; import toast from "react-hot-toast"; import { BsChevronDown, BsChevronUp } from "react-icons/bs"; import { RiInformationLine } from "react-icons/ri"; import { useLivePrice } from "../../hooks/useLivePrice"; async function buy({ tokenBondingSdk, tokenBonding, maxPrice, }: IMintArgs): Promise { if (tokenBondingSdk && tokenBonding) { if (isNaN(maxPrice)) { throw new Error("Invalid slippage"); } await tokenBondingSdk.buy({ tokenBonding, desiredTargetAmount: 1, expectedBaseAmount: maxPrice, slippage: 0, }); toast.custom((t) => ( toast.dismiss(t.id)} /> )); } } export interface IMintArgs { tokenBondingSdk: SplTokenBonding | undefined; tokenBonding: PublicKey | undefined; maxPrice: number; } export const MintButton = ({ tokenBondingKey, price: inputPrice, isDisabled, disabledText, onMint = buy, }: { tokenBondingKey?: PublicKey; price?: number; isDisabled?: boolean; disabledText?: string; onMint?: (args: IMintArgs) => Promise; }) => { const { connected, publicKey } = useWallet(); const { awaitingApproval } = useProvider(); const [slippage, setSlippage] = useState("5"); const { numRemaining } = useCapInfo(tokenBondingKey); const { pricing, loading: pricingLoading, error: pricingError, } = useBondingPricing(tokenBondingKey); const { handleErrors } = useErrorHandler(); const { tokenBondingSdk } = useStrataSdks(); const { execute, loading, error } = useAsyncCallback(onMint); handleErrors(pricingError, error); const { info: tokenBonding, loading: bondingLoading } = useTokenBonding(tokenBondingKey); const { price } = useLivePrice(tokenBonding?.publicKey); const priceToUse = inputPrice || price; const targetBalance = useUserOwnedAmount(publicKey, tokenBonding?.targetMint); const ownedAmount = useUserOwnedAmount(publicKey, tokenBonding?.baseMint); const insufficientBalance = (priceToUse || 0) > (ownedAmount || 0); const notLive = tokenBonding && tokenBonding.goLiveUnixTime.toNumber() > new Date().valueOf() / 1000; const canFinishPrevious = (targetBalance || 0) > 0; return ( Slippage setSlippage(e.target.value)} /> % {/* @ts-ignore */} ); };