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 rebalansujących 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ą obsługę. 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 wartość * mnożnik) dla ceny tokena, salda tokena i ilości tokenów, gdy tylko jest to możliwe
- dApps i dostawcy usług powinni używać surowych wartości i nieskalowanych cen do wszystkich obliczeń i konwertować je dla użytkowników na końcu
- Należy zapewnić historyczne dane cenowe zarówno dla wartości skalowanych, jak i nieskalowanych, aby ułatwić integrację
- Historyczne wartości mnożnika muszą być dostępne, aby zapewnić dokładne dane historyczne
Definicje terminów
- Mnożnik: statyczny, aktualizowalny mnożnik używany do obliczeń UI Amount
- UIAmount: mnożnik * surowa wartość (znane również jako: wartość skalowana)
- Surowa wartość: wartość (znane również jako: wartość nieskalowana)
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 wartoś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 informacje o saldzie użytkownika, możesz pobrać zaktualizowane dane o powyższych kwotach, wywołując funkcje getTokenAccountBalance lub getAccountInfo.
- Jeśli potrzebujesz znać kwotę UI Amount 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)
$ 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- Zwraca informacje o koncie oraz informacje o monecie (mint info)
$ 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}
Aktualizacja bieżącej kwoty
Ponieważ emitenci mogą aktualizować mnożnik w dowolnym momencie, warto rozważyć okresowe odpytywanie w celu utrzymania aktualności 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ągleniami, zaokrąglaj w dół i preferuj pozostawienie niewielkiej ilości „kurzu” zamiast ryzykować niepowodzenie transakcji.
- Do 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” dla 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, jeśli to możliwe.
- Jeśli jesteś dostawcą usług feedu cenowego, takim jak wyrocznia, powinieneś
udostępniać zarówno przeskalowaną, jak i nieprzeskalowaną cenę.
- W miarę możliwości 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 w trakcie 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 zachęci to 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 zrebasowanych sald tokenów | Pokazuj przeskalowane 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 za pomocą 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ć przeskalowaną cenę użytkownikom końcowym. | P1 |
| Wyświetlanie wykresu historii cen | Odzwierciedlaj przeskalowane ceny na wykresie cen. | P1 |
CEXy
| Wymaganie | Opis | Priorytet |
|---|---|---|
| Śledzenie aktualizacji mnożnika | Śledź aktualizacje mnożnika dla tokenów, które używają rozszerzenia przeskalowanej ilości UiAmount. | P0 |
| Wyświetlanie zrebasowanych sald tokenów | Pokazuj przeskalowane 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 za pomocą swoich sald UiAmount (mnożnik * surowa wartość). | P0 |
| Historyczne akcje nie powinny być przeskalowane | Historyczne akcje, takie jak transakcje, powinny być wyświetlane z dokładnymi przeskalowanymi wartościami i cenami w momencie akcji. | P1 |
| Wewnętrzne śledzenie surowych sald | Śledź surowe salda dla transakcji on-chain zamiast przeskalowanych sald. Będzie to dokładniejsze i łatwiejsze do zarządzania w dłuższej perspektywie. | P1 |
| 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ć przeskalowaną cenę użytkownikom końcowym. | P1 |
| Wyświetlanie wykresu historii cen | Odzwierciedlaj przeskalowane ceny na wykresie cen. Obejmuje to przeskalowanie historycznych cen do bieżącego mnożnika. | P1 |
| Skalowanie kosztu bazowego | Koszt na akcję powinien być przeskalowany do bieżącego mnożnika. | P1 |
Is this page helpful?