Υποστήριξη της επέκτασης Scaled UI Amount στο Solana
Ιστορικό
Η επέκταση Scaled UI Amount επιτρέπει στους εκδότες token να καθορίσουν έναν πολλαπλασιαστή που θα χρησιμοποιείται κατά τον υπολογισμό του UI amount του υπολοίπου token ενός χρήστη. Αυτό επιτρέπει στους εκδότες να δημιουργούν rebasing tokens και να ενεργοποιούν πράγματα όπως stock splits. Αυτή η επέκταση, όπως και η επέκταση interest bearing token, παρέχει ένα καθαρά καλλυντικό UI amount, που σημαίνει ότι οι ομάδες πρέπει να κάνουν κάποια επιπλέον δουλειά για να παρέχουν μια καλή εμπειρία. Οι υποκείμενοι υπολογισμοί και οι μεταφορές πραγματοποιούνται όλες χρησιμοποιώντας τα raw amounts στο πρόγραμμα.
Πόροι:
Συνοπτικά
- Οι τελικοί χρήστες θα πρέπει να αλληλεπιδρούν με το UIAmount (raw amount * πολλαπλασιαστής) για την τιμή του token, το υπόλοιπο του token και τα ποσά του token όποτε είναι δυνατόν
- Οι dApps και οι πάροχοι υπηρεσιών θα πρέπει να χρησιμοποιούν το raw amount και τις μη κλιμακωμένες τιμές για όλους τους υπολογισμούς και να μετατρέπουν για τους χρήστες στο edge
- Τα ιστορικά price feeds πρέπει να παρέχονται τόσο για κλιμακωμένα όσο και για μη κλιμακωμένα ποσά για ευκολότερη ενσωμάτωση
- Οι ιστορικές τιμές του πολλαπλασιαστή πρέπει να είναι προσβάσιμες για ακριβή ιστορικά δεδομένα
Ορισμοί όρων
- Πολλαπλασιαστής: στατικός ενημερώσιμος πολλαπλασιαστής που χρησιμοποιείται για υπολογισμούς UI Amount
- UIAmount: πολλαπλασιαστής * raw amount (γνωστό και ως: scaled amount)
- Raw Amount: ποσό (γνωστό και ως: non-scaled amount)
Τρέχον υπόλοιπο
Τρέχον ποσό για εμφάνιση
- Κάθε φορά που εμφανίζετε ποσά για tokens που χρησιμοποιούν την επέκταση scaled
UI amount στους τελικούς χρήστες, θα πρέπει να χρησιμοποιείτε είτε:
- UIAmount/UIAmountString (προτιμώμενο)
- Έναν χειροκίνητο υπολογισμό του raw amount * πολλαπλασιαστής
- Συνιστούμε να περικόπτετε αυτήν την τιμή με βάση τον αριθμό των δεκαδικών
που έχει το token.
- Π.χ.: αν το yUSD έχει 6 δεκαδικά και ένας χρήστης έχει UIAmount 1.123456789, θα πρέπει να εμφανίζετε “1.123456”
Πού να βρείτε αυτά τα δεδομένα:
- Για το τρέχον υπόλοιπο ενός χρήστη μπορείτε να λάβετε ενημερωμένες πληροφορίες για τα παραπάνω ποσά καλώντας είτε το getTokenAccountBalance είτε το getAccountInfo
- Αν χρειάζεται να γνωρίζετε το UI Amount για ένα αυθαίρετο ποσό μπορείτε να
λάβετε αυτόν τον υπολογισμό καλώντας τη συνάρτηση
amountToUiAmountForMintWithoutSimulation(web3.js v1) ή προσομοιώνοντας μια συναλλαγή χρησιμοποιώντας το amountToUiAmount.- Σημείωση: Το amountToUiAmount απαιτεί προσομοίωση συναλλαγής, που σημαίνει ότι χρειάζεται επίσης έναν έγκυρο πληρωτή τελών με υπόλοιπο. Για αυτόν τον λόγο, δεν θα πρέπει να είναι ο προεπιλεγμένος τρόπος για να λάβετε ένα υπόλοιπο.
Κλήσεις RPC
getTokenAccountBalance- Επιστρέφει το υπόλοιπο του token account και τις πληροφορίες του mint
$ 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- Επιστρέφει τις πληροφορίες του account και τις πληροφορίες του mint
$ 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}
Ενημέρωση του τρέχοντος ποσού
Επειδή οι εκδότες μπορούν να ενημερώσουν τον πολλαπλασιαστή ανά πάσα στιγμή, μπορείτε να εξετάσετε το ενδεχόμενο περιοδικής ανίχνευσης προκειμένου να διατηρείτε ενημερωμένο το υπόλοιπο του λογαριασμού. Οι εκδότες είναι απίθανο να ενημερώσουν αυτόν τον πολλαπλασιαστή περισσότερο από μία φορά την ημέρα. Αν ένας πολλαπλασιαστής έχει οριστεί για μελλοντική ημερομηνία, μπορείτε να κάνετε αυτόματη ανίχνευση κατά τον χρόνο αυτής της ενημέρωσης
Ποσά token σε συναλλαγές (μεταφορές / ανταλλαγές κ.λπ.)
- Οι χρήστες θα πρέπει να εισάγουν ποσά που θα ερμηνεύονται ως το κλιμακωμένο
“UIAmount”. Η εφαρμογή που πρέπει να το επεξεργαστεί θα πρέπει να το
μετατρέψει στο ακατέργαστο ποσό token για τη συναλλαγή.
- Αν υπάρχουν προβλήματα στρογγυλοποίησης, στρογγυλοποιήστε προς τα κάτω και προτιμήστε να αφήσετε ένα μικροσκοπικό ποσό υπολείμματος παρά να ρισκάρετε την αποτυχία της συναλλαγής
- Για να κάνετε αυτήν τη μετατροπή μπορείτε να χρησιμοποιήσετε τη συνάρτηση
uiAmountToAmountForMintWithoutSimulation(web3.js v1) ή προσομοιώνοντας μια συναλλαγή χρησιμοποιώντας το 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 */
- Οι εφαρμογές θα πρέπει να χρησιμοποιούν το συνολικό ακατέργαστο ποσό όταν ένας
χρήστης ζητά να εκτελέσει μια ενέργεια με “max” ή “all” του υπολοίπου του.
Αυτό διασφαλίζει ότι δεν απομένει υπόλειμμα.
- Προαιρετικό: Μπορείτε να εξετάσετε το ενδεχόμενο αυτόματου κλεισίματος ενός λογαριασμού όταν χρησιμοποιείται το “max” για να επιστραφεί στον χρήστη η κατάθεση αποθήκευσής του
Τιμή token
- Η τιμή του token θα πρέπει πάντα να εμφανίζεται ως η κλιμακωτή τιμή όπου είναι δυνατόν.
- Εάν είστε πάροχος υπηρεσιών τροφοδοσίας τιμών, όπως ένα oracle, θα πρέπει να
εκθέτετε τόσο την κλιμακωτή όσο και τη μη κλιμακωτή τιμή.
- Όπου είναι δυνατόν, παρέχετε ένα SDK/API που αφαιρεί τις πολυπλοκότητες της επέκτασης κλιμακωτού ποσού UI.
Τρέχων πολλαπλασιαστής
- Ο τρέχων πολλαπλασιαστής μπορεί να διαβαστεί από το token mint ανά πάσα στιγμή
καλώντας το
getAccountInfo. Επιπλέον, εάν έχει οριστεί μελλοντικός πολλαπλασιαστής, αυτή η πληροφορία είναι επίσης διαθέσιμη από το token mint. Συνιστούμε να μην εμφανίζετε αυτόν τον πολλαπλασιαστή καθώς μπορεί να προκαλέσει σύγχυση στην εμπειρία χρήστη.
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*/
Ιστορικά δεδομένα
Ιστορικά δεδομένα για τροφοδοσία τιμών
- Οι υπηρεσίες που παρέχουν ιστορικά δεδομένα θα πρέπει να αποθηκεύουν και να εμφανίζουν τόσο τις κλιμακωτές όσο και τις μη κλιμακωτές τιμές για την επέκταση κλιμακωτού ποσού UI.
- Αναμένουμε ότι τα κλιμακωτά ποσά θα χρησιμοποιούνται πιο συχνά καθώς αυτό ευθυγραμμίζεται με τον τρόπο που ο παραδοσιακός χρηματοοικονομικός κόσμος αντιμετωπίζει τα γραφήματα που σχετίζονται με tokens με διαχωρισμούς μετοχών.
- Οι ενημερώσεις πολλαπλασιαστή μπορεί να περιλαμβάνουν χρονική σήμανση που βρίσκεται στο παρελθόν. Συνιστούμε τη χρήση της χρονικής σήμανσης του block για ιστορικά δεδομένα.
- Σημειώστε ότι ο ενεργός πολλαπλασιαστής μπορεί να είναι ο "multiplier" ή ο "newMultiplier" ανάλογα με την τρέχουσα χρονική σήμανση και το πότε ο νέος πολλαπλασιαστής έχει οριστεί να είναι ενεργός.
Ιστορικά δεδομένα για ποσά
- Εάν θέλετε να εμφανίσετε το υπόλοιπο που μεταφέρθηκε στο παρελθόν, χρειάζεστε πρόσβαση στον πολλαπλασιαστή σε αυτό το συγκεκριμένο slot. Μπορείτε επίσης να αποθηκεύσετε το UiAmount για μεταφορές καθώς επεξεργάζεστε συναλλαγές για να αποφύγετε αυτόν τον υπολογισμό στο μέλλον.
Συμβατότητα με προηγούμενες εκδόσεις
- Από προεπιλογή, τα πορτοφόλια και οι εφαρμογές που δεν κατανοούν την επέκταση κλιμακωμένου UI amount θα εμφανίζουν τη σωστή συνολική τιμή μιας δραστηριότητας πολλαπλασιάζοντας τη μη κλιμακωμένη τιμή * ακατέργαστο ποσό.
- Ωστόσο, θα εμφανίζουν τη μη κλιμακωμένη τιμή προκαλώντας κάποια σύγχυση στον χρήστη.
- Ελπίζουμε ότι αυτό ενθαρρύνει τις ομάδες να ενημερώσουν τις dapps τους ώστε να είναι συμβατές με token που χρησιμοποιούν την επέκταση κλιμακωμένου UI amount και είμαστε στη διάθεσή σας να παρέχουμε υποστήριξη κατά τη διάρκεια αυτής της διαδικασίας.
Προτεινόμενες προτεραιότητες ενσωμάτωσης ανά πλατφόρμα
Γενικές απαιτήσεις
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Υποστήριξη ενεργειών χρήστη χρησιμοποιώντας UiAmount | Όλες οι ενέργειες χρήστη θα πρέπει να εισάγονται σε UiAmount όταν το UiAmount είναι ενεργοποιημένο σε όλη την εφαρμογή. Εάν το UiAmount δεν είναι ορατό στην εφαρμογή, θα πρέπει να χρησιμοποιούν ακατέργαστα ποσά μέχρι να ενημερωθεί η εφαρμογή. | P0 |
Πορτοφόλια
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Εμφάνιση κλιμακωμένου υπολοίπου | Εμφάνιση του κλιμακωμένου ποσού (uiAmount) ως κύριου υπολοίπου. | P0 |
| Υποστήριξη για μεταφορές token | Οι τελικοί χρήστες θα πρέπει να εισάγουν ποσά μεταφοράς με τα κλιμακωμένα υπόλοιπά τους (ακατέργαστο ποσό * υπόλοιπο). | P0 |
| Εμφάνιση τιμής spot | Εμφάνιση της κλιμακωμένης τιμής spot για τους χρήστες | P0 |
| Μεταδεδομένα ιστορικού συναλλαγών | Εμφάνιση του κλιμακωμένου ποσού (UIAmount) για κάθε μεταφορά όπου είναι δυνατόν. | P1 |
| Εμφάνιση ενημερώσεων πολλαπλασιαστή στο ιστορικό συναλλαγών | Όταν συμβαίνουν ενημερώσεις πολλαπλασιαστή, εμφανίστε αυτό ως συμβάν στο ιστορικό συναλλαγών του χρήστη συμπεριλαμβανομένου του ποσού που κερδήθηκε | P2 |
| Εμφάνιση γραφήματος ιστορικού τιμών | Αντικατοπτρίστε τις κλιμακωμένες τιμές στο γράφημα τιμών | P1 |
| Onboarding/Tooltips | Προσφέρετε tooltips ή onboarding για να εκπαιδεύσετε τους χρήστες σχετικά με token που χρησιμοποιούν την επέκταση κλιμακωμένου ui amount | P2 |
Explorers
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Βελτιώσεις σελίδας λεπτομερειών token | Εμφάνιση μεταδεδομένων όπως συνολική κλιμακωμένη κεφαλαιοποίηση αγοράς και τρέχων πολλαπλασιαστής | P0 |
| Εμφάνιση κλιμακωμένου υπολοίπου για υπόλοιπα | Εμφάνιση κλιμακωμένων υπολοίπων (UiAmount) για τρέχοντα υπόλοιπα. | P0 |
| Εμφάνιση κλιμακωμένου υπολοίπου για συναλλαγές | Εμφάνιση κλιμακωμένων υπολοίπων (UiAmount) για ποσά μεταφοράς ιστορικών συναλλαγών. | P0 |
| Εμφάνιση κλιμακωμένης τιμής για συναλλαγές | Εμφάνιση κλιμακωμένων τιμών για προηγούμενες συναλλαγές | P1 |
| Σωστή ανάλυση και εμφάνιση συναλλαγών ενημέρωσης πολλαπλασιαστή | Σωστή εμφάνιση λεπτομερειών σχετικά με την ενημέρωση του πολλαπλασιαστή | P2 |
Συγκεντρωτές δεδομένων αγοράς (π.χ. CoinGecko, Birdeye)
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Ενημερώσεις API για κλιμακωμένα δεδομένα | Επέκταση της λειτουργικότητας API ώστε να περιλαμβάνει αλλαγές πολλαπλασιαστή με την πάροδο του χρόνου καθώς και την κλιμακωμένη τροφοδοσία τιμών. | P0 |
| Συνολική προσφορά με κλιμακωμένη προσαρμογή | Κατά την εμφάνιση της συνολικής προσφοράς και της συνολικής κεφαλαιοποίησης αγοράς, λάβετε υπόψη τα κλιμακωμένα υπόλοιπα | P0 |
| Παρακολούθηση ιστορικών τιμών | Παροχή ιστορικού γραφήματος τιμών χρησιμοποιώντας την κλιμακωμένη τιμή με την πάροδο του χρόνου. | P1 |
| Παρακολούθηση ιστορικού πολλαπλασιαστή | Παροχή ιστορικών δεικτών ενημερώσεων πολλαπλασιαστή για tokens που αποδίδουν τόκο. Σημειώστε ότι οι ενημερώσεις πολλαπλασιαστή μπορεί να περιλαμβάνουν χρονική σήμανση που ανήκει στο παρελθόν. Συνιστούμε τη χρήση της χρονικής σήμανσης του μπλοκ αντί της χρονικής σήμανσης που υποδεικνύεται στην ενημέρωση του πολλαπλασιαστή για ιστορικά δεδομένα. | P2 |
| Εκπαιδευτικό περιεχόμενο ή επεξηγήσεις | Συμπερίληψη σύντομων περιγραφών ή επεξηγηματικών εργαλείων που εξηγούν πώς λειτουργούν τα κλιμακωμένα tokens. | P2 |
Πάροχοι τροφοδοσίας τιμών
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Κλιμακωμένες & μη κλιμακωμένες τροφοδοσίες τιμών | Παροχή τροφοδοσιών τιμών τόσο για κλιμακωμένες όσο και για μη κλιμακωμένες τιμές. | P0 |
| Ιστορικά δεδομένα πολλαπλασιαστή | Προσφορά APIs με ιστορικές αλλαγές πολλαπλασιαστή. Σημειώστε ότι οι ενημερώσεις πολλαπλασιαστή μπορεί να περιλαμβάνουν χρονική σήμανση που ανήκει στο παρελθόν. Συνιστούμε τη χρήση της χρονικής σήμανσης του block αντί της χρονικής σήμανσης που υποδεικνύεται στην ενημέρωση του πολλαπλασιαστή για ιστορικά δεδομένα. | P0 |
| Ιστορικά δεδομένα τιμών | Προσφορά APIs με ιστορικές τιμές βασισμένες τόσο σε κλιμακωμένα όσο και σε μη κλιμακωμένα ποσά. | P0 |
Αποκεντρωμένα ανταλλακτήρια (DEXes)
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Εμφάνιση υπολοίπων token με αναπροσαρμογή | Εμφάνιση κλιμακωμένων υπολοίπων για συναλλαγές ή παροχή ρευστότητας στο UI. (το backend μπορεί να συνεχίσει να χρησιμοποιεί ακατέργαστα ποσά) | P0 |
| Υποστήριξη για ενέργειες token | Οι τελικοί χρήστες θα πρέπει να εισάγουν ποσά ενεργειών με τα υπόλοιπα UiAmount τους (πολλαπλασιαστής * ακατέργαστο ποσό). | P0 |
| Προσαρμογή τροφοδοσίας τιμών | Οπουδήποτε χρησιμοποιείται τροφοδοσία τιμών για την εμφάνιση της τρέχουσας τιμής, παρέχετε την κλιμακωμένη τιμή στους τελικούς χρήστες. | P1 |
| Εμφάνιση γραφήματος ιστορικού τιμών | Αντανάκλαση των κλιμακωμένων τιμών στο γράφημα τιμών | P1 |
Κεντρικά ανταλλακτήρια (CEXes)
| Απαίτηση | Περιγραφή | Προτεραιότητα |
|---|---|---|
| Παρακολούθηση ενημερώσεων πολλαπλασιαστή | Παρακολούθηση ενημερώσεων πολλαπλασιαστή για tokens που χρησιμοποιούν την επέκταση κλιμακωμένου ποσού ui. | P0 |
| Εμφάνιση υπολοίπων token με αναπροσαρμογή | Εμφάνιση κλιμακωμένων υπολοίπων για συναλλαγές ή παροχή ρευστότητας στο UI. (το backend μπορεί να συνεχίσει να χρησιμοποιεί ακατέργαστα ποσά) | P0 |
| Υποστήριξη για ενέργειες token | Οι τελικοί χρήστες θα πρέπει να εισάγουν ποσά ενεργειών με τα υπόλοιπα UiAmount τους (πολλαπλασιαστής * ακατέργαστο ποσό). | P0 |
| Οι ιστορικές ενέργειες δεν πρέπει να αναπροσαρμόζονται | Οι ιστορικές ενέργειες όπως οι συναλλαγές θα πρέπει να εμφανίζονται χρησιμοποιώντας το ακριβές κλιμακωμένο ποσό και την τιμή τη στιγμή της ενέργειας. | P1 |
| Εσωτερική παρακολούθηση ακατέργαστων υπολοίπων | Παρακολούθηση ακατέργαστων υπολοίπων για onchain συναλλαγές αντί για κλιμακωμένα υπόλοιπα. Αυτό θα είναι πιο ακριβές και ευκολότερο στη διαχείριση μακροπρόθεσμα. | P1 |
| Προσαρμογή τροφοδοσίας τιμών | Οπουδήποτε χρησιμοποιείται τροφοδοσία τιμών για την εμφάνιση της τρέχουσας τιμής, παρέχετε την κλιμακωμένη τιμή στους τελικούς χρήστες. | P1 |
| Εμφάνιση γραφήματος ιστορικού τιμών | Αντανάκλαση των κλιμακωμένων τιμών στο γράφημα τιμών. Αυτό περιλαμβάνει την αναπροσαρμογή των ιστορικών τιμών στον τρέχοντα πολλαπλασιαστή. | P1 |
| Κλιμάκωση βάσης κόστους | Το κόστος ανά μερίδιο θα πρέπει να κλιμακωθεί στον τρέχοντα πολλαπλασιαστή. | P1 |
Is this page helpful?