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 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.
web3js-uiAmountToAmountForMintWithoutSimulation.ts
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

WymaganieOpisPriorytet
Obsługa działań użytkownika z UiAmountWszystkie 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

WymaganieOpisPriorytet
Wyświetlanie skalowanego saldaPokaż skalowaną kwotę (uiAmount) jako główne saldo.P0
Obsługa transferów tokenówUżytkownicy końcowi powinni wprowadzać kwoty transferów przy użyciu swoich skalowanych sald (surowa kwota * saldo).P0
Wyświetlanie ceny spotWyświetl skalowaną cenę spot dla użytkownikówP0
Metadane historii transakcjiPokaż skalowaną kwotę (UIAmount) dla każdego transferu, gdzie to możliwe.P1
Pokazywanie aktualizacji mnożnika w historii transakcjiGdy występują aktualizacje mnożnika, pokaż to jako zdarzenie w historii transakcji użytkownika, w tym uzyskaną kwotęP2
Wyświetlanie wykresu historii cenOdzwierciedlaj skalowane ceny na wykresie cenP1
Wprowadzenie/PodpowiedziOferuj podpowiedzi lub wprowadzenie, aby edukować użytkowników na temat tokenów korzystających z rozszerzenia skalowanej kwoty UIP2

Eksploratory

WymaganieOpisPriorytet
Ulepszenia strony szczegółów tokenaWyświetlanie metadanych, takich jak całkowita skalowana kapitalizacja rynkowa i aktualny mnożnikP0
Wyświetlanie skalowanego salda dla saldWyświetlanie skalowanych sald (UiAmount) dla bieżących sald.P0
Wyświetlanie skalowanego salda dla transakcjiWyświetlanie skalowanych sald (UiAmount) dla kwot transferów w historycznych transakcjach.P0
Wyświetlanie skalowanej ceny dla transakcjiWyświetlanie skalowanych cen dla wcześniejszych transakcjiP1
Poprawne parsowanie i wyświetlanie transakcji aktualizacji mnożnikaPoprawne wyświetlanie szczegółów dotyczących aktualizacji mnożnikaP2

Agregatory danych rynkowych (np. CoinGecko)

WymaganieOpisPriorytet
Aktualizacje API dla danych skalowanychRozszerzenie funkcjonalności API o zmiany mnożnika w czasie oraz skalowany kanał cenowy.P0
Całkowita podaż z uwzględnieniem skalowaniaPrzy wyświetlaniu całkowitej podaży i całkowitej kapitalizacji rynkowej uwzględnij skalowane saldaP0
Śledzenie historycznych cenUdostępnienie wykresu historycznego cen z wykorzystaniem skalowanych cen w czasie.P1
Śledzenie historycznych mnożnikówUdostępnienie historycznych znaczników aktualizacji mnożnika dla tokenów oprocentowanych.P2
Treści edukacyjne lub wyjaśnieniaDodanie krótkich opisów lub podpowiedzi wyjaśniających, jak działają skalowane tokeny.P2

Dostawcy kanałów cenowych

WymaganieOpisPriorytet
Skalowane i nieskalowane kanały cenoweUdostępnienie kanałów cenowych zarówno dla cen skalowanych, jak i nieskalowanych.P0
Historyczne dane mnożnikaUdostępnienie API z historycznymi zmianami mnożnika.P0
Historyczne dane cenoweUdostępnienie API z historycznymi cenami opartymi na kwotach skalowanych i nieskalowanych.P0

DEXy

WymaganieOpisPriorytet
Wyświetlanie zrebasowanych sald tokenówPokazuj 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ówUżytkownicy końcowi powinni wprowadzać kwoty akcji za pomocą swoich sald UiAmount (mnożnik * surowa wartość).P0
Adaptacja źródła cenWszę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 cenOdzwierciedlaj przeskalowane ceny na wykresie cen.P1

CEXy

WymaganieOpisPriorytet
Ś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ówPokazuj 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ówUżytkownicy końcowi powinni wprowadzać kwoty akcji za pomocą swoich sald UiAmount (mnożnik * surowa wartość).P0
Historyczne akcje nie powinny być przeskalowaneHistoryczne 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 cenWszę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 cenOdzwierciedlaj przeskalowane ceny na wykresie cen. Obejmuje to przeskalowanie historycznych cen do bieżącego mnożnika.P1
Skalowanie kosztu bazowegoKoszt na akcję powinien być przeskalowany do bieżącego mnożnika.P1

Is this page helpful?