Skaalatun käyttöliittymäsumman integrointiopas

Scaled UI Amount -laajennuksen tukeminen Solanassa

Tausta

Scaled UI Amount -laajennus mahdollistaa token-liikkeeseenlaskijoille kertoimien määrittämisen, joita käytetään laskettaessa käyttäjän token-saldon käyttöliittymäsummaa. Tämä mahdollistaa liikkeeseenlaskijoille rebasing-tokenien luomisen ja asioiden kuten osakkeiden splittauksen. Tämä laajennus, kuten korkoa tuottava token-laajennus, tarjoaa puhtaasti kosmeettisen käyttöliittymäsumman, mikä tarkoittaa, että tiimien on tehtävä lisätyötä hyvän käyttökokemuksen tarjoamiseksi. Taustalla olevat laskelmat ja siirrot tapahtuvat kaikki käyttäen raakasummia ohjelmassa.

Resurssit:

TL;DR

  • Loppukäyttäjien tulisi käyttää UIAmount-arvoa (raakasumma * kerroin) tokenin hinnalle, tokenin saldolle ja tokenin summille aina kun mahdollista
  • dApp-sovellusten ja palveluntarjoajien tulisi käyttää raakasummaa ja skaalaamattomia hintoja kaikissa laskelmissa ja muuntaa ne käyttäjille vasta lopussa
  • Historialliset hintatiedot on tarjottava sekä skaalattuina että skaalaamattomina summina helpompaa integrointia varten
  • Historiallisten kertoimien arvot on oltava saatavilla tarkkoja historiallisia tietoja varten

Termien määritelmät

  • Kerroin: staattinen päivitettävä kerroin, jota käytetään käyttöliittymäsumman laskelmissa
  • UIAmount: kerroin * raakasumma (eli: skaalattu summa)
  • Raakasumma: summa (eli: skaalaamaton summa)

Nykyinen saldo

Nykyinen summa näyttöä varten

  • Aina kun näytät summia tokeneille, jotka käyttävät skaalattua käyttöliittymäsumma-laajennusta loppukäyttäjille, sinun tulisi käyttää joko:
    • UIAmount/UIAmountString (suositeltu)
    • Manuaalista laskelmaa raakasumma * kerroin
    • Suosittelemme katkaisemaan tämän arvon tokenin desimaalien määrän perusteella.
      • Esim: jos yUSD:llä on 6 desimaalia ja käyttäjällä on UIAmount 1.123456789, sinun tulisi näyttää "1.123456"

Mistä tämä data saadaan:

  • Käyttäjän reaaliaikaisen saldon päivitetyt tiedot yllä mainituista määristä voidaan hakea kutsumalla joko getTokenAccountBalance tai getAccountInfo
  • Jos tarvitset tietää käyttöliittymämäärän (UI Amount) mielivaltaiselle määrälle, voit saada tämän laskelman kutsumalla amountToUiAmountForMintWithoutSimulation (web3.js v1) -funktiota tai simuloimalla transaktiota käyttäen amountToUiAmount-toimintoa.
    • Huomaa: amountToUiAmount vaatii transaktion simulointia, mikä tarkoittaa, että se tarvitsee myös kelvollisen maksajan, jolla on saldo. Tämän vuoksi tätä ei pitäisi käyttää oletustapana saldon hakemiseen.

RPC-kutsut

  • getTokenAccountBalance
    • Palauttaa token accountin saldon ja mint-tiedot
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
    • Palauttaa tilin tiedot ja mint-tiedot
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"
}
} */

Nykyisen määrän päivittäminen

Koska liikkeeseenlaskijat voivat päivittää kerrointa milloin tahansa, voit harkita säännöllistä kyselyä pitääksesi tilin saldon ajan tasalla. Liikkeeseenlaskijat tuskin päivittävät tätä kerrointa useammin kuin kerran päivässä. Jos kerroin on asetettu tulevalle päivämäärälle, voit automaattisesti tehdä kyselyn tänä päivitysajankohtana

