Przewodnik integracji funkcji Scaled UI Amount
Obsługa rozszerzenia Scaled UI Amount na platformie Solana
Tło
Rozszerzenie Scaled UI Amount pozwala emitentom tokenów określić mnożnik, który jest używany przy obliczaniu ilości tokenów użytkownika wyświetlanej w interfejsie użytkownika. Umożliwia to emitentom tworzenie tokenów z mechanizmem rebasingu oraz realizację takich funkcji jak podziały akcji. To rozszerzenie, podobnie jak rozszerzenie tokenów oprocentowanych, zapewnia wyłącznie kosmetyczną ilość w interfejsie użytkownika, co oznacza, że zespoły muszą wykonać dodatkową pracę, aby zapewnić dobrą jakość doświadczenia użytkownika. Wszystkie obliczenia i transfery odbywają się przy użyciu surowych wartości w programie.
Zasoby:
TL;DR
- Użytkownicy końcowi powinni korzystać z UIAmount (surowa ilość * mnożnik) dla ceny tokena, salda tokena i ilości tokenów, gdy tylko jest to możliwe
- dAppy i dostawcy usług powinni używać surowej ilości i nieskalowanych cen do wszystkich obliczeń i konwertować je dla użytkowników na końcu
- Historyczne dane cenowe muszą być dostępne zarówno dla skalowanych, jak i nieskalowanych ilości, aby ułatwić integrację
- Historyczne wartości mnożnika muszą być dostępne dla dokładnych danych historycznych
Definicje terminów
- Mnożnik: statyczny, aktualizowalny mnożnik używany do obliczeń UI Amount
- UIAmount: mnożnik * surowa ilość (znane również jako: skalowana ilość)
- Surowa ilość: ilość (znane również jako: nieskalowana ilość)
Aktualne saldo
Aktualna ilość do wyświetlenia
- Za każdym razem, gdy wyświetlasz ilości tokenów korzystających z rozszerzenia
scaled UI amount użytkownikom końcowym, powinieneś używać jednej z poniższych
metod:
- UIAmount/UIAmountString (zalecane)
- Ręczne obliczenie surowej ilości * mnożnik
- Zalecamy obcinanie tej wartości w oparciu o liczbę miejsc dziesiętnych,
które posiada token.
- Przykład: jeśli yUSD ma 6 miejsc dziesiętnych, a użytkownik ma UIAmount równy 1.123456789, powinieneś wyświetlić „1.123456”
Skąd wziąć te dane:
- Aby uzyskać aktualne saldo użytkownika, możesz pobrać zaktualizowane informacje o powyższych kwotach, wywołując funkcje getTokenAccountBalance lub getAccountInfo.
- Jeśli potrzebujesz znać kwotę UI dla dowolnej kwoty, możesz uzyskać to
obliczenie, wywołując funkcję
amountToUiAmountForMintWithoutSimulation
(web3.js v1) lub symulując transakcję za pomocą amountToUiAmount.- Uwaga: amountToUiAmount wymaga symulacji transakcji, co oznacza, że potrzebuje również ważnego płatnika opłat z saldem. Z tego powodu nie powinno to być domyślnym sposobem uzyskiwania salda.
Wywołania RPC
getTokenAccountBalance
- Zwraca saldo konta tokena oraz informacje o monecie (mint info)
import { address, createSolanaRpc } from "@solana/kit";const rpc_url = "https://api.devnet.solana.com";const rpc = createSolanaRpc(rpc_url);let tokenAddress = address("2uuvxpnEKw52aTqNerHiQ3WeSqZriCMNVt8LhWfrkbPk");let tokenBalance = await rpc.getTokenAccountBalance(tokenAddress).send();console.log("Token Balance:", tokenBalance);/* Token Balance: {context: { apiVersion: '2.2.14', slot: 381132711n },value: {amount: '10000000',decimals: 6,uiAmount: 20,uiAmountString: '20'}} */
getAccountInfo
- Zwraca informacje o koncie oraz informacje o monecie (mint info)
import { address, createSolanaRpc } from "@solana/kit";const rpc_url = "https://api.devnet.solana.com";const rpc = createSolanaRpc(rpc_url);const publicKey = address("2uuvxpnEKw52aTqNerHiQ3WeSqZriCMNVt8LhWfrkbPk");const accountInfo = await rpc.getAccountInfo(publicKey).send();console.log("Account Info:",JSON.stringify(accountInfo,(key, value) => (typeof value === "bigint" ? value.toString() : value),2));/* Account Info: {"context": {"apiVersion": "2.2.14","slot": "381133640"},"value": {"data": {"parsed": {"info": {"extensions": [{"extension": "immutableOwner"},{"extension": "pausableAccount"}],"isNative": false,"mint": "BZCd6HfTbb5ZYJ8hQsm8282tG4QzLyeqFR6tdgQA9EAG","owner": "G7ARQSUCwNrfvTDUCZvM5xdiRdBJiN3qVw2PryD8Wnib","state": "initialized","tokenAmount": {"amount": "10000000","decimals": 6,"uiAmount": 20,"uiAmountString": "20"}},"type": "account"},"program": "spl-token-2022","space": "174"},"executable": false,"lamports": "2101920","owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","rentEpoch": "18446744073709551615","space": "174"}} */
Aktualizacja bieżącej kwoty
Ponieważ emitenci mogą aktualizować mnożnik w dowolnym momencie, warto rozważyć okresowe odpytywanie w celu utrzymania aktualnego salda konta. Emitenci prawdopodobnie nie będą aktualizować tego mnożnika częściej niż raz dziennie. Jeśli mnożnik jest ustawiony na przyszłą datę, możesz automatycznie odpytywać w czasie tej aktualizacji.
Kwoty tokenów w transakcjach (przelewy / wymiany itp.)
- Użytkownicy powinni wprowadzać kwoty interpretowane jako skalowane „UIAmount”.
Aplikacja, która musi to przetworzyć, powinna przekonwertować na surową kwotę
tokena dla transakcji.
- W przypadku problemów z zaokrąglaniem, zaokrąglaj w dół i preferuj pozostawienie niewielkiej ilości „kurzu” zamiast ryzykować niepowodzenie transakcji.
- Aby dokonać tej konwersji, możesz użyć funkcji
uiAmountToAmountForMintWithoutSimulation
(web3.js v1) lub symulować transakcję za pomocą 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 */
- Aplikacje powinny używać całkowitej surowej kwoty, gdy użytkownik wybiera
opcję „max” lub „all” swojego salda. Zapewnia to, że nie pozostaną żadne
resztki.
- Opcjonalnie: Możesz rozważyć automatyczne zamknięcie konta, gdy używana jest opcja „max”, aby zwrócić użytkownikowi depozyt za przechowywanie.
Cena tokena
- Cena tokena powinna być zawsze wyświetlana jako przeskalowana cena, gdzie to możliwe.
- Jeśli jesteś dostawcą usług feedu cenowego, takim jak oracle, powinieneś
udostępniać zarówno przeskalowaną, jak i nieprzeskalowaną cenę.
- Gdzie to możliwe, zapewnij SDK/API, które abstrahuje złożoności związane z rozszerzeniem przeskalowanej kwoty w interfejsie użytkownika.
Aktualny mnożnik
- Aktualny mnożnik można odczytać z token mint w dowolnym momencie, wywołując
getAccountInfo
. Dodatkowo, jeśli ustawiony jest przyszły mnożnik, ta informacja jest również dostępna z token mint. Zalecamy nie wyświetlać tego mnożnika, ponieważ może to wprowadzać zamieszanie w 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*/
Dane historyczne
Dane historyczne dla feedu cenowego
- Usługi dostarczające dane historyczne powinny przechowywać i udostępniać zarówno przeskalowane, jak i nieprzeskalowane ceny dla rozszerzenia przeskalowanej kwoty w interfejsie użytkownika.
- Oczekujemy, że przeskalowane kwoty będą używane najczęściej, ponieważ jest to zgodne z tym, jak tradycyjny świat finansów traktuje wykresy związane z tokenami z podziałami akcji.
Dane historyczne dla kwot
- Jeśli chcesz pokazać saldo przeniesione w przeszłości, musisz mieć dostęp do mnożnika w danym slocie. Możesz również zapisać UiAmount dla transferów podczas przetwarzania transakcji, aby uniknąć wykonywania tego obliczenia w przyszłości.
Wsteczna kompatybilność
- Domyślnie portfele i aplikacje, które nie obsługują rozszerzenia skalowanej kwoty interfejsu użytkownika (UI), pokażą poprawną całkowitą cenę aktywności, mnożąc nieskalowaną cenę * surową kwotę.
- Jednakże wyświetlą nieskalowaną cenę, co może powodować pewne zamieszanie wśród użytkowników.
- Mamy nadzieję, że to zachęci zespoły do aktualizacji swoich dApps, aby były kompatybilne z tokenami korzystającymi z rozszerzenia skalowanej kwoty UI, i chętnie zapewnimy wsparcie w tym procesie.
Zalecane priorytety integracji według platformy
Ogólne wymagania
Wymaganie | Opis | Priorytet |
---|---|---|
Obsługa działań użytkownika z UiAmount | Wszystkie działania użytkownika powinny być wprowadzane w UiAmount, gdy UiAmount jest włączony w całej aplikacji. Jeśli UiAmount nie jest widoczny w aplikacji, należy używać surowych kwot, dopóki aplikacja nie zostanie zaktualizowana. | P0 |
Portfele
Wymaganie | Opis | Priorytet |
---|---|---|
Wyświetlanie skalowanego salda | Pokaż skalowaną kwotę (uiAmount) jako główne saldo. | P0 |
Obsługa transferów tokenów | Użytkownicy końcowi powinni wprowadzać kwoty transferów przy użyciu swoich skalowanych sald (surowa kwota * saldo). | P0 |
Wyświetlanie ceny spot | Wyświetl skalowaną cenę spot dla użytkowników | P0 |
Metadane historii transakcji | Pokaż skalowaną kwotę (UIAmount) dla każdego transferu, gdzie to możliwe. | P1 |
Pokazywanie aktualizacji mnożnika w historii transakcji | Gdy występują aktualizacje mnożnika, pokaż to jako zdarzenie w historii transakcji użytkownika, w tym uzyskaną kwotę | P2 |
Wyświetlanie wykresu historii cen | Odzwierciedlaj skalowane ceny na wykresie cen | P1 |
Wprowadzenie/Podpowiedzi | Oferuj podpowiedzi lub wprowadzenie, aby edukować użytkowników na temat tokenów korzystających z rozszerzenia skalowanej kwoty UI | P2 |
Eksploratory
Wymaganie | Opis | Priorytet |
---|---|---|
Ulepszenia strony szczegółów tokena | Wyświetlanie metadanych, takich jak całkowita skalowana kapitalizacja rynkowa i aktualny mnożnik | P0 |
Wyświetlanie skalowanego salda dla sald | Wyświetlanie skalowanych sald (UiAmount) dla bieżących sald. | P0 |
Wyświetlanie skalowanego salda dla transakcji | Wyświetlanie skalowanych sald (UiAmount) dla kwot transferów w historycznych transakcjach. | P0 |
Wyświetlanie skalowanej ceny dla transakcji | Wyświetlanie skalowanych cen dla wcześniejszych transakcji | P1 |
Poprawne parsowanie i wyświetlanie transakcji aktualizacji mnożnika | Poprawne wyświetlanie szczegółów dotyczących aktualizacji mnożnika | P2 |
Agregatory danych rynkowych (np. CoinGecko)
Wymaganie | Opis | Priorytet |
---|---|---|
Aktualizacje API dla danych skalowanych | Rozszerzenie funkcjonalności API o zmiany mnożnika w czasie oraz skalowany kanał cenowy. | P0 |
Całkowita podaż z uwzględnieniem skalowania | Przy wyświetlaniu całkowitej podaży i całkowitej kapitalizacji rynkowej uwzględnij skalowane salda | P0 |
Śledzenie historycznych cen | Udostępnienie wykresu historycznego cen z wykorzystaniem skalowanych cen w czasie. | P1 |
Śledzenie historycznych mnożników | Udostępnienie historycznych znaczników aktualizacji mnożnika dla tokenów oprocentowanych. | P2 |
Treści edukacyjne lub wyjaśnienia | Dodanie krótkich opisów lub podpowiedzi wyjaśniających, jak działają skalowane tokeny. | P2 |
Dostawcy kanałów cenowych
Wymaganie | Opis | Priorytet |
---|---|---|
Skalowane i nieskalowane kanały cenowe | Udostępnienie kanałów cenowych zarówno dla cen skalowanych, jak i nieskalowanych. | P0 |
Historyczne dane mnożnika | Udostępnienie API z historycznymi zmianami mnożnika. | P0 |
Historyczne dane cenowe | Udostępnienie API z historycznymi cenami opartymi na kwotach skalowanych i nieskalowanych. | P0 |
DEXy
Wymaganie | Opis | Priorytet |
---|---|---|
Wyświetlanie zrebalansowanych sald tokenów | Wyświetl skalowane salda dla handlu lub dostarczania płynności w interfejsie użytkownika (backend może nadal używać surowych wartości). | P0 |
Obsługa akcji tokenów | Użytkownicy końcowi powinni wprowadzać kwoty akcji przy użyciu swoich sald UiAmount (mnożnik * surowa wartość). | P0 |
Adaptacja źródła cen | Wszędzie tam, gdzie źródło cen jest używane do wyświetlania bieżącej ceny, należy dostarczyć użytkownikom końcowym skalowaną cenę. | P1 |
Wyświetlanie wykresu historii cen | Odzwierciedl skalowane ceny na wykresie cen. | P1 |
Is this page helpful?