@ape.swap/bonds-sdk 5.1.49-test.2 → 5.1.49-test.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/constants/chains.js +1 -1
- package/dist/config/constants/chains.js.map +1 -1
- package/dist/config/constants/suiCallbacks.d.ts +2 -0
- package/dist/config/constants/suiCallbacks.js +17 -0
- package/dist/config/constants/suiCallbacks.js.map +1 -0
- package/dist/config/constants/suiZapTokens.js +19 -7
- package/dist/config/constants/suiZapTokens.js.map +1 -1
- package/dist/constants/suiConstants.d.ts +1 -7
- package/dist/constants/suiConstants.js +6 -34
- package/dist/constants/suiConstants.js.map +1 -1
- package/dist/state/bonds/discoverSuiBonds.d.ts +6 -0
- package/dist/state/bonds/fetchBondsDataSui.js +38 -11
- package/dist/state/bonds/fetchBondsDataSui.js.map +1 -1
- package/dist/state/bonds/useBondsData.js +17 -9
- package/dist/state/bonds/useBondsData.js.map +1 -1
- package/dist/state/bonds/useBondsList.js +22 -22
- package/dist/state/bonds/useBondsList.js.map +1 -1
- package/dist/state/tokenPrices/useTokenPrices.js +1 -13
- package/dist/state/tokenPrices/useTokenPrices.js.map +1 -1
- package/dist/state/useSDKConfig.d.ts +2 -0
- package/dist/state/useSDKConfig.js +6 -0
- package/dist/state/useSDKConfig.js.map +1 -1
- package/dist/state/zap/useSuiZapQuote.js +5 -28
- package/dist/state/zap/useSuiZapQuote.js.map +1 -1
- package/dist/utils/suiHelpers.d.ts +1 -1
- package/dist/utils/suiHelpers.js +5 -5
- package/dist/utils/suiHelpers.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentSui.js +133 -57
- package/dist/views/BuyBond/BuyComponentSui.js.map +1 -1
- package/dist/views/BuyBond/utils.js +3 -0
- package/dist/views/BuyBond/utils.js.map +1 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowSui.js +2 -2
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowSui.js.map +1 -1
- package/dist/views/YourBondsModal/components/Actions/ActionsSui.js +2 -2
- package/dist/views/YourBondsModal/components/Actions/ActionsSui.js.map +1 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSui.d.ts +9 -0
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSui.js +71 -0
- package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionSui.js.map +1 -0
- package/dist/views/YourBondsModal/components/TransferBondModal/index.js +2 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/state/bonds/aptosBondsConfig.js +0 -183
- package/dist/state/bonds/aptosBondsConfig.js.map +0 -1
- package/dist/state/bonds/suiBondsConfig.d.ts +0 -4
- package/dist/state/bonds/suiBondsConfig.js +0 -227
- package/dist/state/bonds/suiBondsConfig.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuyComponentSui.js","sources":["../../../src/views/BuyBond/BuyComponentSui.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react'\nimport BigNumber from 'bignumber.js'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport useSuiZapQuote, { AFTERMATH_TX_API_URL } from '../../state/zap/useSuiZapQuote'\nimport { findSuiZapToken } from '../../config/constants/suiZapTokens'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport { usePopups } from '../../state/popups/usePopups'\nimport { useSlippage } from '../../state/slippage/useSlippage'\nimport { BondsData } from '../../types/bonds'\nimport { formatUSDNumber, getMaxBuy, getPayoutAmount, getPrincipalAmount } from '../../utils/displayHelpers'\nimport { formatNumberSI } from '../../utils/formatNumber'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { reportError } from '../../utils/reportError'\nimport { MCBuyComponentStyles } from '../../utils/campaignStyles'\nimport track from '../../utils/track'\nimport { remove0xPrefix } from '../../utils/remove0xPrefix'\nimport { getSymbol } from '../../utils/getNativeTicker'\n\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport useTokenFromZapList from '../../hooks/useTokenFromZapList'\nimport useSortedZapList from '../../hooks/useSortedZapList'\nimport TokenSelectorPanel from '../../components/TokenSelectorPanel'\nimport BondModalHeader from './components/BondModalHeader'\nimport BondCards from './components/BondCards/BondCards'\nimport Estimations from './components/Estimations'\nimport ProjectDescription from './components/ProjectDescription'\n\nimport Flex from '../../components/uikit-sdk/Flex'\nimport Text from '../../components/uikit-sdk/Text'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport SafeHTMLComponent from '../../components/SafeHTMLComponent'\n\nimport {\n SUI_DEPOSIT_FUNCTION,\n SUI_BOND_MARKET,\n SUI_TREASURY,\n SUI_BOND_NFT_REGISTRY,\n IS_SUI_MAINNET,\n SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET,\n SUI_MINT_PRINCIPAL_FUNCTION,\n} from '../../constants/suiConstants'\nimport { getSuiClient, readFreshTrueBondPrice, verifySuiTxSuccess } from '../../utils/suiHelpers'\nimport { MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\n\nexport interface BuyComponentSuiProps {\n onDismiss?: () => void\n bondAddress?: string\n bondChain?: number\n setBillId?: (id: string) => void\n isProjectView?: boolean\n}\n\nconst BuyComponentSui: React.FC<BuyComponentSuiProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n isProjectView,\n setBillId,\n}) => {\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n\n // Hooks\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { data: bonds } = useBondsData()\n const { addToastError, addToastSuccess } = usePopups()\n const { solSlippage: slippage } = useSlippage() // reuse Sol slippage bucket for Sui\n\n const bondData: BondsData | undefined = bonds?.find(\n (bond) => bond?.contractAddress?.[bond?.chainId]?.toLowerCase() === bondAddress?.toLowerCase(),\n )\n\n // Derived pricing (same path the Solana no-tier branch uses).\n const trueBondPriceData = findHighestTrueBondPrice('0', bondData?.trueBondPrices)\n\n // State\n const [inputValue, setInputValue] = useState('')\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData?.chainId])\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Token selection — reuses the same infrastructure as Solana\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n const principalAddress = bondData?.lpToken?.address?.[bondData?.chainId]\n // Detect zap: selected token differs from the bond principal\n const SUI_NATIVE_COIN_TYPE = '0x2::sui::SUI'\n const isNativeMatchingPrincipal =\n (inputTokenString === 'NATIVE' || inputTokenString?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()) &&\n principalAddress?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n const isZap =\n !!inputTokenString &&\n !!principalAddress &&\n !isNativeMatchingPrincipal &&\n inputTokenString.toLowerCase() !== principalAddress.toLowerCase()\n\n // Zap quote from Aftermath DEX aggregator\n const suiZapToken = findSuiZapToken(\n inputToken && inputToken !== 'NATIVE'\n ? inputToken?.address?.[ChainId.SUI]\n : inputToken === 'NATIVE'\n ? '0x2::sui::SUI'\n : undefined,\n )\n const [fetchingZapQuote, aftermathQuote, zapDepositAmount, zapError] = useSuiZapQuote(\n inputValue,\n suiZapToken,\n bondData,\n suiAccount ?? undefined,\n slippage,\n )\n\n // Sorted zap list (balances + prices)\n const { sortedZapList, isFetched: zapListFetched } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n const inputTokenPrice = enrichedTokenData?.price\n\n // Estimations — use zapDepositAmount if swapping\n const depositAmount = isZap ? zapDepositAmount : inputValue\n const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = $${formatUSDNumber(\n (parseFloat(inputValue || '0') * (inputTokenPrice ?? 0)).toString(),\n )}`\n\n const exceedsRealMaxBuy = getMaxBuy(bondData, true).lte(getPayoutAmount(bondData, depositAmount, '0'))\n const exceedsSafeMaxBuy = getMaxBuy(bondData, false)\n .times(isZap ? 0.995 : 0.9995)\n .lte(getPayoutAmount(bondData, depositAmount, '0'))\n\n const exceedsBalance = new BigNumber(inputCurrencyBalance ?? '0').lt(inputValue)\n\n const load = loadingTx || (fetchingZapQuote && !!inputValue)\n\n // Handlers\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n const handleMaxButton = () => {\n const balance = new BigNumber(inputCurrencyBalance ?? '0')\n const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 9\n const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds)\n\n const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), '0')\n if (maxPossibleUserPurchase > maxBuyAmount.toNumber()) {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), '0')\n setInputValue(new BigNumber(principalForMaxBuy).toFixed(principalDecimals))\n } else {\n setInputValue(balance.toFixed(principalDecimals))\n }\n }\n\n const handleBuyCallback = async () => {\n if (!suiAccount || !bondData || !inputValue || !signAndExecuteTransaction) return\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n try {\n setLoadingTx(true)\n\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 9\n const atomicAmount = new BigNumber(inputValue)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n const market = bondData.contractAddress[bondData.chainId] ?? SUI_BOND_MARKET\n\n // Read fresh bond price from chain to avoid stale cache after previous purchases\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n // Build Sui transaction\n const tx = new Transaction()\n const isPrincipalNativeSui =\n !principalCoinType || principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(atomicAmount)])\n } else {\n const suiClient = getSuiClient()\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found in wallet`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(atomicAmount)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [tx.pure.u64(atomicAmount)])\n }\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(bondData.suiTreasuryId ?? SUI_TREASURY),\n tx.object(SUI_BOND_NFT_REGISTRY),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n // Pre-build the transaction so the wallet receives fully-resolved bytes.\n // Some wallets (e.g. Phantom) fail with \"Unexpected error\" when they have\n // to build/simulate a Transaction object themselves.\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000) // 0.05 SUI — generous for a bond deposit\n const builtBytes = await tx.build({ client: getSuiClient() })\n const prebuiltTx = Transaction.from(builtBytes)\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n const suiClient = getSuiClient()\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui's indexer has a short lag — getOwnedObjects may not return the\n // new BondNFT immediately. Schedule re-invalidations so the Your Bonds\n // view picks up the new bond once the indexer catches up.\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 8000)\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(digest, bondChain as ChainId)\n // Sui does not return a bill_id from the tx response easily —\n // the frontend will pick it up on the next query refresh.\n setBillId?.('')\n } catch (error: any) {\n console.error('[SUI DEBUG] Error during Sui bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleZapCallback = async () => {\n if (loadingTx || !suiAccount || !bondData || !aftermathQuote || !signAndExecuteTransaction) return\n\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n try {\n setLoadingTx(true)\n const suiClient = getSuiClient()\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 6\n const depositAmountAtomic = new BigNumber(zapDepositAmount)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n // TX1: Acquire principal tokens\n if (IS_SUI_MAINNET) {\n // Mainnet: swap via Aftermath DEX aggregator\n const txResponse = await axios.post(AFTERMATH_TX_API_URL, {\n walletAddress: suiAccount,\n completeRoute: aftermathQuote,\n slippage: slippage / 100,\n })\n\n const swapTxBytes = txResponse.data\n if (!swapTxBytes) throw new Error('Aftermath returned no transaction data')\n\n const swapTx = Transaction.from(swapTxBytes)\n const swapResponse = await signAndExecuteTransaction({ transaction: swapTx })\n const swapDigest = swapResponse?.digest\n if (!swapDigest) throw new Error('No tx digest returned for swap')\n await suiClient.waitForTransaction({ digest: swapDigest })\n } else {\n // Testnet: mint principal tokens via test_principal_token::mint\n // No DEX aggregator supports Sui testnet or custom test tokens.\n const mintTx = new Transaction()\n mintTx.moveCall({\n target: SUI_MINT_PRINCIPAL_FUNCTION,\n arguments: [\n mintTx.object(SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET),\n mintTx.pure.u64(depositAmountAtomic),\n mintTx.pure.address(suiAccount),\n ],\n })\n\n mintTx.setSender(suiAccount)\n mintTx.setGasBudget(50_000_000)\n const builtMint = await mintTx.build({ client: suiClient })\n const prebuiltMint = Transaction.from(builtMint)\n\n const mintResponse = await signAndExecuteTransaction({ transaction: prebuiltMint })\n const mintDigest = mintResponse?.digest\n if (!mintDigest) throw new Error('No tx digest returned for testnet mint')\n await suiClient.waitForTransaction({ digest: mintDigest })\n }\n\n // TX2: Deposit into bond with principal tokens\n const market = bondData.contractAddress[bondData.chainId] ?? SUI_BOND_MARKET\n\n // Read fresh bond price from chain to avoid stale cache\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const isPrincipalNativeSui = principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(depositAmountAtomic)])\n } else {\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found after swap`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(depositAmountAtomic)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [\n tx.pure.u64(depositAmountAtomic),\n ])\n }\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(bondData.suiTreasuryId ?? SUI_TREASURY),\n tx.object(SUI_BOND_NFT_REGISTRY),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const builtDeposit = await tx.build({ client: suiClient })\n const prebuiltDeposit = Transaction.from(builtDeposit)\n\n const depositResponse = await signAndExecuteTransaction({ transaction: prebuiltDeposit })\n const depositDigest = depositResponse?.digest\n if (!depositDigest) throw new Error('No tx digest returned for deposit')\n await suiClient.waitForTransaction({ digest: depositDigest })\n await verifySuiTxSuccess(depositDigest)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui indexer lag — schedule delayed re-invalidations for user bonds\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 8000)\n\n track({\n event: 'zap',\n chain: bondChain,\n data: {\n cat: 'bond',\n token1: getSymbol(inputToken, bondData?.chainId),\n token2: bondData?.lpToken.symbol ?? '',\n amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(depositDigest, bondChain as ChainId)\n setBillId?.('')\n } catch (error: any) {\n console.error('Error during Sui zap bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiZapBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleBuy = () => {\n if (loadingTx) return\n if (isZap) {\n handleZapCallback()\n } else {\n handleBuyCallback()\n }\n }\n\n // Sync inputTokenString when bondData loads after initial render\n useEffect(() => {\n const addr = bondData?.lpToken?.address?.[bondData?.chainId]\n if (addr && !inputTokenString) {\n setInputTokenString(addr)\n }\n }, [bondData?.lpToken?.address, bondData?.chainId]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-select highest balance token when zap list loads\n const [hasChecked, setHasChecked] = useState(false)\n useEffect(() => {\n if (zapListFetched && !hasChecked) {\n if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {\n setInputTokenString(\n sortedZapList[0]?.token === 'NATIVE' ? 'NATIVE' : sortedZapList[0]?.token.address[bondChain as ChainId],\n )\n }\n setHasChecked(true)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [inputCurrencyBalance, zapListFetched])\n\n const hasPositiveBonus = (trueBondPriceData?.bonusWithFee ?? 0) > 0\n\n const canBuy =\n !load &&\n !!suiAccount &&\n !bondData?.soldOut &&\n !!inputValue &&\n parseFloat(inputValue) > 0 &&\n !exceedsRealMaxBuy &&\n !exceedsBalance &&\n hasPositiveBonus &&\n !SDKConfig.blockSales &&\n !zapError &&\n !(isZap && !aftermathQuote)\n\n return bondData ? (\n <Flex className=\"modal-content\" sx={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}>\n <Flex className=\"modaltable-container\">\n <BondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView />\n <Flex sx={{ width: '100%', display: isProjectView ? ['flex', 'flex', 'flex', 'none'] : 'flex' }}>\n <BondCards bondData={bondData} isDoingMaxBuy={exceedsSafeMaxBuy && !exceedsRealMaxBuy} />\n </Flex>\n <Estimations\n depositAmount={depositAmount}\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZap}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={ChainId.SUI}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance ?? undefined}\n selectedTokenPrice={inputTokenPrice}\n />\n {bondData?.warningCard && (\n <Flex\n sx={{\n width: '100%',\n background: '#DE62F366',\n justifyContent: 'center',\n mt: '10px',\n borderRadius: 'normal',\n p: '2px 10px',\n }}\n >\n <Text sx={{ fontSize: '12px', fontWeight: 400, display: 'flex', alignItems: 'center', gap: '10px' }}>\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container\">\n <Flex className=\"button-container buy\">\n {!suiAccount ? (\n <Button\n className=\"action-button\"\n onClick={() => {\n // Sui dapp-kit ConnectModal is managed by the provider —\n // consumers should wrap the app in SuiWalletProvider.\n // This button is a fallback prompt.\n }}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n Connect to Sui\n </Button>\n ) : (\n <Button\n className=\"action-button\"\n load={load}\n disabled={!canBuy}\n onClick={handleBuy}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n {SDKConfig.blockSales\n ? 'Complete KYC to Buy'\n : zapError\n ? 'Swap quote failed'\n : exceedsRealMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : exceedsBalance\n ? 'Insufficient balance'\n : !inputValue || parseFloat(inputValue) === 0\n ? 'Insert amount'\n : 'buy'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default BuyComponentSui\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BuyComponentSui.js","sources":["../../../src/views/BuyBond/BuyComponentSui.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react'\nimport BigNumber from 'bignumber.js'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport useSuiZapQuote, { AFTERMATH_TX_API_URL } from '../../state/zap/useSuiZapQuote'\nimport { findSuiZapToken } from '../../config/constants/suiZapTokens'\nimport useBondsData from '../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../state/useSDKConfig'\nimport { usePopups } from '../../state/popups/usePopups'\nimport { useSlippage } from '../../state/slippage/useSlippage'\nimport { BondsData } from '../../types/bonds'\nimport { formatUSDNumber, getMaxBuy, getPayoutAmount, getPrincipalAmount } from '../../utils/displayHelpers'\nimport { formatNumberSI } from '../../utils/formatNumber'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { reportError } from '../../utils/reportError'\nimport { MCBuyComponentStyles } from '../../utils/campaignStyles'\nimport track from '../../utils/track'\nimport { remove0xPrefix } from '../../utils/remove0xPrefix'\nimport { getSymbol } from '../../utils/getNativeTicker'\n\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport useTokenFromZapList from '../../hooks/useTokenFromZapList'\nimport useSortedZapList from '../../hooks/useSortedZapList'\nimport TokenSelectorPanel from '../../components/TokenSelectorPanel'\nimport BondModalHeader from './components/BondModalHeader'\nimport BondCards from './components/BondCards/BondCards'\nimport Estimations from './components/Estimations'\nimport ProjectDescription from './components/ProjectDescription'\n\nimport Flex from '../../components/uikit-sdk/Flex'\nimport Text from '../../components/uikit-sdk/Text'\nimport Button from '../../components/uikit-sdk/Button/Button'\nimport SafeHTMLComponent from '../../components/SafeHTMLComponent'\n\nimport { SUI_DEPOSIT_FUNCTION, SUI_PACKAGE_ID } from '../../constants/suiConstants'\nimport { getSuiClient, readFreshTrueBondPrice, verifySuiTxSuccess } from '../../utils/suiHelpers'\nimport { openSuiConnectModal } from '../../config/constants/suiCallbacks'\nimport { MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\nimport { SuiJsonRpcClient } from '@mysten/sui/dist/cjs/jsonRpc/client'\n\n// ---------------------------------------------------------------------------\n// Helper: extract the bill_id from a confirmed Sui deposit transaction.\n// Logs the full tx block so the bill_id can be located manually if the\n// automatic extraction fails.\n// ---------------------------------------------------------------------------\nconst extractSuiBillId = async (digest: string, suiClient: SuiJsonRpcClient): Promise<string> => {\n const txBlock = await suiClient.getTransactionBlock({\n digest,\n options: {\n showEffects: true,\n showObjectChanges: true,\n showEvents: true,\n },\n })\n\n console.log('[SUI AFTER-PURCHASE] Full tx block for digest', digest, txBlock)\n console.log('[SUI AFTER-PURCHASE] objectChanges:', txBlock.objectChanges)\n console.log('[SUI AFTER-PURCHASE] events:', txBlock.events)\n\n // ── Strategy 1: find the created BondNFT in objectChanges ──────────────\n const bondNftType = `${SUI_PACKAGE_ID}::bond_nft::BondNFT`\n const createdNft = txBlock.objectChanges?.find(\n (change) =>\n change.type === 'created' && 'objectType' in change && (change.objectType as string)?.includes(bondNftType),\n )\n\n console.log('[SUI AFTER-PURCHASE] Created BondNFT objectChange:', createdNft)\n\n if (createdNft && 'objectId' in createdNft) {\n const nftObjectId = createdNft.objectId as string\n console.log('[SUI AFTER-PURCHASE] BondNFT objectId:', nftObjectId)\n\n try {\n const nftObj = await suiClient.getObject({\n id: nftObjectId,\n options: { showContent: true },\n })\n\n console.log('[SUI AFTER-PURCHASE] BondNFT full object:', nftObj)\n\n if (nftObj.data?.content?.dataType === 'moveObject') {\n const fields = nftObj.data.content.fields as Record<string, any>\n console.log('[SUI AFTER-PURCHASE] BondNFT fields:', fields)\n const billId = String(fields?.bill_id ?? '')\n if (billId && billId !== 'undefined' && billId !== '') {\n console.log('[SUI AFTER-PURCHASE] ✅ Extracted bill_id from BondNFT object:', billId)\n return billId\n }\n }\n } catch (e) {\n console.warn('[SUI AFTER-PURCHASE] Failed to read BondNFT object:', nftObjectId, e)\n }\n }\n\n // ── Strategy 2: look for bill_id in emitted Move events ────────────────\n if (txBlock.events && txBlock.events.length > 0) {\n for (const event of txBlock.events) {\n console.log('[SUI AFTER-PURCHASE] Event type:', event.type, 'parsedJson:', event.parsedJson)\n const eventData = event.parsedJson as Record<string, any> | undefined\n if (eventData?.bill_id !== undefined) {\n const billId = String(eventData.bill_id)\n console.log('[SUI AFTER-PURCHASE] ✅ Extracted bill_id from event:', event.type, billId)\n return billId\n }\n }\n }\n\n // ── Strategy 3: log all object changes for manual inspection ──────────\n if (txBlock.objectChanges) {\n for (const change of txBlock.objectChanges) {\n console.log('[SUI AFTER-PURCHASE] objectChange entry:', change)\n }\n }\n\n console.warn(\n '[SUI AFTER-PURCHASE] ⚠️ Could not extract bill_id automatically from digest:',\n digest,\n '— check the logs above to find it manually.',\n )\n // Signal that the tx succeeded but we don't have a bill ID yet.\n // ModalHandler will fall back to a query-refresh-based flow.\n return `digest:${digest}`\n}\n\nexport interface BuyComponentSuiProps {\n onDismiss?: () => void\n bondAddress?: string\n bondChain?: number\n setBillId?: (id: string) => void\n isProjectView?: boolean\n}\n\nconst BuyComponentSui: React.FC<BuyComponentSuiProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n isProjectView,\n setBillId,\n}) => {\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n\n // Hooks\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { data: bonds } = useBondsData()\n const { addToastError, addToastSuccess } = usePopups()\n const { solSlippage: slippage } = useSlippage() // reuse Sol slippage bucket for Sui\n\n const bondData: BondsData | undefined = bonds?.find(\n (bond) => bond?.contractAddress?.[bond?.chainId]?.toLowerCase() === bondAddress?.toLowerCase(),\n )\n\n // Derived pricing (same path the Solana no-tier branch uses).\n const trueBondPriceData = findHighestTrueBondPrice('0', bondData?.trueBondPrices)\n\n // State\n const [inputValue, setInputValue] = useState('')\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData?.chainId])\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Token selection — reuses the same infrastructure as Solana\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n const principalAddress = bondData?.lpToken?.address?.[bondData?.chainId]\n // Detect zap: selected token differs from the bond principal\n const SUI_NATIVE_COIN_TYPE = '0x2::sui::SUI'\n const isNativeMatchingPrincipal =\n (inputTokenString === 'NATIVE' || inputTokenString?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()) &&\n principalAddress?.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n const isZap =\n !!inputTokenString &&\n !!principalAddress &&\n !isNativeMatchingPrincipal &&\n inputTokenString.toLowerCase() !== principalAddress.toLowerCase()\n\n // Zap quote from Aftermath DEX aggregator\n const suiZapToken = findSuiZapToken(\n inputToken && inputToken !== 'NATIVE'\n ? inputToken?.address?.[ChainId.SUI]\n : inputToken === 'NATIVE'\n ? '0x2::sui::SUI'\n : undefined,\n )\n const [fetchingZapQuote, aftermathQuote, zapDepositAmount, zapError] = useSuiZapQuote(\n inputValue,\n suiZapToken,\n bondData,\n suiAccount ?? undefined,\n slippage,\n )\n\n // Sorted zap list (balances + prices)\n const { sortedZapList, isFetched: zapListFetched } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n const inputTokenPrice = enrichedTokenData?.price\n\n // Estimations — use zapDepositAmount if swapping\n const depositAmount = isZap ? zapDepositAmount : inputValue\n const youSpendString = `${formatNumberSI(inputValue)} ${getSymbol(inputToken, bondData?.chainId)} = $${formatUSDNumber(\n (parseFloat(inputValue || '0') * (inputTokenPrice ?? 0)).toString(),\n )}`\n\n const exceedsRealMaxBuy = getMaxBuy(bondData, true).lte(getPayoutAmount(bondData, depositAmount, '0'))\n const exceedsSafeMaxBuy = getMaxBuy(bondData, false)\n .times(isZap ? 0.995 : 0.9995)\n .lte(getPayoutAmount(bondData, depositAmount, '0'))\n\n const exceedsBalance = new BigNumber(inputCurrencyBalance ?? '0').lt(inputValue)\n\n const load = loadingTx || (fetchingZapQuote && !!inputValue)\n\n // Handlers\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n const handleMaxButton = () => {\n const balance = new BigNumber(inputCurrencyBalance ?? '0')\n const principalDecimals = bondData?.lpToken?.decimals?.[bondData?.chainId] ?? 9\n const maxBuyAmount = getMaxBuy(bondData, SDKConfig.showLowValueBonds)\n\n const maxPossibleUserPurchase = getPayoutAmount(bondData, balance.toString(), '0')\n if (maxPossibleUserPurchase > maxBuyAmount.toNumber()) {\n const principalForMaxBuy = getPrincipalAmount(bondData, maxBuyAmount.toString(), '0')\n setInputValue(new BigNumber(principalForMaxBuy).toFixed(principalDecimals))\n } else {\n setInputValue(balance.toFixed(principalDecimals))\n }\n }\n\n const handleBuyCallback = async () => {\n if (!suiAccount || !bondData || !inputValue || !signAndExecuteTransaction) return\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n try {\n setLoadingTx(true)\n\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 9\n const atomicAmount = new BigNumber(inputValue)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n const market = bondData.contractAddress[bondData.chainId]\n\n // Read fresh bond price from chain to avoid stale cache after previous purchases\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n // Build Sui transaction\n const tx = new Transaction()\n const isPrincipalNativeSui =\n !principalCoinType || principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(atomicAmount)])\n } else {\n const suiClient = getSuiClient()\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found in wallet`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(atomicAmount)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [tx.pure.u64(atomicAmount)])\n }\n }\n\n if (!market || !bondData?.suiTreasuryId || !bondData?.billNnftAddress?.[ChainId.SUI]) {\n return\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(bondData.suiTreasuryId),\n tx.object(bondData.billNnftAddress[ChainId.SUI]),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n // Pre-build the transaction so the wallet receives fully-resolved bytes.\n // Some wallets (e.g. Phantom) fail with \"Unexpected error\" when they have\n // to build/simulate a Transaction object themselves.\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000) // 0.05 SUI — generous for a bond deposit\n const builtBytes = await tx.build({ client: getSuiClient() })\n const prebuiltTx = Transaction.from(builtBytes)\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n const suiClient = getSuiClient()\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n // Extract the bill_id from the confirmed transaction.\n // extractSuiBillId logs the full tx block so you can inspect the raw data\n // in case automatic extraction fails.\n const billId = await extractSuiBillId(digest, suiClient)\n console.log('[SUI AFTER-PURCHASE] handleBuyCallback billId:', billId)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui's indexer has a short lag — getOwnedObjects may not return the\n // new BondNFT immediately. Schedule re-invalidations so the Your Bonds\n // view picks up the new bond once the indexer catches up.\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(digest, bondChain as ChainId)\n setBillId?.(billId)\n } catch (error: any) {\n console.error('[SUI DEBUG] Error during Sui bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleZapCallback = async () => {\n if (loadingTx || !suiAccount || !bondData || !aftermathQuote || !signAndExecuteTransaction) return\n\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n try {\n setLoadingTx(true)\n const suiClient = getSuiClient()\n const principalDecimals = bondData.lpToken.decimals[bondData.chainId] ?? 6\n const depositAmountAtomic = new BigNumber(zapDepositAmount)\n .times(new BigNumber(10).pow(principalDecimals))\n .integerValue(BigNumber.ROUND_FLOOR)\n .toFixed(0)\n\n // TX1: Acquire principal tokens\n // if (IS_SUI_MAINNET) {\n // Mainnet: swap via Aftermath DEX aggregator\n const txResponse = await axios.post(AFTERMATH_TX_API_URL, {\n walletAddress: suiAccount,\n completeRoute: aftermathQuote,\n slippage: slippage / 100,\n })\n\n const swapTxBytes = txResponse.data\n if (!swapTxBytes) throw new Error('Aftermath returned no transaction data')\n\n const swapTx = Transaction.from(swapTxBytes)\n const swapResponse = await signAndExecuteTransaction({ transaction: swapTx })\n const swapDigest = swapResponse?.digest\n if (!swapDigest) throw new Error('No tx digest returned for swap')\n await suiClient.waitForTransaction({ digest: swapDigest })\n // } else {\n // // Testnet: mint principal tokens via test_principal_token::mint\n // // No DEX aggregator supports Sui testnet or custom test tokens.\n // const mintTx = new Transaction()\n // mintTx.moveCall({\n // target: SUI_MINT_PRINCIPAL_FUNCTION,\n // arguments: [\n // mintTx.object(SUI_PRINCIPAL_TOKEN_ADMIN_TESTNET),\n // mintTx.pure.u64(depositAmountAtomic),\n // mintTx.pure.address(suiAccount),\n // ],\n // })\n //\n // mintTx.setSender(suiAccount)\n // mintTx.setGasBudget(50_000_000)\n // const builtMint = await mintTx.build({ client: suiClient })\n // const prebuiltMint = Transaction.from(builtMint)\n //\n // const mintResponse = await signAndExecuteTransaction({ transaction: prebuiltMint })\n // const mintDigest = mintResponse?.digest\n // if (!mintDigest) throw new Error('No tx digest returned for testnet mint')\n // await suiClient.waitForTransaction({ digest: mintDigest })\n // }\n\n // TX2: Deposit into bond with principal tokens\n const market = bondData.contractAddress[ChainId.SUI]\n\n // Read fresh bond price from chain to avoid stale cache\n const freshTruePrice = await readFreshTrueBondPrice(market)\n const atomicMaxPrice = new BigNumber(freshTruePrice.toString())\n .times(new BigNumber(100 + slippage))\n .dividedBy(new BigNumber(100))\n .integerValue(BigNumber.ROUND_CEIL)\n .toFixed(0)\n\n const principalCoinType = bondData.lpToken.address[bondData.chainId]\n const payoutCoinType = bondData.earnToken.address[bondData.chainId]\n if (!principalCoinType || !payoutCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const isPrincipalNativeSui = principalCoinType.toLowerCase() === SUI_NATIVE_COIN_TYPE.toLowerCase()\n\n let principalCoin\n if (isPrincipalNativeSui) {\n ;[principalCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(depositAmountAtomic)])\n } else {\n const userCoins = await suiClient.getCoins({ owner: suiAccount, coinType: principalCoinType })\n if (!userCoins.data.length) throw new Error(`No ${bondData.lpToken.symbol} coins found after swap`)\n if (userCoins.data.length > 1) {\n const [primary, ...rest] = userCoins.data.map((c) => tx.object(c.coinObjectId))\n tx.mergeCoins(primary, rest)\n ;[principalCoin] = tx.splitCoins(primary, [tx.pure.u64(depositAmountAtomic)])\n } else {\n ;[principalCoin] = tx.splitCoins(tx.object(userCoins.data[0].coinObjectId), [\n tx.pure.u64(depositAmountAtomic),\n ])\n }\n }\n\n if (!market || !bondData?.suiTreasuryId || !bondData?.billNnftAddress?.[ChainId.SUI]) {\n return\n }\n\n tx.moveCall({\n target: SUI_DEPOSIT_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(bondData.suiTreasuryId),\n tx.object(bondData.billNnftAddress[ChainId.SUI]),\n principalCoin,\n tx.pure.u64(atomicMaxPrice),\n tx.pure.address(suiAccount),\n tx.object('0x6'), // clock\n ],\n })\n\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const builtDeposit = await tx.build({ client: suiClient })\n const prebuiltDeposit = Transaction.from(builtDeposit)\n\n const depositResponse = await signAndExecuteTransaction({ transaction: prebuiltDeposit })\n const depositDigest = depositResponse?.digest\n if (!depositDigest) throw new Error('No tx digest returned for deposit')\n await suiClient.waitForTransaction({ digest: depositDigest })\n await verifySuiTxSuccess(depositDigest)\n\n // Extract the bill_id from the confirmed deposit transaction.\n // extractSuiBillId logs the full tx block so you can inspect the raw data\n // in case automatic extraction fails.\n const billId = await extractSuiBillId(depositDigest, suiClient)\n console.log('[SUI AFTER-PURCHASE] handleZapCallback billId:', billId)\n\n // Invalidate bonds data so next purchase uses fresh pricing\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.BONDS_DATA] })\n\n // Sui indexer lag — schedule delayed re-invalidations for user bonds\n setTimeout(() => queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] }), 3000)\n\n track({\n event: 'zap',\n chain: bondChain,\n data: {\n cat: 'bond',\n token1: getSymbol(inputToken, bondData?.chainId),\n token2: bondData?.lpToken.symbol ?? '',\n amount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(market),\n usdAmount: parseFloat(inputValue) * (inputTokenPrice ?? 0),\n },\n })\n\n addToastSuccess(depositDigest, bondChain as ChainId)\n setBillId?.(billId)\n } catch (error: any) {\n console.error('Error during Sui zap bond purchase:', error)\n addToastError(error?.message || 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error: error?.message,\n extraInfo: { type: 'suiZapBuyBond', error: error?.message },\n chainId: bondChain,\n account: suiAccount,\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n const handleBuy = () => {\n if (loadingTx) return\n if (isZap) {\n handleZapCallback()\n } else {\n handleBuyCallback()\n }\n }\n\n // Sync inputTokenString when bondData loads after initial render\n useEffect(() => {\n const addr = bondData?.lpToken?.address?.[bondData?.chainId]\n if (addr && !inputTokenString) {\n setInputTokenString(addr)\n }\n }, [bondData?.lpToken?.address, bondData?.chainId]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-select highest balance token when zap list loads\n const [hasChecked, setHasChecked] = useState(false)\n useEffect(() => {\n if (zapListFetched && !hasChecked) {\n if (parseFloat(inputCurrencyBalance ?? '0') < 0.0001) {\n setInputTokenString(\n sortedZapList[0]?.token === 'NATIVE' ? 'NATIVE' : sortedZapList[0]?.token.address[bondChain as ChainId],\n )\n }\n setHasChecked(true)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [inputCurrencyBalance, zapListFetched])\n\n const hasPositiveBonus = (trueBondPriceData?.bonusWithFee ?? 0) > 0\n\n const canBuy =\n !load &&\n !!suiAccount &&\n !bondData?.soldOut &&\n !!inputValue &&\n parseFloat(inputValue) > 0 &&\n !exceedsRealMaxBuy &&\n !exceedsBalance &&\n hasPositiveBonus &&\n !SDKConfig.blockSales &&\n !zapError &&\n !(isZap && !aftermathQuote)\n\n return bondData ? (\n <Flex className=\"modal-content\" sx={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}>\n <Flex className=\"modaltable-container\">\n <BondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView />\n <Flex sx={{ width: '100%', display: isProjectView ? ['flex', 'flex', 'flex', 'none'] : 'flex' }}>\n <BondCards bondData={bondData} isDoingMaxBuy={exceedsSafeMaxBuy && !exceedsRealMaxBuy} />\n </Flex>\n <Estimations\n depositAmount={depositAmount}\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZap}\n fetchingZapQuote={fetchingZapQuote}\n zapError={zapError}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={ChainId.SUI}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance ?? undefined}\n selectedTokenPrice={inputTokenPrice}\n />\n {bondData?.warningCard && (\n <Flex\n sx={{\n width: '100%',\n background: '#DE62F366',\n justifyContent: 'center',\n mt: '10px',\n borderRadius: 'normal',\n p: '2px 10px',\n }}\n >\n <Text sx={{ fontSize: '12px', fontWeight: 400, display: 'flex', alignItems: 'center', gap: '10px' }}>\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container\">\n <Flex className=\"button-container buy\">\n {!suiAccount ? (\n <Button\n className=\"action-button\"\n onClick={openSuiConnectModal}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n Connect to Sui\n </Button>\n ) : (\n <Button\n className=\"action-button\"\n load={load}\n disabled={!canBuy}\n onClick={handleBuy}\n sx={{ width: '100%', fontSize: ['14px', '14px', '14px', '16px'] }}\n >\n {SDKConfig.blockSales\n ? 'Complete KYC to Buy'\n : zapError\n ? 'Swap quote failed'\n : exceedsRealMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : exceedsBalance\n ? 'Insufficient balance'\n : !inputValue || parseFloat(inputValue) === 0\n ? 'Insert amount'\n : 'buy'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default BuyComponentSui\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers.js';
|
|
2
2
|
import { getUserTier, TIERS_NAMES } from '../../state/tiers/useTierPoints.js';
|
|
3
|
+
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
3
4
|
|
|
4
5
|
function calculateOptimizationData(inputAmount, userPoints = '0', bond, inputTokenPriceUsd = 0, abondPriceUsd) {
|
|
6
|
+
if (bond.chainId === ChainId.SUI || bond.chainId === ChainId.APTOS || bond.chainId === ChainId.SOL)
|
|
7
|
+
return null;
|
|
5
8
|
const { trueBondPrices } = bond;
|
|
6
9
|
if (!trueBondPrices) {
|
|
7
10
|
console.log('no truebondprices');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/views/BuyBond/utils.ts"],"sourcesContent":["import { BondsData } from '../../types/bonds'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { getUserTier, NewTiers, TIERS_NAMES } from '../../state/tiers/useTierPoints'\n\nexport function calculateOptimizationData(\n inputAmount: string,\n userPoints = '0',\n bond: BondsData,\n inputTokenPriceUsd = 0,\n abondPriceUsd?: number,\n) {\n const { trueBondPrices } = bond\n\n if (!trueBondPrices) {\n console.log('no truebondprices')\n return null\n }\n if (!abondPriceUsd) {\n console.log('No Abond Price')\n return null\n }\n\n if (inputTokenPriceUsd <= 0) {\n console.log('missing token price')\n return null\n }\n\n const currentTierData = findHighestTrueBondPrice(userPoints, trueBondPrices)\n const currentTier = getUserTier(userPoints)!\n\n // const bonus_curr = 1 + currentTierData?.bonusWithFee! / 100\n const currentPoints = BigInt(userPoints)\n\n const inputAmountUSD = parseFloat(inputAmount || '0') * inputTokenPriceUsd\n\n const tierBoostRate = (bond.tierBoostRate ?? 0) / 100\n const tierBoostUsd = inputAmountUSD * tierBoostRate\n const feeInAbond = tierBoostUsd / abondPriceUsd\n const tierBoostPoints = feeInAbond * 4\n const currentPrice = parseFloat(currentTierData?.trueBondPrice!)\n\n const dataToReturn: Record<\n number,\n {\n tier: number\n tierName: string\n isProfitable: boolean\n tierCostUSD: number\n minBreakevenWithFeeUSD: number\n necessaryPointsToUpgrade: number\n }\n > = {}\n\n for (const tierData of trueBondPrices) {\n if (tierData.boost <= currentTier) continue\n // @ts-ignore\n const tierName = TIERS_NAMES[tierData.boost]\n\n const pointsNeededWei = BigInt(tierData.points) - currentPoints\n const abondNeededRaw = Math.ceil(Number(pointsNeededWei) / 1e18 / 4)\n\n const tierCostUsd = abondNeededRaw * abondPriceUsd\n const newPrice = parseFloat(tierData.trueBondPrice)\n const priceDiff = (currentPrice - newPrice) / currentPrice\n\n // const newBonusWithThisTier = tierData.bonusWithFee\n\n // const bonus_new = 1 + newBonusWithThisTier / 100\n\n // const denominator = bonus_new - bonus_curr + tierBoostRate\n const denominator = (1 - tierBoostRate) * priceDiff + tierBoostRate\n const minBreakeven = denominator > 0 ? tierCostUsd / denominator : Infinity\n const minBreakevenWithFee = minBreakeven * 1.05 + 0.1\n\n // for debugging purposes this two should match\n // const originalOutputUsd = minBreakeven * bonus_curr\n // const outputAfterUpgrade = (minBreakeven - (tierCostUsd - minBreakeven * tierBoostRate)) * bonus_new\n\n const isProfitable = inputAmountUSD > (minBreakevenWithFee ?? 0)\n\n dataToReturn[tierData.boost] = {\n tier: tierData.boost as NewTiers,\n tierName,\n isProfitable,\n tierCostUSD: tierCostUsd,\n minBreakevenWithFeeUSD: minBreakevenWithFee,\n necessaryPointsToUpgrade: abondNeededRaw * 4,\n }\n }\n\n const profitableTiers = Object.values(dataToReturn).filter((item) => item.isProfitable)\n const highestProfitableTier = profitableTiers[profitableTiers.length - 1]\n\n return { tierBoostPoints, highestProfitableTier, data: Object.values(dataToReturn) }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/views/BuyBond/utils.ts"],"sourcesContent":["import { BondsData } from '../../types/bonds'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { getUserTier, NewTiers, TIERS_NAMES } from '../../state/tiers/useTierPoints'\nimport { ChainId } from '@ape.swap/apeswap-lists'\n\nexport function calculateOptimizationData(\n inputAmount: string,\n userPoints = '0',\n bond: BondsData,\n inputTokenPriceUsd = 0,\n abondPriceUsd?: number,\n) {\n if (bond.chainId === ChainId.SUI || bond.chainId === ChainId.APTOS || bond.chainId === ChainId.SOL) return null\n\n const { trueBondPrices } = bond\n\n if (!trueBondPrices) {\n console.log('no truebondprices')\n return null\n }\n if (!abondPriceUsd) {\n console.log('No Abond Price')\n return null\n }\n\n if (inputTokenPriceUsd <= 0) {\n console.log('missing token price')\n return null\n }\n\n const currentTierData = findHighestTrueBondPrice(userPoints, trueBondPrices)\n const currentTier = getUserTier(userPoints)!\n\n // const bonus_curr = 1 + currentTierData?.bonusWithFee! / 100\n const currentPoints = BigInt(userPoints)\n\n const inputAmountUSD = parseFloat(inputAmount || '0') * inputTokenPriceUsd\n\n const tierBoostRate = (bond.tierBoostRate ?? 0) / 100\n const tierBoostUsd = inputAmountUSD * tierBoostRate\n const feeInAbond = tierBoostUsd / abondPriceUsd\n const tierBoostPoints = feeInAbond * 4\n const currentPrice = parseFloat(currentTierData?.trueBondPrice!)\n\n const dataToReturn: Record<\n number,\n {\n tier: number\n tierName: string\n isProfitable: boolean\n tierCostUSD: number\n minBreakevenWithFeeUSD: number\n necessaryPointsToUpgrade: number\n }\n > = {}\n\n for (const tierData of trueBondPrices) {\n if (tierData.boost <= currentTier) continue\n // @ts-ignore\n const tierName = TIERS_NAMES[tierData.boost]\n\n const pointsNeededWei = BigInt(tierData.points) - currentPoints\n const abondNeededRaw = Math.ceil(Number(pointsNeededWei) / 1e18 / 4)\n\n const tierCostUsd = abondNeededRaw * abondPriceUsd\n const newPrice = parseFloat(tierData.trueBondPrice)\n const priceDiff = (currentPrice - newPrice) / currentPrice\n\n // const newBonusWithThisTier = tierData.bonusWithFee\n\n // const bonus_new = 1 + newBonusWithThisTier / 100\n\n // const denominator = bonus_new - bonus_curr + tierBoostRate\n const denominator = (1 - tierBoostRate) * priceDiff + tierBoostRate\n const minBreakeven = denominator > 0 ? tierCostUsd / denominator : Infinity\n const minBreakevenWithFee = minBreakeven * 1.05 + 0.1\n\n // for debugging purposes this two should match\n // const originalOutputUsd = minBreakeven * bonus_curr\n // const outputAfterUpgrade = (minBreakeven - (tierCostUsd - minBreakeven * tierBoostRate)) * bonus_new\n\n const isProfitable = inputAmountUSD > (minBreakevenWithFee ?? 0)\n\n dataToReturn[tierData.boost] = {\n tier: tierData.boost as NewTiers,\n tierName,\n isProfitable,\n tierCostUSD: tierCostUsd,\n minBreakevenWithFeeUSD: minBreakevenWithFee,\n necessaryPointsToUpgrade: abondNeededRaw * 4,\n }\n }\n\n const profitableTiers = Object.values(dataToReturn).filter((item) => item.isProfitable)\n const highestProfitableTier = profitableTiers[profitableTiers.length - 1]\n\n return { tierBoostPoints, highestProfitableTier, data: Object.values(dataToReturn) }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ import YourBondsModal from '../../../YourBondsModal/YourBondsModal.js';
|
|
|
22
22
|
import { reportError } from '../../../../utils/reportError.js';
|
|
23
23
|
import { useQueryClient } from '@tanstack/react-query';
|
|
24
24
|
import useSUIAccount from '../../../../hooks/accounts/useSUIAccount.js';
|
|
25
|
-
import {
|
|
25
|
+
import { SUI_CLAIM_FUNCTION } from '../../../../constants/suiConstants.js';
|
|
26
26
|
import { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers.js';
|
|
27
27
|
import { QUERY_KEYS } from '../../../../config/constants/queryKeys.js';
|
|
28
28
|
|
|
@@ -51,7 +51,7 @@ const UserBondRowSui = ({ bill }) => {
|
|
|
51
51
|
return;
|
|
52
52
|
try {
|
|
53
53
|
setLoadingTx(true);
|
|
54
|
-
const market = bill?.bond?.contractAddress?.[
|
|
54
|
+
const market = bill?.bond?.contractAddress?.[ChainId.SUI];
|
|
55
55
|
if (!market)
|
|
56
56
|
throw new Error('Missing bond market address');
|
|
57
57
|
// The user's BondNFT object ID is stored in `bill.address`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserBondRowSui.js","sources":["../../../../../src/views/YourBonds/components/UserBondRow/UserBondRowSui.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport TokenInfoAndName from '../../../../components/TokenInfoAndName'\nimport { formatNumberSI } from '../../../../utils/formatNumber'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport Svg from '../../../../components/uikit-sdk/Svg'\nimport TooltipBubble from '../../../../components/uikit-sdk/TooltipBubble'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport { NETWORK_LABEL } from '../../../../config/constants/chains'\nimport { UserBill } from '../../../../types/yourbonds'\nimport {\n claimable,\n getPendingVestingString,\n getPercentageVested,\n getTimeLeftForFullyVested,\n pending,\n} from '../../../../utils/displayHelpers'\nimport useModal from '../../../../hooks/useModal'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport Tooltip from '../../../../components/Tooltip/Tooltip'\nimport { getTimePeriods } from '../../../../utils/getTimePeriods'\nimport ProfitCard from '../ProfitCard/ProfitCard'\nimport ProgressBar from '../../../../components/ProgressBar/ProgressBar'\nimport ProgressBarWrapper from '../../../../components/ProgressBar/ProgressBarWrapper'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport YourBondsModal from '../../../YourBondsModal/YourBondsModal'\nimport { reportError } from '../../../../utils/reportError'\n\nimport { useQueryClient } from '@tanstack/react-query'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport { SUI_CLAIM_FUNCTION, SUI_BOND_MARKET } from '../../../../constants/suiConstants'\nimport { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\n\n// Row renderer for Sui user bonds. Structure and layout mirror\n// `UserBondRowAptos` so the Your Bonds grid stays visually consistent\n// across VMs. The only meaningful divergence is `handleClaim`, which\n// builds a Sui `Transaction` with a moveCall for the claim function.\nconst UserBondRowSui = ({ bill }: { bill: UserBill }) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { addToastError, addToastSuccess } = usePopups()\n\n // State\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Static Data\n const earnTokenPrice = parseFloat(bill?.bond?.payoutTokenPrice ?? '0')\n const vestingCliff = bill?.bond?.vestingCliff\n const currentTime = Math.round(new Date().getTime() / 1000)\n const vestingStartTimestamp = parseInt(bill?.vestingStartTimestamp ?? '0')\n const isPendingCliff = vestingCliff ? currentTime - vestingStartTimestamp < vestingCliff : false\n const cliffCountdown = getTimePeriods(vestingStartTimestamp + (vestingCliff ?? 0) - currentTime, true)\n\n const [onOpenPurchasedBond] = useModal(<YourBondsModal userBill={bill} />)\n\n const handleClaim = async () => {\n if (loadingTx || !suiAccount || !signAndExecuteTransaction) return\n\n try {\n setLoadingTx(true)\n\n const market = bill?.bond?.contractAddress?.[bill?.bond?.chainId ?? 0] ?? SUI_BOND_MARKET\n if (!market) throw new Error('Missing bond market address')\n\n // The user's BondNFT object ID is stored in `bill.address`\n const nftObjectId = bill?.address\n if (!nftObjectId) throw new Error('Missing bond NFT object ID')\n\n const payoutCoinType = bill?.bond?.earnToken?.address?.[bill?.bond?.chainId ?? 0]\n const principalCoinType = bill?.bond?.lpToken?.address?.[bill?.bond?.chainId ?? 0]\n if (!payoutCoinType || !principalCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const [claimedCoin] = tx.moveCall({\n target: SUI_CLAIM_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(nftObjectId),\n tx.object('0x6'), // clock\n ],\n })\n tx.transferObjects([claimedCoin], tx.pure.address(suiAccount))\n\n // Pre-build so the wallet receives fully-resolved bytes\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const suiClient = getSuiClient()\n const builtBytes = await tx.build({ client: suiClient })\n const prebuiltTx = Transaction.from(builtBytes)\n\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] })\n addToastSuccess(digest, ChainId.SUI)\n } catch (error: any) {\n console.error('Sui claim failed:', error)\n addToastError(error?.message ?? 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n chainId: ChainId.SUI,\n account: suiAccount ?? '',\n extraInfo: { type: 'suiClaim', bill, error },\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n return (\n <div className=\"your-bonds\" onClick={() => onOpenPurchasedBond()}>\n <div className=\"token-info-container\">\n <TokenInfoAndName\n tokenSymbol={bill.bond?.earnToken.symbol}\n chain={bill?.bond?.chainId}\n vestEnds={getTimeLeftForFullyVested(bill) > 0 ? `Ends in ${getPendingVestingString(bill)}` : `Fully Vested`}\n isHotBond\n />\n <div className=\"tooltip-column\">\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Tooltip\n earnTokenContract={bill?.bond?.earnToken.address[bill?.bond.chainId] || ''}\n earnTokenSymbol={bill?.bond?.earnToken.symbol || ''}\n bondContract={bill?.address ?? ''}\n projectLink={bill?.bond?.projectLink}\n twitter={bill?.bond?.twitter}\n chain={bill?.bond?.chainId as number}\n cgId={bill?.bond?.cgId}\n dexscreener={bill?.bond?.dexscreener}\n />\n }\n width=\"205px\"\n placement=\"bottomRight\"\n transformTip=\"translate(5%, 0%)\"\n >\n <Flex sx={{ opacity: 0.8 }}>\n <Svg icon=\"more\" width=\"25px\" />\n </Flex>\n </TooltipBubble>\n </div>\n </div>\n <div className=\"your-bonds-columns-container\">\n <Flex sx={{ width: '125px' }}>\n <ProfitCard userBond={bill} />\n </Flex>\n <div className=\"your-bonds-content\">\n <div className=\"your-bonds-content-title\">Claimable</div>\n <div className=\"your-bonds-content-tokens-amount\">\n {formatNumberSI(claimable(bill), 4)}\n <div className=\"your-bonds-content-tokens-usd-amount\">\n {`($${(claimable(bill) * earnTokenPrice).toFixed(2)})`}\n </div>\n </div>\n </div>\n <div className=\"your-bonds-content\">\n <div className=\"your-bonds-content-title\">Pending</div>\n <div className=\"your-bonds-content-tokens-amount\">\n {formatNumberSI(pending(bill), 4)}\n <div className=\"your-bonds-content-tokens-usd-amount\">\n {`($${(pending(bill) * earnTokenPrice).toFixed(2)})`}\n </div>\n </div>\n </div>\n <div className=\"your-bonds-content hide-mobile\">\n <ProgressBarWrapper\n title={''}\n value={<ProgressBar value={getPercentageVested(bill)} />}\n style={{\n width: '127px',\n height: '25px',\n flexDirection: 'column',\n justifyContent: 'center',\n display: ['none', 'none', 'none', 'flex'],\n }}\n showTooltip={true}\n toolTip={\n getTimeLeftForFullyVested(bill) > 0\n ? `Fully vested in ${getPendingVestingString(bill)}.`\n : `Fully Vested.`\n }\n />\n </div>\n <div className=\"your-bonds-column-button\">\n {!suiAccount ? (\n <Button className=\"button\" disabled={true} fullWidth>\n Connect to {NETWORK_LABEL[ChainId.SUI]}\n </Button>\n ) : (\n <Button\n className=\"button\"\n disabled={claimable(bill) === 0 || loadingTx || isPendingCliff}\n load={loadingTx}\n onClick={(event) => {\n event.stopPropagation()\n if (!loadingTx) handleClaim()\n }}\n fullWidth\n >\n {isPendingCliff\n ? `Claimable in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`\n : 'Claim'}\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default UserBondRowSui\n"],"names":["_jsx","_jsxs","Tooltip"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserBondRowSui.js","sources":["../../../../../src/views/YourBonds/components/UserBondRow/UserBondRowSui.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport TokenInfoAndName from '../../../../components/TokenInfoAndName'\nimport { formatNumberSI } from '../../../../utils/formatNumber'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport Svg from '../../../../components/uikit-sdk/Svg'\nimport TooltipBubble from '../../../../components/uikit-sdk/TooltipBubble'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport { NETWORK_LABEL } from '../../../../config/constants/chains'\nimport { UserBill } from '../../../../types/yourbonds'\nimport {\n claimable,\n getPendingVestingString,\n getPercentageVested,\n getTimeLeftForFullyVested,\n pending,\n} from '../../../../utils/displayHelpers'\nimport useModal from '../../../../hooks/useModal'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport Tooltip from '../../../../components/Tooltip/Tooltip'\nimport { getTimePeriods } from '../../../../utils/getTimePeriods'\nimport ProfitCard from '../ProfitCard/ProfitCard'\nimport ProgressBar from '../../../../components/ProgressBar/ProgressBar'\nimport ProgressBarWrapper from '../../../../components/ProgressBar/ProgressBarWrapper'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport YourBondsModal from '../../../YourBondsModal/YourBondsModal'\nimport { reportError } from '../../../../utils/reportError'\n\nimport { useQueryClient } from '@tanstack/react-query'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport { SUI_CLAIM_FUNCTION } from '../../../../constants/suiConstants'\nimport { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\n\n// Row renderer for Sui user bonds. Structure and layout mirror\n// `UserBondRowAptos` so the Your Bonds grid stays visually consistent\n// across VMs. The only meaningful divergence is `handleClaim`, which\n// builds a Sui `Transaction` with a moveCall for the claim function.\nconst UserBondRowSui = ({ bill }: { bill: UserBill }) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { addToastError, addToastSuccess } = usePopups()\n\n // State\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Static Data\n const earnTokenPrice = parseFloat(bill?.bond?.payoutTokenPrice ?? '0')\n const vestingCliff = bill?.bond?.vestingCliff\n const currentTime = Math.round(new Date().getTime() / 1000)\n const vestingStartTimestamp = parseInt(bill?.vestingStartTimestamp ?? '0')\n const isPendingCliff = vestingCliff ? currentTime - vestingStartTimestamp < vestingCliff : false\n const cliffCountdown = getTimePeriods(vestingStartTimestamp + (vestingCliff ?? 0) - currentTime, true)\n\n const [onOpenPurchasedBond] = useModal(<YourBondsModal userBill={bill} />)\n\n const handleClaim = async () => {\n if (loadingTx || !suiAccount || !signAndExecuteTransaction) return\n\n try {\n setLoadingTx(true)\n\n const market = bill?.bond?.contractAddress?.[ChainId.SUI]\n if (!market) throw new Error('Missing bond market address')\n\n // The user's BondNFT object ID is stored in `bill.address`\n const nftObjectId = bill?.address\n if (!nftObjectId) throw new Error('Missing bond NFT object ID')\n\n const payoutCoinType = bill?.bond?.earnToken?.address?.[bill?.bond?.chainId ?? 0]\n const principalCoinType = bill?.bond?.lpToken?.address?.[bill?.bond?.chainId ?? 0]\n if (!payoutCoinType || !principalCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const [claimedCoin] = tx.moveCall({\n target: SUI_CLAIM_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(nftObjectId),\n tx.object('0x6'), // clock\n ],\n })\n tx.transferObjects([claimedCoin], tx.pure.address(suiAccount))\n\n // Pre-build so the wallet receives fully-resolved bytes\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const suiClient = getSuiClient()\n const builtBytes = await tx.build({ client: suiClient })\n const prebuiltTx = Transaction.from(builtBytes)\n\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] })\n addToastSuccess(digest, ChainId.SUI)\n } catch (error: any) {\n console.error('Sui claim failed:', error)\n addToastError(error?.message ?? 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n chainId: ChainId.SUI,\n account: suiAccount ?? '',\n extraInfo: { type: 'suiClaim', bill, error },\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n return (\n <div className=\"your-bonds\" onClick={() => onOpenPurchasedBond()}>\n <div className=\"token-info-container\">\n <TokenInfoAndName\n tokenSymbol={bill.bond?.earnToken.symbol}\n chain={bill?.bond?.chainId}\n vestEnds={getTimeLeftForFullyVested(bill) > 0 ? `Ends in ${getPendingVestingString(bill)}` : `Fully Vested`}\n isHotBond\n />\n <div className=\"tooltip-column\">\n <TooltipBubble\n className=\"tooltip-bubble\"\n body={\n <Tooltip\n earnTokenContract={bill?.bond?.earnToken.address[bill?.bond.chainId] || ''}\n earnTokenSymbol={bill?.bond?.earnToken.symbol || ''}\n bondContract={bill?.address ?? ''}\n projectLink={bill?.bond?.projectLink}\n twitter={bill?.bond?.twitter}\n chain={bill?.bond?.chainId as number}\n cgId={bill?.bond?.cgId}\n dexscreener={bill?.bond?.dexscreener}\n />\n }\n width=\"205px\"\n placement=\"bottomRight\"\n transformTip=\"translate(5%, 0%)\"\n >\n <Flex sx={{ opacity: 0.8 }}>\n <Svg icon=\"more\" width=\"25px\" />\n </Flex>\n </TooltipBubble>\n </div>\n </div>\n <div className=\"your-bonds-columns-container\">\n <Flex sx={{ width: '125px' }}>\n <ProfitCard userBond={bill} />\n </Flex>\n <div className=\"your-bonds-content\">\n <div className=\"your-bonds-content-title\">Claimable</div>\n <div className=\"your-bonds-content-tokens-amount\">\n {formatNumberSI(claimable(bill), 4)}\n <div className=\"your-bonds-content-tokens-usd-amount\">\n {`($${(claimable(bill) * earnTokenPrice).toFixed(2)})`}\n </div>\n </div>\n </div>\n <div className=\"your-bonds-content\">\n <div className=\"your-bonds-content-title\">Pending</div>\n <div className=\"your-bonds-content-tokens-amount\">\n {formatNumberSI(pending(bill), 4)}\n <div className=\"your-bonds-content-tokens-usd-amount\">\n {`($${(pending(bill) * earnTokenPrice).toFixed(2)})`}\n </div>\n </div>\n </div>\n <div className=\"your-bonds-content hide-mobile\">\n <ProgressBarWrapper\n title={''}\n value={<ProgressBar value={getPercentageVested(bill)} />}\n style={{\n width: '127px',\n height: '25px',\n flexDirection: 'column',\n justifyContent: 'center',\n display: ['none', 'none', 'none', 'flex'],\n }}\n showTooltip={true}\n toolTip={\n getTimeLeftForFullyVested(bill) > 0\n ? `Fully vested in ${getPendingVestingString(bill)}.`\n : `Fully Vested.`\n }\n />\n </div>\n <div className=\"your-bonds-column-button\">\n {!suiAccount ? (\n <Button className=\"button\" disabled={true} fullWidth>\n Connect to {NETWORK_LABEL[ChainId.SUI]}\n </Button>\n ) : (\n <Button\n className=\"button\"\n disabled={claimable(bill) === 0 || loadingTx || isPendingCliff}\n load={loadingTx}\n onClick={(event) => {\n event.stopPropagation()\n if (!loadingTx) handleClaim()\n }}\n fullWidth\n >\n {isPendingCliff\n ? `Claimable in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`\n : 'Claim'}\n </Button>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default UserBondRowSui\n"],"names":["_jsx","_jsxs","Tooltip"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { reportError } from '../../../../utils/reportError.js';
|
|
|
11
11
|
import Button from '../../../../components/uikit-sdk/Button/Button.js';
|
|
12
12
|
import { useQueryClient } from '@tanstack/react-query';
|
|
13
13
|
import useSUIAccount from '../../../../hooks/accounts/useSUIAccount.js';
|
|
14
|
-
import {
|
|
14
|
+
import { SUI_CLAIM_FUNCTION } from '../../../../constants/suiConstants.js';
|
|
15
15
|
import { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers.js';
|
|
16
16
|
import { QUERY_KEYS } from '../../../../config/constants/queryKeys.js';
|
|
17
17
|
|
|
@@ -42,7 +42,7 @@ const ActionsSui = ({ userBill }) => {
|
|
|
42
42
|
return;
|
|
43
43
|
try {
|
|
44
44
|
setLoadingTx(true);
|
|
45
|
-
const market = userBill?.bond?.contractAddress?.[userBill?.bond?.chainId
|
|
45
|
+
const market = userBill?.bond?.contractAddress?.[userBill?.bond?.chainId];
|
|
46
46
|
if (!market)
|
|
47
47
|
throw new Error('Missing bond market address');
|
|
48
48
|
// The user's BondNFT object ID is stored in `bill.address`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsSui.js","sources":["../../../../../src/views/YourBondsModal/components/Actions/ActionsSui.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport { claimable } from '../../../../utils/displayHelpers'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { getTimePeriods } from '../../../../utils/getTimePeriods'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { reportError } from '../../../../utils/reportError'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\n\nimport { useQueryClient } from '@tanstack/react-query'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport { SUI_CLAIM_FUNCTION, SUI_BOND_MARKET } from '../../../../constants/suiConstants'\nimport { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\n\n// YourBondsModal action buttons for Sui bonds. Mirrors the shape of\n// `ActionsAptos`: one Claim button and one \"Buy again\" button that\n// jumps to an active bond of the same showcase token.\nconst ActionsSui = ({ userBill }: { userBill?: UserBill }) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { addToastError, addToastSuccess } = usePopups()\n const { data: liveBonds } = useBondsData()\n\n // State\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Static Data\n const similarLiveBond = liveBonds?.find(\n (bond) =>\n !bond?.soldOut &&\n !bond?.hide &&\n bond?.earnToken?.symbol?.toLowerCase() === userBill?.bond?.earnToken?.symbol?.toLowerCase(),\n )\n const canPurchaseAgain = !!similarLiveBond\n const vestingCliff = userBill?.bond?.vestingCliff\n const currentTime = Math.round(new Date().getTime() / 1000)\n const purchaseTimestamp = parseInt(userBill?.vestingStartTimestamp ?? '0')\n const isPendingCliff = vestingCliff ? currentTime - purchaseTimestamp < vestingCliff : false\n const cliffCountdown = getTimePeriods(purchaseTimestamp + (vestingCliff ?? 0) - currentTime, true)\n\n const handleClaim = async () => {\n if (loadingTx || !suiAccount || !userBill || !signAndExecuteTransaction) return\n\n try {\n setLoadingTx(true)\n\n const market = userBill?.bond?.contractAddress?.[userBill?.bond?.chainId ?? 0] ?? SUI_BOND_MARKET\n if (!market) throw new Error('Missing bond market address')\n\n // The user's BondNFT object ID is stored in `bill.address`\n const nftObjectId = userBill?.address\n if (!nftObjectId) throw new Error('Missing bond NFT object ID')\n\n const payoutCoinType = userBill?.bond?.earnToken?.address?.[userBill?.bond?.chainId ?? 0]\n const principalCoinType = userBill?.bond?.lpToken?.address?.[userBill?.bond?.chainId ?? 0]\n if (!payoutCoinType || !principalCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const [claimedCoin] = tx.moveCall({\n target: SUI_CLAIM_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(nftObjectId),\n tx.object('0x6'), // clock\n ],\n })\n tx.transferObjects([claimedCoin], tx.pure.address(suiAccount))\n\n // Pre-build so the wallet receives fully-resolved bytes\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const suiClient = getSuiClient()\n const builtBytes = await tx.build({ client: suiClient })\n const prebuiltTx = Transaction.from(builtBytes)\n\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] })\n addToastSuccess(digest, ChainId.SUI)\n } catch (error: any) {\n console.error('Sui claim failed:', error)\n addToastError(error?.message ?? 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n account: suiAccount ?? '',\n chainId: ChainId.SUI,\n extraInfo: { type: 'suiClaim', userBill, error },\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n return (\n <>\n <Button\n variant=\"secondary\"\n disabled={claimable(userBill) === 0 || loadingTx || !userBill || isPendingCliff}\n load={loadingTx}\n onClick={(event) => {\n event.stopPropagation()\n if (!loadingTx) handleClaim()\n }}\n sx={{ fontSize: '14px', width: '100%' }}\n >\n {isPendingCliff\n ? `Claimable in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`\n : 'Claim'}\n </Button>\n <Button\n sx={{ fontSize: '14px', width: '100%' }}\n onClick={() => {\n if (!canPurchaseAgain) return\n const baseUrl = process.env.NODE_ENV === 'production' ? 'https://ape.bond/bonds' : window.location.origin\n const params = `bondAddress=${similarLiveBond.contractAddress[similarLiveBond.chainId]}&bondChain=${similarLiveBond.chainId}`\n window.location.href = `${baseUrl}?${params}`\n }}\n disabled={!canPurchaseAgain}\n >\n {canPurchaseAgain ? 'Buy again' : 'sold out'}\n </Button>\n </>\n )\n}\n\nexport default ActionsSui\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionsSui.js","sources":["../../../../../src/views/YourBondsModal/components/Actions/ActionsSui.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { Transaction } from '@mysten/sui/transactions'\n\nimport { claimable } from '../../../../utils/displayHelpers'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { getTimePeriods } from '../../../../utils/getTimePeriods'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { reportError } from '../../../../utils/reportError'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\n\nimport { useQueryClient } from '@tanstack/react-query'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport { SUI_CLAIM_FUNCTION } from '../../../../constants/suiConstants'\nimport { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\n\n// YourBondsModal action buttons for Sui bonds. Mirrors the shape of\n// `ActionsAptos`: one Claim button and one \"Buy again\" button that\n// jumps to an active bond of the same showcase token.\nconst ActionsSui = ({ userBill }: { userBill?: UserBill }) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { addToastError, addToastSuccess } = usePopups()\n const { data: liveBonds } = useBondsData()\n\n // State\n const [loadingTx, setLoadingTx] = useState(false)\n\n // Static Data\n const similarLiveBond = liveBonds?.find(\n (bond) =>\n !bond?.soldOut &&\n !bond?.hide &&\n bond?.earnToken?.symbol?.toLowerCase() === userBill?.bond?.earnToken?.symbol?.toLowerCase(),\n )\n const canPurchaseAgain = !!similarLiveBond\n const vestingCliff = userBill?.bond?.vestingCliff\n const currentTime = Math.round(new Date().getTime() / 1000)\n const purchaseTimestamp = parseInt(userBill?.vestingStartTimestamp ?? '0')\n const isPendingCliff = vestingCliff ? currentTime - purchaseTimestamp < vestingCliff : false\n const cliffCountdown = getTimePeriods(purchaseTimestamp + (vestingCliff ?? 0) - currentTime, true)\n\n const handleClaim = async () => {\n if (loadingTx || !suiAccount || !userBill || !signAndExecuteTransaction) return\n\n try {\n setLoadingTx(true)\n\n const market = userBill?.bond?.contractAddress?.[userBill?.bond?.chainId]\n if (!market) throw new Error('Missing bond market address')\n\n // The user's BondNFT object ID is stored in `bill.address`\n const nftObjectId = userBill?.address\n if (!nftObjectId) throw new Error('Missing bond NFT object ID')\n\n const payoutCoinType = userBill?.bond?.earnToken?.address?.[userBill?.bond?.chainId ?? 0]\n const principalCoinType = userBill?.bond?.lpToken?.address?.[userBill?.bond?.chainId ?? 0]\n if (!payoutCoinType || !principalCoinType) throw new Error('Missing token type info')\n\n const tx = new Transaction()\n const [claimedCoin] = tx.moveCall({\n target: SUI_CLAIM_FUNCTION,\n typeArguments: [payoutCoinType, principalCoinType],\n arguments: [\n tx.object(market),\n tx.object(nftObjectId),\n tx.object('0x6'), // clock\n ],\n })\n tx.transferObjects([claimedCoin], tx.pure.address(suiAccount))\n\n // Pre-build so the wallet receives fully-resolved bytes\n tx.setSender(suiAccount)\n tx.setGasBudget(50_000_000)\n const suiClient = getSuiClient()\n const builtBytes = await tx.build({ client: suiClient })\n const prebuiltTx = Transaction.from(builtBytes)\n\n const response = await signAndExecuteTransaction({\n transaction: prebuiltTx,\n })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] })\n addToastSuccess(digest, ChainId.SUI)\n } catch (error: any) {\n console.error('Sui claim failed:', error)\n addToastError(error?.message ?? 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n account: suiAccount ?? '',\n chainId: ChainId.SUI,\n extraInfo: { type: 'suiClaim', userBill, error },\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n return (\n <>\n <Button\n variant=\"secondary\"\n disabled={claimable(userBill) === 0 || loadingTx || !userBill || isPendingCliff}\n load={loadingTx}\n onClick={(event) => {\n event.stopPropagation()\n if (!loadingTx) handleClaim()\n }}\n sx={{ fontSize: '14px', width: '100%' }}\n >\n {isPendingCliff\n ? `Claimable in ${cliffCountdown.days !== 0 ? `${cliffCountdown.days} days` : cliffCountdown.hours !== 0 ? `${cliffCountdown.hours} hours` : `${cliffCountdown.minutes} mins`}`\n : 'Claim'}\n </Button>\n <Button\n sx={{ fontSize: '14px', width: '100%' }}\n onClick={() => {\n if (!canPurchaseAgain) return\n const baseUrl = process.env.NODE_ENV === 'production' ? 'https://ape.bond/bonds' : window.location.origin\n const params = `bondAddress=${similarLiveBond.contractAddress[similarLiveBond.chainId]}&bondChain=${similarLiveBond.chainId}`\n window.location.href = `${baseUrl}?${params}`\n }}\n disabled={!canPurchaseAgain}\n >\n {canPurchaseAgain ? 'Buy again' : 'sold out'}\n </Button>\n </>\n )\n}\n\nexport default ActionsSui\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { UserBill } from '../../../../types/yourbonds';
|
|
3
|
+
declare const TransferActionSui: ({ userBill, toAddress, disabled, onDismiss, }: {
|
|
4
|
+
userBill?: UserBill;
|
|
5
|
+
toAddress?: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
onDismiss?: () => void;
|
|
8
|
+
}) => React.JSX.Element;
|
|
9
|
+
export default TransferActionSui;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx } from 'theme-ui/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
4
|
+
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
5
|
+
import Button from '../../../../components/uikit-sdk/Button/Button.js';
|
|
6
|
+
import { usePopups } from '../../../../state/popups/usePopups.js';
|
|
7
|
+
import { useSDKConfig } from '../../../../state/useSDKConfig.js';
|
|
8
|
+
import { reportError } from '../../../../utils/reportError.js';
|
|
9
|
+
import { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers.js';
|
|
10
|
+
import useSUIAccount from '../../../../hooks/accounts/useSUIAccount.js';
|
|
11
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
12
|
+
import { QUERY_KEYS } from '../../../../config/constants/queryKeys.js';
|
|
13
|
+
|
|
14
|
+
const TransferActionSui = ({ userBill, toAddress, disabled, onDismiss, }) => {
|
|
15
|
+
// Hooks
|
|
16
|
+
const SDKConfig = useSDKConfig();
|
|
17
|
+
const queryClient = useQueryClient();
|
|
18
|
+
const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount();
|
|
19
|
+
const { addToastError, addToastSuccess } = usePopups();
|
|
20
|
+
// State
|
|
21
|
+
const [loadingTx, setLoadingTx] = useState(false);
|
|
22
|
+
const [connectModalOpen, setConnectModalOpen] = useState(false);
|
|
23
|
+
const load = loadingTx;
|
|
24
|
+
const handleTransfer = async () => {
|
|
25
|
+
if (loadingTx || !suiAccount || !userBill || !signAndExecuteTransaction || !toAddress)
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
setLoadingTx(true);
|
|
29
|
+
// The BondNFT object ID is stored in `userBill.address`
|
|
30
|
+
const nftObjectId = userBill?.address;
|
|
31
|
+
if (!nftObjectId)
|
|
32
|
+
throw new Error('Missing bond NFT object ID');
|
|
33
|
+
const tx = new Transaction();
|
|
34
|
+
// Standard Sui PTB object transfer: move the NFT to the recipient
|
|
35
|
+
tx.transferObjects([tx.object(nftObjectId)], tx.pure.address(toAddress));
|
|
36
|
+
tx.setSender(suiAccount);
|
|
37
|
+
tx.setGasBudget(10000000);
|
|
38
|
+
// Pre-build so the wallet receives fully-resolved bytes
|
|
39
|
+
const suiClient = getSuiClient();
|
|
40
|
+
const builtBytes = await tx.build({ client: suiClient });
|
|
41
|
+
const prebuiltTx = Transaction.from(builtBytes);
|
|
42
|
+
const response = await signAndExecuteTransaction({ transaction: prebuiltTx });
|
|
43
|
+
const digest = response?.digest;
|
|
44
|
+
if (!digest)
|
|
45
|
+
throw new Error('No tx digest returned by wallet');
|
|
46
|
+
await suiClient.waitForTransaction({ digest });
|
|
47
|
+
await verifySuiTxSuccess(digest);
|
|
48
|
+
await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] });
|
|
49
|
+
addToastSuccess(digest, ChainId.SUI);
|
|
50
|
+
setTimeout(() => onDismiss?.(), 1500);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('Sui transfer failed:', error);
|
|
54
|
+
addToastError(error?.message ?? 'Unknown error');
|
|
55
|
+
reportError({
|
|
56
|
+
apiUrl: SDKConfig?.urls?.apiV2,
|
|
57
|
+
error,
|
|
58
|
+
account: suiAccount ?? '',
|
|
59
|
+
chainId: ChainId.SUI,
|
|
60
|
+
extraInfo: { type: 'suiTransfer', userBill, toAddress, error },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
setLoadingTx(false);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return (jsx(Button, { onClick: handleTransfer, load: load, disabled: load || disabled, fullWidth: true, children: "transfer" }));
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { TransferActionSui as default };
|
|
71
|
+
//# sourceMappingURL=TransferActionSui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransferActionSui.js","sources":["../../../../../src/views/YourBondsModal/components/TransferBondModal/TransferActionSui.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { ConnectModal } from '@mysten/dapp-kit'\nimport { ChainId } from '@ape.swap/apeswap-lists'\n\nimport { UserBill } from '../../../../types/yourbonds'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { reportError } from '../../../../utils/reportError'\nimport { getSuiClient, verifySuiTxSuccess } from '../../../../utils/suiHelpers'\nimport useSUIAccount from '../../../../hooks/accounts/useSUIAccount'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\n\nconst TransferActionSui = ({\n userBill,\n toAddress,\n disabled,\n onDismiss,\n}: {\n userBill?: UserBill\n toAddress?: string\n disabled?: boolean\n onDismiss?: () => void\n}) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const queryClient = useQueryClient()\n const { address: suiAccount, signAndExecuteTransaction } = useSUIAccount()\n const { addToastError, addToastSuccess } = usePopups()\n\n // State\n const [loadingTx, setLoadingTx] = useState(false)\n const [connectModalOpen, setConnectModalOpen] = useState(false)\n\n const load = loadingTx\n\n const handleTransfer = async () => {\n if (loadingTx || !suiAccount || !userBill || !signAndExecuteTransaction || !toAddress) return\n\n try {\n setLoadingTx(true)\n\n // The BondNFT object ID is stored in `userBill.address`\n const nftObjectId = userBill?.address\n if (!nftObjectId) throw new Error('Missing bond NFT object ID')\n\n const tx = new Transaction()\n\n // Standard Sui PTB object transfer: move the NFT to the recipient\n tx.transferObjects([tx.object(nftObjectId)], tx.pure.address(toAddress))\n\n tx.setSender(suiAccount)\n tx.setGasBudget(10_000_000)\n\n // Pre-build so the wallet receives fully-resolved bytes\n const suiClient = getSuiClient()\n const builtBytes = await tx.build({ client: suiClient })\n const prebuiltTx = Transaction.from(builtBytes)\n\n const response = await signAndExecuteTransaction({ transaction: prebuiltTx })\n\n const digest = response?.digest\n if (!digest) throw new Error('No tx digest returned by wallet')\n\n await suiClient.waitForTransaction({ digest })\n await verifySuiTxSuccess(digest)\n\n await queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.USER_BONDS] })\n addToastSuccess(digest, ChainId.SUI)\n setTimeout(() => onDismiss?.(), 1500)\n } catch (error: any) {\n console.error('Sui transfer failed:', error)\n addToastError(error?.message ?? 'Unknown error')\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n account: suiAccount ?? '',\n chainId: ChainId.SUI,\n extraInfo: { type: 'suiTransfer', userBill, toAddress, error },\n })\n } finally {\n setLoadingTx(false)\n }\n }\n\n return (\n <Button onClick={handleTransfer} load={load} disabled={load || disabled} fullWidth>\n transfer\n </Button>\n )\n}\n\nexport default TransferActionSui\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import TransferAction$1 from './TransferAction.js';
|
|
|
13
13
|
import { getTimeLeftForFullyVested, getPendingVestingString } from '../../../../utils/displayHelpers.js';
|
|
14
14
|
import TransferAction from './TransferActionSolana.js';
|
|
15
15
|
import TransferActionAptos from './TransferActionAptos.js';
|
|
16
|
+
import TransferActionSui from './TransferActionSui.js';
|
|
16
17
|
|
|
17
18
|
const TransferModal = ({ onDismiss, userBill }) => {
|
|
18
19
|
// State
|
|
@@ -26,7 +27,7 @@ const TransferModal = ({ onDismiss, userBill }) => {
|
|
|
26
27
|
return (jsxs(Modal, { onDismiss: onDismiss, title: "Transfer Bond", children: [jsx(Flex, { sx: { mt: '20px' }, children: jsx(Text, { sx: { fontWeight: 700 }, children: " Transferring: " }) }), jsxs(Flex, { sx: { flexDirection: 'column', alignItems: 'center', mt: '30px', mr: '10px' }, children: [jsxs(Text, { sx: { fontWeight: 700, fontSize: '25px' }, children: [bond?.earnToken?.symbol, " Bond - ID # ", userBill?.id] }), jsxs(Flex, { sx: { mt: '5px' }, children: [jsxs(Flex, { sx: { flexDirection: 'column', mr: '20px' }, children: [jsx(Text, { sx: { textAlign: 'center', width: '100%', fontSize: '12px', opacity: 0.6 }, children: "Vesting time" }), getTimeLeftForFullyVested(userBill) > 0 ? `Ends in ${getPendingVestingString(userBill)}` : `Fully Vested`] }), jsxs(Flex, { sx: { flexDirection: 'column', ml: '20px' }, children: [jsx(Text, { sx: { textAlign: 'center', width: '100%', fontSize: '12px', opacity: 0.6 }, children: "Pending" }), jsxs(Flex, { children: [jsx(TokenImage, { symbol: userBill?.bond?.showcaseTokenName ?? userBill?.bond?.earnToken?.symbol, size: 20, chain: userBill?.bond?.chainId }), jsx(Text, { sx: { fontWeight: 700, ml: '5px' }, children: pending })] })] })] })] }), jsxs(Flex, { sx: { flexDirection: 'column', mt: '30px' }, children: [jsx(Text, { sx: { fontWeight: 700 }, children: "Receiving Address:" }), jsx(Input, { mt: "10px", size: "lg", placeholder: 'Paste the address here', value: toAddress, onChange: (e) => setToAddress(e.target.value), style: { width: '345px', border: 'none' } })] }), jsx(Flex, { sx: { mt: '15px' }, children: jsxs(Text, { sx: { lineHeight: '18px', fontSize: '12px', color: 'rgba(223, 65, 65, 1)' }, children: [jsx(Text, { sx: { display: 'block', width: '100%', fontWeight: 700, fontSize: '13px', color: 'rgba(223, 65, 65, 1)' }, children: "WARNING" }), "When transfering the NFT all pending rewards will also be transfered to the receiver address."] }) }), jsxs(Flex, { onClick: () => setConfirmSend(!confirmSend), sx: { mt: '20px', cursor: 'pointer', alignItems: 'center' }, children: [jsx(Checkbox, { checked: confirmSend, onChange: (event) => {
|
|
27
28
|
setConfirmSend(!confirmSend);
|
|
28
29
|
event.stopPropagation();
|
|
29
|
-
} }), jsx(Text, { sx: { ml: '10px', fontSize: '12px', fontWeight: 500, lineHeight: '18px' }, children: "I understand the new wallet gains ownership of all unclaimed assets." })] }), jsx(Flex, { sx: { justifyContent: 'center', mt: '15px' }, children: chainId === ChainId.SOL ? (jsx(TransferAction, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress })) : chainId === ChainId.APTOS ? (jsx(TransferActionAptos, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress })) : (jsx(TransferAction$1, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress })) })] }));
|
|
30
|
+
} }), jsx(Text, { sx: { ml: '10px', fontSize: '12px', fontWeight: 500, lineHeight: '18px' }, children: "I understand the new wallet gains ownership of all unclaimed assets." })] }), jsx(Flex, { sx: { justifyContent: 'center', mt: '15px' }, children: chainId === ChainId.SOL ? (jsx(TransferAction, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress })) : chainId === ChainId.APTOS ? (jsx(TransferActionAptos, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress })) : chainId === ChainId.SUI ? (jsx(TransferActionSui, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress, onDismiss: onDismiss })) : (jsx(TransferAction$1, { userBill: userBill, toAddress: toAddress, disabled: !confirmSend || !toAddress })) })] }));
|
|
30
31
|
};
|
|
31
32
|
var TransferBondModal = React.memo(TransferModal);
|
|
32
33
|
|