Token-määrät transaktioissa (siirrot / vaihdot jne.)

  • Käyttäjien tulisi syöttää määrät, jotka tulkitaan skaalatuksi "UIAmount"-arvoksi. Sovelluksen, joka käsittelee tätä, tulisi muuntaa se raakatokenmääräksi transaktiota varten.
    • Jos pyöristyksessä ilmenee ongelmia, pyöristä alaspäin ja jätä mieluummin pieni määrä pölyä kuin riskeeraa transaktion epäonnistuminen
    • Tämän muunnoksen tekemiseen voit käyttää uiAmountToAmountForMintWithoutSimulation (web3.js v1) -funktiota tai simuloida transaktiota käyttäen amountToUiAmount-toimintoa.
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 */
  • Sovellusten tulisi käyttää kokonaisraakamäärää, kun käyttäjä pyytää toimintoa "maksimi" tai "kaikki" saldostaan. Tämä varmistaa, ettei jäljelle jää pölyä.
    • Valinnainen: Voit harkita tilin automaattista sulkemista, kun "maksimi" käytetään palauttamaan käyttäjälle heidän talletuksensa

Tokenin hinta

  • Tokenin hinta tulisi aina näyttää skaalattuna hintana aina kun mahdollista.
  • Jos olet hintatietopalvelun tarjoaja, kuten oraakkeli, sinun tulisi tarjota sekä skaalattu että skaalaamaton hinta.
    • Tarjoa mahdollisuuksien mukaan SDK/API, joka abstrahoi skaalatun käyttöliittymämäärän laajennuksen monimutkaisuudet pois.

Nykyinen kerroin

  • Nykyinen kerroin voidaan lukea token-mintistä milloin tahansa kutsumalla getAccountInfo. Lisäksi, jos tulevaisuuden kerroin on asetettu, tämä tieto on myös saatavilla token-mintistä. Suosittelemme, ettei tätä kerrointa näytetä, sillä se voi sekoittaa käyttökokemusta.
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
*/

Historialliset tiedot

Historialliset tiedot hintatiedoille

  • Palveluiden, jotka tarjoavat historiallisia tietoja, tulisi tallentaa ja tuoda esiin sekä skaalatut että skaalaamattomat hinnat skaalattua käyttöliittymämäärän laajennusta varten.
  • Odotamme, että skaalattuja määriä käytetään useimmiten, sillä tämä vastaa sitä, miten perinteinen rahoitusmaailma käsittelee tokeneihin liittyviä kaavioita osakkeiden splitin yhteydessä.

Historialliset tiedot määrille

  • Jos haluat näyttää aiemmin siirretyn saldon, tarvitset pääsyn kertoimeen kyseisessä slotissa. Voit myös tallentaa UiAmount-arvon siirroille käsitellessäsi transaktioita välttääksesi tämän laskutoimituksen tulevaisuudessa.

Taaksepäin yhteensopivuus

  • Oletusarvoisesti lompakot ja sovellukset, jotka eivät ymmärrä skaalattua UI-määrän laajennusta, näyttävät toiminnon oikean kokonaishinnan kertomalla ei-skaalatun hinnan * raakamäärän.
  • Ne näyttäisivät kuitenkin ei-skaalatun hinnan, mikä voi aiheuttaa käyttäjille hämmennystä.
  • Toivomme tämän kannustavan tiimejä päivittämään dappinsa yhteensopiviksi sellaisten tokenien kanssa, jotka käyttävät skaalattua UI-määrän laajennusta, ja autamme mielellämme tässä prosessissa.

Suositellut integraatioprioriteetit alustoittain

Yleiset vaatimukset

VaatimusKuvausPrioriteetti
Käyttäjätoimintojen tuki UiAmount-arvollaKaikkien käyttäjätoimintojen tulisi käyttää UiAmount-arvoa, kun UiAmount on käytössä sovelluksessa. Jos UiAmount ei ole näkyvissä sovelluksessa, tulisi käyttää raakamääriä kunnes sovellus päivitetään.P0

Lompakot

