Skaalatun käyttöliittymäsumman integrointiopas

Scaled UI Amount -laajennuksen tukeminen Solanassa

Tausta

Skaalattu UI-määrä -laajennus (Scaled UI Amount) antaa tokenien liikkeeseenlaskijoille mahdollisuuden määrittää kertoimen, jota käytetään laskettaessa käyttäjän tokenisaldon UI-määrää. Tämä mahdollistaa liikkeeseenlaskijoille rebasoivien tokenien luomisen ja asioiden kuten osakkeiden splittauksen toteuttamisen. Tämä laajennus, kuten korkoa tuottava token-laajennus, tarjoaa puhtaasti kosmeettisen UI-määrän, 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 ohjelman raakamääriä.

Resurssit:

Tiivistelmä

  • Loppukäyttäjien tulisi käyttää UIAmount-arvoa (raakamäärä * kerroin) tokenin hinnalle, tokenisaldolle ja tokenmäärille aina kun mahdollista
  • dApp-sovellusten ja palveluntarjoajien tulisi käyttää raakamäärää ja skaalaamattomia hintoja kaikissa laskelmissa ja muuntaa ne käyttäjille vasta lopussa
  • Historiallisia hintatietoja tulee tarjota sekä skaalattuina että skaalaamattomina määrinä helpompaa integrointia varten
  • Historiallisten kertoimien arvojen tulee olla saatavilla tarkkoja historiatietoja varten

Termien määritelmät

  • Kerroin: staattinen päivitettävä kerroin, jota käytetään UI-määrän laskelmissa
  • UIAmount: kerroin * raakamäärä (eli: skaalattu määrä)
  • Raakamäärä: määrä (eli: skaalaamaton määrä)

Nykyinen saldo

Nykyinen määrä näyttöä varten

  • Aina kun näytät määriä loppukäyttäjille tokeneille, jotka käyttävät skaalattua UI-määrä -laajennusta, sinun tulisi käyttää joko:
    • UIAmount/UIAmountString (suositeltu)
    • Manuaalista laskelmaa raakamäärä * 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ä saat kutsumalla joko getTokenAccountBalance tai getAccountInfo -toimintoa
  • 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 transaktiosimulaation, mikä tarkoittaa että se tarvitsee myös kelvollisen maksajan, jolla on saldo. Tämän vuoksi tämän ei pitäisi olla oletustapa saldon hakemiseen.

RPC-kutsut

  • getTokenAccountBalance
    • Palauttaa token-tilin 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 päivittävät tätä kerrointa todennäköisesti enintään 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 skaalattuina "UIAmount"-arvoina. Sovelluksen, joka käsittelee tätä, pitäisi 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ähän muunnokseen voit käyttää uiAmountToAmountForMintWithoutSimulation (web3.js v1) -funktiota tai simuloida transaktiota käyttäen amountToUiAmount-funktiota.
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ää kokonaisraakaarvoa, kun käyttäjä pyytää toimintoa "maksimi" tai "kaikki" saldostaan. Tämä varmistaa, ettei pölyä jää jäljelle.
    • Valinnainen: Voit harkita tilin automaattista sulkemista, kun "maksimia" käytetään, jotta käyttäjä saa tallettamansa säilytyskulut takaisin

Token-hinta

  • Token-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 UI-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, että tätä kerrointa ei näytetä, sillä se voi sekoittaa käyttöliittymää.
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 hintasyötteelle

  • Palveluiden, jotka tarjoavat historiallisia tietoja, tulisi tallentaa ja näyttää 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 käyttöliittymämäärän laajennusta, näyttävät toiminnan oikean kokonaishinnan kertomalla skaalaamattoman hinnan * raakamäärän.
  • Ne kuitenkin näyttäisivät skaalaamattoman hinnan, mikä voi aiheuttaa käyttäjille hämmennystä.
  • Toivomme tämän kannustavan tiimejä päivittämään dapp-sovelluksensa yhteensopiviksi tokenien kanssa, jotka käyttävät skaalattua käyttöliittymämäärän laajennusta, ja autamme mielellämme tässä prosessissa.

Suositellut integraatioprioriteetit alustoittain

Yleiset vaatimukset

VaatimusKuvausPrioriteetti
Käyttäjätoimintojen tukeminen 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 on päivitetty.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ä käyttäjille skaalattua ui-määrälaajennusta käyttävistä tokeneistaP2

Selaimet

VaatimusKuvausPrioriteetti
Token-tietosivun parannuksetNäytä metatietoja kuten skaalattu markkina-arvo ja nykyinen kerroinP0
Näytä skaalattu saldo saldoilleNäytä skaalatut saldot (UiAmount) nykyisille saldoille.P0
Näytä skaalattu saldo tapahtumilleNäytä skaalatut saldot (UiAmount) siirtomäärille historiallisissa tapahtumissa.P0
Näytä skaalattu hinta tapahtumilleNäytä skaalatut hinnat aiemmille tapahtumilleP1
Jäsennä ja näytä kerroinpäivitystapahtumat asianmukaisestiNäytä asianmukaisesti tiedot kerroinpäivityksestäP2

Markkinadatan kokoajat (esim. CoinGecko)

VaatimusKuvausPrioriteetti
API-päivitykset skaalattua dataa vartenLaajenna API-toiminnallisuutta sisältämään kertoimien muutokset ajan myötä sekä skaalattu hintasyöte.P0
Kokonaistarjonta skaalatulla mukautuksellaKun näytetään kokonaistarjontaa ja kokonaismarkkina-arvoa, 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 token-saldotNäytä skaalatut saldot kaupankäyntiä tai likviditeetin tarjoamista varten käyttöliittymässä. (taustajärjestelmä voi silti käyttää raakamääriä)P0
Tuki token-toiminnoilleLoppukäyttäjien tulisi syöttää toimintamäärät UiAmount-saldoillaan (kerroin * raakamäärä).P0
Hintasyötteen mukautusKaikkialla 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?