Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Кошельки, интегрирующие Raydium, обычно должны ответить на четыре вопроса для каждого пользователя: в каких пулах у этого пользователя есть LP? какие позиции (CLMM NFT) он держит? в каких фермах он застейкан? какова общая стоимость? На этой странице описывается каждый из этих вопросов.

Обнаружение позиций Raydium

Классические LP-токены (CPMM, AMM v4)

Они выглядят как любой другой SPL Token: баланс пользователя хранится в его ATA. Кошелек по умолчанию показывает это как обычный токен. Чтобы раскрыть это как позицию Raydium:
  1. Перечислите токен-аккаунты пользователя: connection.getParsedTokenAccountsByOwner(user, { programId: TOKEN_PROGRAM_ID }).
  2. Для каждого минта проверьте список минтов Raydium: GET https://api-v3.raydium.io/pools/info/lps?lps=<LP_MINT>,... (группируйте до ~50 LP-минтов за вызов).
  3. Для совпадающих минтов API возвращает ссылку на пул. Используйте её для вычисления стоимости позиции в токенах:
Показывайте как баланс LP, так и развёрнутые суммы — пользователи думают в терминах базовых токенов, а не LP-единиц.

CLMM позиции-NFT

CLMM позиции — это NFT. PDA PersonalPositionState каждой позиции производна от минта NFT. Для обнаружения:
  1. Перечислите NFT пользователя. Для устаревших Metaplex NFT: отфильтруйте токен-аккаунты по тем, у которых supply 1 и decimals 0.
  2. Для каждого NFT-минта попытайтесь вывести PDA PersonalPositionState:
  1. Перечислите позиции кошелька с помощью raydium.clmm.getOwnerPositionInfo({ programId }) и сопоставьте по nftMint (метода getPositionInfo нет). Каждая запись даёт вам:
    • poolId → получите пул для разрешения минтов
    • tickLower, tickUpper → отобразите диапазон
    • liquidity, tokensOwedA/B → вычислите стоимость позиции + ожидающие комиссии
    • rewardInfos → ожидающие вознаграждения за поток
  2. Для позиций-NFT, выпущенных под Token-2022 (OpenPositionWithToken22Nft), программа минта NFT — это Token-2022, а не SPL Token. Перечисляйте обе при сканировании.

Ставки в фермах

Farm v3 / v5 / v6 каждая имеет PDA реестра для каждого пользователя. Выводы:
Для кошельков, предпочитающих полностью on-chain обнаружение: перебирайте возможные PDA UserLedger, хешируя пользователя с курируемым списком «вероятных» ID ферм. Перечисление всех ID ферм исчерпывающе непрактично (существуют тысячи); используйте API.

Вычисление стоимости позиции

CPMM / AMM v4 LP

Три модуля не имеют одинаковой сигнатуры: liquidity.getPoolInfoFromRpc принимает { poolId }, а cpmm.getPoolInfoFromRpc и clmm.getPoolInfoFromRpc принимают позиционную строку base58.
Затем умножьте каждый на USD-цену минта (из raydium.token или ценового оракула).

CLMM позиция

Отобразите как:
  • Стоимость ликвидности (текущая цена)
  • Невзятые комиссии
  • Ожидающие вознаграждения за каждый поток
  • Диапазон: [tickLower_price, tickUpper_price] с визуальной полосой, показывающей, находится ли текущая цена в диапазоне

Ставка в ферме

Для on-chain вычисления отразите учёт фермы:
Убедитесь, что вы обновили reward_per_share_x64 с помощью формулы ленивого обновления перед вычислением (прошедшее время × скорость эмиссии ÷ total_staked).

Симуляция транзакции для предпросмотра

Перед подписанием пользователем кошельки обычно показывают предпросмотр изменений баланса. Используйте simulateTransaction:
Параметр accounts просит валидатор вернуть состояние аккаунта после симуляции для указанных адресов. Намного точнее, чем попытка предсказать изменение баланса только по форме инструкции.

Подводные камни симуляции

  • CLMM свопы требуют валидные tick-массивы. Если размер ввода пользователя пересекает неинициализированный tick-массив, симуляция откатывается (как и выполнение). Ясно отобразите это в интерфейсе.
  • Приоритетная комиссия. Симуляция выполняется без применённых инструкций compute-budget. Для большой транзакции, которая превысит стандартные 200k CU, симуляция не удаётся, но фактическое выполнение с явным лимитом CU успешно. Всегда устанавливайте лимит CU и на симулируемую транзакцию.
  • Свежий блокхеш. Симуляция использует текущий блокхеш; если подписание занимает >60s, транзакция становится недействительной. Пересимулируйте, если пользователь колеблется.

Отображение Token-2022

Токены под программой Token-2022 должны быть помечены как таковые в списке токенов кошелька, так как они имеют разные поверхности риска:
  • Минты с комиссией передачи: отобразите текущий transferFeeBasisPoints как «Комиссия передачи: X%» рядом с балансом. Предупредите при получении — пользователи могут не понять, что получат меньше, чем отправитель отправил.
  • Минты с хуком передачи: отобразите ID программы хука. Вредоносный хук может заблокировать исходящие передачи; пользователи должны проверить, что хук — это тот, который они ожидают.
  • Непередаваемые минты: отобразите «Непередаваемо» и отключите swap/send. Это обычно soulbound-токены или учётные данные.
  • Минты с начислением процентов: баланс UI, полученный из TokenAccount.amount, не отражает начисленные проценты. Используйте amountToUiAmount из @solana/spl-token (который применяет коэффициент масштабирования) для отображаемого значения.

Отображение APR фермы

APR, отображаемый пользователям, должен объединять все активные потоки вознаграждений, преобразованные в USD и годовые:
Отобразите как APR: X.Y%. Если минт ставки — это LP-токен, также вычислите базовый APR комиссии базового LP и обозначьте сумму как «Total APR» или «APR + fees».

Ссылки

Источники:
  • Raydium SDK v2 — помощники позиций/ферм.
  • Эндпоинты позиций пользователя на api-v3.raydium.io.