Посібник з інтеграції масштабованої UI-суми
Підтримка розширення Scaled UI Amount на Solana
Передумови
Розширення Scaled UI Amount дозволяє емітентам токенів вказувати множник, який буде використовуватися при обчисленні UI-суми балансу токенів користувача. Це дає змогу емітентам створювати токени з ребазингом та уможливлювати такі речі, як дроблення акцій. Це розширення, як і розширення токенів з нарахуванням відсотків, надає суто косметичну UI-суму, що означає, що командам потрібно виконати додаткову роботу для забезпечення хорошого досвіду користувачів. Базові обчислення та перекази відбуваються з використанням необроблених сум у програмі.
Ресурси:
Коротко
- Кінцеві користувачі повинні взаємодіяти з UIAmount (необроблена сума * множник) для ціни токена, балансу токена та сум токенів, коли це можливо
- dApps та постачальники послуг повинні використовувати необроблену суму та немасштабовані ціни для всіх обчислень і конвертувати для користувачів на кінцевому етапі
- Історичні цінові фіди повинні надаватися як для масштабованих, так і для немасштабованих сум для полегшення інтеграції
- Історичні значення множника повинні бути доступними для точних історичних даних
Визначення термінів
- Множник: статичний оновлюваний множник, який використовується для обчислень UI-суми
- UIAmount: множник * необроблена сума (також відома як: масштабована сума)
- Raw Amount: сума (також відома як: немасштабована сума)
Поточний баланс
Поточна сума для відображення
- Щоразу, коли ви відображаєте суми для токенів, які використовують розширення
масштабованої UI-суми для кінцевих користувачів, вам слід використовувати:
- UIAmount/UIAmountString (рекомендовано)
- Ручне обчислення необробленої суми * множник
- Ми рекомендуємо обрізати це значення на основі кількості десяткових знаків,
які має токен.
- Наприклад: якщо yUSD має 6 десяткових знаків і користувач має UIAmount 1.123456789, вам слід відображати "1.123456"
Де отримати ці дані:
- Для перегляду актуального балансу користувача ви можете отримати оновлену інформацію про вищезазначені суми викликавши getTokenAccountBalance або getAccountInfo
- Якщо вам потрібно дізнатися UI Amount для довільної суми, ви можете отримати
цей розрахунок, викликавши функцію
amountToUiAmountForMintWithoutSimulation
(web3.js v1) або симулюючи транзакцію за допомогою amountToUiAmount.- Примітка: amountToUiAmount потребує симуляції транзакції, що означає, що також потрібен дійсний платник комісії з балансом. Через це, це не повинен бути стандартний спосіб отримання балансу.
RPC виклики
getTokenAccountBalance
- Повертає баланс token account та інформацію про mint
$ curl http://localhost:8899 -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "id": 1, "method": "getTokenAccountBalance", "params": ["2uuvxpnEKw52aTqNerHiQ3WeSqZriCMNVt8LhWfrkbPk"]}' | jq .{"jsonrpc": "2.0","result": {"context": {"apiVersion": "2.2.14","slot": 381130751},"value": {"amount": "10000000","decimals": 6,"uiAmount": 20.0,"uiAmountString": "20"}},"id": 1}
getAccountInfo
- Повертає інформацію про акаунт та інформацію про mint
$ curl http://localhost:8899 -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "id": 1, "method": "getAccountInfo", "params": ["2uuvxpnEKw52aTqNerHiQ3WeSqZriCMNVt8LhWfrkbPk", {"encoding": "jsonParsed"}]}' | jq .{"jsonrpc": "2.0","result": {"context": {"apiVersion": "2.2.14","slot": 381131001},"value": {"data": {"parsed": {"info": {"extensions": [{"extension": "immutableOwner"},{"extension": "pausableAccount"}],"isNative": false,"mint": "BZCd6HfTbb5ZYJ8hQsm8282tG4QzLyeqFR6tdgQA9EAG","owner": "G7ARQSUCwNrfvTDUCZvM5xdiRdBJiN3qVw2PryD8Wnib","state": "initialized","tokenAmount": {"amount": "10000000","decimals": 6,"uiAmount": 20.0,"uiAmountString": "20"}},"type": "account"},"program": "spl-token-2022","space": 174},"executable": false,"lamports": 2101920,"owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","rentEpoch": 18446744073709551615,"space": 174}},"id": 1}
Оновлення поточної суми
Оскільки емітенти можуть оновлювати множник у будь-який час, ви можете розглянути можливість періодичного опитування для підтримки актуальності балансу рахунку. Емітенти навряд чи оновлюватимуть цей множник частіше, ніж раз на день. Якщо множник встановлено на майбутню дату, ви можете автоматично опитувати систему в цей час оновлення
Суми токенів у транзакціях (перекази / обміни тощо)
- Користувачі повинні вводити суми, які інтерпретуються як масштабований
"UIAmount". Додаток, який має обробляти це, повинен конвертувати в необроблену
суму токенів для транзакції.
- Якщо виникають проблеми з округленням, округліть вниз і краще залиште невелику кількість пилу, ніж ризикуйте невдачею транзакції
- Для цього перетворення ви можете використовувати функцію
uiAmountToAmountForMintWithoutSimulation
(web3.js v1) або симулювати транзакцію за допомогою amountToUiAmount.
import { uiAmountToAmountForMintWithoutSimulation } from "@solana/web3.js";import { Connection, PublicKey, clusterApiUrl } from "@solana/web3.js";const connection = new Connection(clusterApiUrl("devnet"), "confirmed");const mint = new PublicKey("BZCd6HfTbb5ZYJ8hQsm8282tG4QzLyeqFR6tdgQA9EAG");const uiAmount = "20.2";const rawAmount = await uiAmountToAmountForMintWithoutSimulation(connection as unknown as Connection,mint,uiAmount);console.log("Raw Amount:", rawAmount);/* Raw Amount: 20200000 */
- Додатки повинні використовувати загальну необроблену суму, коли користувач
запитує виконати дію з "максимальним" або "всім" своїм балансом. Це гарантує,
що не залишиться пилу.
- Опціонально: Ви можете розглянути можливість автоматичного закриття рахунку, коли використовується "максимум", щоб повернути користувачу його депозит за зберігання
Ціна токена
- Ціна токена завжди повинна відображатися як масштабована ціна, де це можливо.
- Якщо ви є постачальником сервісу цінових потоків, наприклад оракулом, ви
повинні надавати як масштабовану, так і немасштабовану ціну.
- Де можливо, надавайте SDK/API, який абстрагує складності розширення масштабованої UI суми.
Поточний множник
- Поточний множник можна зчитати з монетного двору токена в будь-який час,
викликавши
getAccountInfo
. Крім того, якщо встановлено майбутній множник, ця інформація також доступна з монетного двору токена. Ми рекомендуємо не показувати цей множник, оскільки він може заплутати UX.
import { address, createSolanaRpc } from "@solana/kit";const rpc_url = "https://api.devnet.solana.com";const rpc = createSolanaRpc(rpc_url);const publicKey = address("BZCd6HfTbb5ZYJ8hQsm8282tG4QzLyeqFR6tdgQA9EAG");const accountInfo = await rpc.getAccountInfo(publicKey, { encoding: "jsonParsed" }).send();const mintData = accountInfo.value?.data as Readonly<{parsed: {info?: {extensions: {extension: string;state: object;}[];};type: string;};program: string;space: bigint;}>;const scaledUiAmountConfig = mintData.parsed.info?.extensions?.find((extension) => extension.extension === "scaledUiAmountConfig") as Readonly<{state: {newMultiplierEffectiveTimestamp: number;newMultiplier: number;multiplier: number;};}>;const currentMultiplier =scaledUiAmountConfig?.state &&Date.now() / 1000 >=scaledUiAmountConfig.state.newMultiplierEffectiveTimestamp? scaledUiAmountConfig.state.newMultiplier: scaledUiAmountConfig.state.multiplier;console.log("Scaled UI Amount Config:", scaledUiAmountConfig);console.log("Current Multiplier:", currentMultiplier);/*Scaled UI Amount Config: {extension: 'scaledUiAmountConfig',state: {authority: 'G7ARQSUCwNrfvTDUCZvM5xdiRdBJiN3qVw2PryD8Wnib',multiplier: '2',newMultiplier: '2',newMultiplierEffectiveTimestamp: 1743000000n}}Current Multiplier: 2*/
Історичні дані
Історичні дані для цінового потоку
- Сервіси, які надають історичні дані, повинні зберігати та показувати як масштабовані, так і немасштабовані ціни для розширення масштабованої UI суми.
- Ми очікуємо, що масштабовані суми будуть використовуватися найчастіше, оскільки це відповідає тому, як традиційний фінансовий світ обробляє графіки, пов'язані з токенами зі спліт-акціями.
Історичні дані для сум
- Якщо ви хочете показати баланс, переданий у минулому, вам потрібен доступ до множника на той конкретний slot. Ви також можете зберігати UiAmount для переказів під час обробки транзакцій, щоб уникнути цього розрахунку в майбутньому.
Зворотна сумісність
- За замовчуванням гаманці та програми, які не розуміють розширення масштабованої UI суми, показуватимуть правильну загальну ціну активності шляхом множення немасштабованої ціни * на необроблену кількість.
- Однак вони відображатимуть немасштабовану ціну, що може спричинити деяку плутанину для користувачів.
- Ми сподіваємося, що це заохотить команди оновити свої децентралізовані додатки для сумісності з токенами, які використовують розширення масштабованої UI суми, і ми раді надати підтримку під час цього процесу.
Рекомендовані пріоритети інтеграції за платформами
Загальні вимоги
Вимога | Опис | Пріоритет |
---|---|---|
Підтримка дій користувача з UiAmount | Усі дії користувача повинні вводитися в UiAmount, коли UiAmount увімкнено в усьому додатку. Якщо UiAmount не відображається в додатку, слід використовувати необроблені суми, доки додаток не буде оновлено. | P0 |
Гаманці
Вимога | Опис | Пріоритет |
---|---|---|
Відображення масштабованого балансу | Показувати масштабовану суму (uiAmount) як основний баланс. | P0 |
Підтримка переказів токенів | Кінцеві користувачі повинні вводити суми переказів з їхніми масштабованими балансами (необроблена сума * баланс). | P0 |
Відображення спотової ціни | Відображати масштабовану спотову ціну для користувачів | P0 |
Метадані історії транзакцій | Показувати масштабовану суму (UIAmount) для кожного переказу, де це можливо. | P1 |
Показ оновлень множника в історії транзакцій | Коли відбуваються оновлення множника, показувати це як подію в історії транзакцій користувача, включаючи отриману суму | P2 |
Відображення графіка історії цін | Відображати масштабовані ціни на графіку цін | P1 |
Онбординг/Підказки | Пропонувати підказки або онбординг для інформування користувачів про токени, які використовують розширення масштабованої ui суми | P2 |
Провідники
Вимога | Опис | Пріоритет |
---|---|---|
Покращення сторінки деталей токена | Відображення метаданих, таких як загальна масштабована ринкова капіталізація та поточний множник | P0 |
Відображення масштабованого балансу для балансів | Відображення масштабованих балансів (UiAmount) для поточних балансів. | P0 |
Відображення масштабованого балансу для транзакцій | Відображення масштабованих балансів (UiAmount) для сум переказів для історичних транзакцій. | P0 |
Відображення масштабованої ціни для транзакцій | Відображення масштабованих цін для попередніх транзакцій | P1 |
Правильний аналіз та відображення транзакцій оновлення множника | Правильно показувати деталі про оновлення множника | P2 |
Агрегатори ринкових даних (наприклад, CoinGecko)
Вимога | Опис | Пріоритет |
---|---|---|
Оновлення API для масштабованих даних | Розширення функціональності API для включення змін множника з часом, а також масштабованого потоку цін. | P0 |
Загальна пропозиція з масштабованим коригуванням | При відображенні загальної пропозиції та загальної ринкової капіталізації враховувати масштабовані баланси | P0 |
Відстеження історичних цін | Надання історичної діаграми цін з використанням масштабованої ціни з часом. | P1 |
Відстеження історичних множників | Надання історичних маркерів оновлень множника для токенів, що приносять відсотки. | P2 |
Освітній контент або пояснення | Включення коротких описів або підказок, що пояснюють, як працюють масштабовані токени. | P2 |
Постачальники потоків цін
Вимога | Опис | Пріоритет |
---|---|---|
Масштабовані та немасштабовані потоки цін | Надання потоків цін як для масштабованих, так і для немасштабованих цін. | P0 |
Дані про історичні множники | Пропонування API з історичними змінами множника. | P0 |
Дані про історичні ціни | Пропонування API з історичними цінами на основі як масштабованих, так і немасштабованих сум. | P0 |
DEX-и
Вимога | Опис | Пріоритет |
---|---|---|
Відображення ребазованих балансів токенів | Показувати масштабовані баланси для торгівлі або надання ліквідності в інтерфейсі. (бекенд може продовжувати використовувати необроблені суми) | P0 |
Підтримка дій з токенами | Кінцеві користувачі повинні вводити суми дій зі своїми балансами UiAmount (множник * необроблена сума). | P0 |
Адаптація цінових фідів | Будь-де, де використовується ціновий фід для відображення поточної ціни, надавати масштабовану ціну кінцевим користувачам. | P1 |
Відображення графіка історії цін | Відображати масштабовані ціни на графіку цін | P1 |
CEX-и
Вимога | Опис | Пріоритет |
---|---|---|
Відстеження оновлень множника | Відстежувати оновлення множника для токенів, які використовують розширення масштабованої суми інтерфейсу. | P0 |
Відображення ребазованих балансів токенів | Показувати масштабовані баланси для торгівлі або надання ліквідності в інтерфейсі. (бекенд може продовжувати використовувати необроблені суми) | P0 |
Підтримка дій з токенами | Кінцеві користувачі повинні вводити суми дій зі своїми балансами UiAmount (множник * необроблена сума). | P0 |
Історичні дії не повинні перемасштабовуватися | Історичні дії, такі як торги, повинні відображатися з використанням точної масштабованої суми та ціни на момент дії. | P1 |
Внутрішнє відстеження необроблених балансів | Відстежувати необроблені баланси для онлайн-транзакцій замість масштабованих балансів. Це буде точніше і простіше в управлінні в довгостроковій перспективі. | P1 |
Адаптація цінових фідів | Будь-де, де використовується ціновий фід для відображення поточної ціни, надавати масштабовану ціну кінцевим користувачам. | P1 |
Відображення графіка історії цін | Відображати масштабовані ціни на графіку цін. Це включає перемасштабування історичних цін до поточного множника. | P1 |
Масштабування базової вартості | Вартість за акцію повинна бути масштабована до поточного множника. | P1 |
Is this page helpful?