VaatimusKuvausPrioriteetti
Näytä skaalattu saldoNäytä skaalattu määrä (uiAmount) ensisijaisena saldona.P0
Tuki token-siirroilleLoppukäyttäjien tulisi syöttää siirtomäärät skaalattuina saldoina (raakamäärä * saldo).P0
Näytä spot-hintaNäytä skaalattu spot-hinta käyttäjilleP0
Tapahtumahistorian metatiedotNäytä skaalattu määrä (UIAmount) jokaiselle siirrolle aina kun mahdollista.P1
Näytä kerroinpäivitykset tapahtumahistoriassaKun kerroinpäivityksiä tapahtuu, näytä tämä tapahtumana käyttäjän tapahtumahistoriassa mukaan lukien saatu määräP2
Näytä hintahistoriakaavioHeijasta skaalatut hinnat hintakaaviossaP1
Perehdytys/TyökaluvihjeetTarjoa työkaluvihjeitä tai perehdytystä opettaaksesi käyttäjiä tokeneista, jotka käyttävät skaalattua ui-määrän laajennustaP2

Tutkijat

VaatimusKuvausPrioriteetti
Token-tietosivun parannuksetNäytä metatiedot kuten kokonaismarkkina-arvo ja nykyinen kerroinP0
Skaalatun saldon näyttäminen saldoilleNäytä skaalatut saldot (UiAmount) nykyisille saldoille.P0
Skaalatun saldon näyttäminen transaktioilleNäytä skaalatut saldot (UiAmount) siirtosummille aiemmissa transaktioissa.P0
Skaalatun hinnan näyttäminen transaktioilleNäytä skaalatut hinnat aiemmille transaktioilleP1
Kertoimen päivitystransaktioiden oikea jäsennys ja näyttöNäytä asianmukaisesti tiedot kertoimen päivityksestäP2

Markkinatietojen kokoajat (esim. CoinGecko)

VaatimusKuvausPrioriteetti
API-päivitykset skaalattua dataa vartenLaajenna API-toiminnallisuutta sisältämään kertoimen muutokset ajan myötä sekä skaalattu hintasyöte.P0
Kokonaistarjonta skaalatulla säädölläKun näytetään kokonaistarjonta ja kokonaismarkkina-arvo, ota huomioon skaalatut saldotP0
Historiallinen hinnan seurantaTarjoa historiallinen kaavio hinnoista käyttäen skaalattua hintaa ajan myötä.P1
Historiallinen kertoimen seurantaTarjoa historialliset merkinnät kertoimen päivityksistä korkoa tuottaville tokeneille.P2
Opetussisältö tai selityksetSisällytä lyhyitä kuvauksia tai työkaluvihjeitä, jotka selittävät miten skaalatut tokenit toimivat.P2

Hintasyötteiden tarjoajat

VaatimusKuvausPrioriteetti
Skaalatut & skaalaamattomat hintasyötteetTarjoa hintasyötteet sekä skaalattuihin että skaalaamattomiin hintoihin.P0
Historiallinen kerroindataTarjoa API:t historiallisilla kertoimen muutoksilla.P0
Historiallinen hintadataTarjoa API:t historiallisilla hinnoilla perustuen sekä skaalattuihin että skaalaamattomiin määriin.P0

DEXit

VaatimusKuvausPrioriteetti
Näytä uudelleenpohjatut tokenisaldotNäytä skaalatut saldot kaupankäyntiä tai likviditeetin tarjoamista varten käyttöliittymässä. (taustajärjestelmä voi silti käyttää raakamääriä)P0
Tuki tokenitoiminnoilleLoppukäyttäjien tulisi syöttää toimintomäärät UiAmount-saldoillaan (kerroin * raakamäärä).P0
Hintasyötteen mukauttaminenKaikkialla, missä hintasyötettä käytetään nykyisen hinnan näyttämiseen, tarjoa skaalattu hinta loppukäyttäjille.P1
Näytä hintahistoriakaavioHeijasta skaalatut hinnat hintakaaviossaP1

Is this page helpful?