Sui.

Publication

Partagez vos connaissances.

Evgeniy CRYPTOCOIN.
Jun 26, 2025
Questions et Réponses avec des Experts

How to Properly Use the Sui SDK for Frontend Integration?

I'm building a frontend (React/Next.js) for a Sui dApp and need to interact with the blockchain—fetching objects, sending transactions, and listening to events. I’ve tried using the @mysten/sui.js SDK, but I’m running into issues:

Wallet Connection: Sometimes, the wallet doesn’t return the user’s address after connecting.

Transaction Handling: Transactions fail silently or return vague errors.

RPC Limits: I get rate-limited or timeouts when fetching large datasets.

Real-Time Updates: How can I listen for on-chain events (e.g., NFT mints, balance changes)?

What I’ve tried:

✔ Basic SuiClient setup with mainnet and testnet RPCs.

✔ Using useWallet() from @mysten/dapp-kit for wallet integration.

✔ Manual transaction signing with signAndExecuteTransactionBlock.

Questions:

What’s the recommended way to initialize the Sui SDK in a frontend app?

How do I handle errors gracefully (e.g., RPC failures, wallet rejections)?

Are there best practices for optimizing queries (batching, caching, etc.)?

How can I subscribe to real-time updates (e.g., new transactions, object changes)?

  • Sui
  • SDKs and Developer Tools
6
2
Partager
Commentaires
.

Réponses

2
Benjamin XDV.
Jun 30 2025, 18:13

Réponse de l'expert :

  1. Initialisation du SDK Sui Le SDK @mysten /sui.js doit être configuré avec un point de terminaison RPC fiable. Pour les applications de production, pensez à :

RPC par défaut :

ts
import { SuiClient, getFullnodeUrl } from '@mysten/sui.js/client';  

const client = new SuiClient({ url: getFullnodeUrl('mainnet') });  

RPC de secours : utilisez des services tels que les fournisseurs Sui RPC pour éviter les limites de débit.

Pour l'intégration du portefeuille, utilisez @mysten /dapp-kit :

tsx
import { createNetworkConfig, SuiClientProvider, WalletProvider } from '@mysten/dapp-kit';  
import { getFullnodeUrl } from '@mysten/sui.js/client';  

const { networkConfig } = createNetworkConfig({  
  mainnet: { url: getFullnodeUrl('mainnet') },  
  testnet: { url: getFullnodeUrl('testnet') },  
});  

function App() {  
  return (  
    <SuiClientProvider networks={networkConfig} defaultNetwork="mainnet">  
      <WalletProvider autoConnect>  
        <YourApp />  
      </WalletProvider>  
    </SuiClientProvider>  
  );  
}  
  1. Gestion des transactions et des erreurs Enveloppez toujours les transactions dans la gestion des erreurs :

ts

try {  
  const tx = await signAndExecuteTransactionBlock({  
    transactionBlock: txBlock,  
    options: { showEffects: true },  
  });  
  console.log("Tx Digest:", tx.digest);  
} catch (err) {  
  console.error("Tx Failed:", err.message);  
  // Handle specific errors (e.g., user rejection, insufficient gas)  
}  

Erreurs courantes :

« L'utilisateur a rejeté la demande » → La fenêtre contextuelle du portefeuille a été fermée.

« Budget de gaz dépassé » → Augmentez le budget de gaz avec TxBlock.setGasBudget ().

« Objet introuvable » → Vérifiez si l'identifiant de l'objet est correct et existe toujours.

  1. Optimisation des appels RPC Requêtes par lots : utilisez MultiGetObjects pour récupérer plusieurs objets en un seul appel.

Mise en cache : utilisez React Query ou SWR pour mettre en cache les réponses RPC :

ts
import { useSuiClientQuery } from '@mysten/dapp-kit';  

const { data } = useSuiClientQuery('getObject', {  
  id: objectId,  
  options: { showContent: true },  
});  

Pagination : pour les grands ensembles de données, utilisez SUIX_GetDynamicFields avec des curseurs.

  1. Mises à jour en Utilisez WebSockets ou un sondage :

Abonnements WebSocket (avancés) :

ts
const unsubscribe = client.subscribeEvent({  
  filter: { sender: '0x123...' },  
  onMessage(event) { console.log("New event:", event); },  
});  

//Nettoyage lors du démontage return () => désinscription () ; Sondage avec Hooks :

ts
useSuiClientSubscription('subscribeEvent', {  
  filter: { eventType: 'ExampleEvent' },  
  onData(event) { console.log("Event:", event); },  
});  

Conseils de pro

  1. Utilisez @mysten /dapp-kit pour les crochets de portefeuille prédéfinis.
  2. Définissez un budget de gaz personnalisé pour les transactions complexes.
  3. Surveillez l'état de santé du RPC : changez de point de terminaison si les réponses sont lentes.
  4. Testez sur Testnet avant le déploiement du réseau principal.
5
Meilleure réponse
Commentaires
.
HaGiang.
Jun 30 2025, 05:57

###1. Initialisation du SDK recommandée

Pour une DApp React ou Next.js de niveau production, la pile recommandée combine trois packages clés. Cette configuration sépare l'interaction de bas niveau de la blockchain de la gestion de l'état des applications. [1, 2, 3]

*Bibliothèques principales :

@mysten/sui.js: Le SDK TypeScript de base pour toutes les interactions directes avec le réseau Sui. [4] * @mysten/dapp-kit: La bibliothèque React principale avec des crochets et des composants pour la connexion au portefeuille et la récupération des données. [2, 5, 6] * @tanstack/react-query: Une dépendance obligatoire @mysten/dapp-kitqui gère la mise en cache, la récupération et la gestion des données en chaîne en fonction de l'état du serveur. [1, 7]

*Configuration du fournisseur : Enveloppez le composant racine de votre application avec ces fournisseurs dans le bon ordre pour vous assurer que tous les hooks fonctionnent correctement. [3, 4]

   import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
   import { SuiClientProvider, WalletProvider, createNetworkConfig } from '@mysten/dapp-kit';
   import { getFullnodeUrl } from '@mysten/sui/client';
   import '@mysten/dapp-kit/dist/index.css';

   const queryClient = new QueryClient();
   const { networkConfig } = createNetworkConfig({
     mainnet: { url: getFullnodeUrl('mainnet') },
     testnet: { url: getFullnodeUrl('testnet') },
   });

   function AppRoot() {
     return (
       <QueryClientProvider client={queryClient}>
         <SuiClientProvider networks={networkConfig} defaultNetwork="mainnet">
           <WalletProvider autoConnect>
             {/* Your Application Components */}
           </WalletProvider>
         </SuiClientProvider>
       </QueryClientProvider>
     );
   }
   ```

###**2. Gestion gracieuse des erreurs**

La gestion efficace des erreurs est cruciale pour l'expérience utilisateur. Voici comment gérer les problèmes courants.

***Défaillances de connexion au portefeuille** : le problème d'une adresse de portefeuille qui n'est pas disponible immédiatement après la connexion est généralement un problème d'état asynchrone.

***Solution** : Vérifiez toujours si l'`account`objet renvoyé par le `useCurrentAccount()`hook est nul. Lorsque vous récupérez des données qui dépendent de l'adresse, utilisez l'`enabled:!!account`option in `useSuiClientQuery`pour empêcher l'exécution de la requête tant que l'adresse n'est pas disponible. [3]

***Erreurs de transaction** : les erreurs RPC brutes sont souvent cryptiques. Utilisez la `suiclient-error-decoder`bibliothèque pour les traduire en messages lisibles par l'homme. [8, 9]

***Stratégie** : Coordonnez-vous avec le développeur de votre contrat intelligent pour définir une carte des codes d'erreur. `try...catch`Dans votre interface, utilisez cette carte avec le décodeur pour analyser les erreurs détectées dans un bloc.

<!-- end list -->

```typescript
   import { useSignAndExecuteTransactionBlock } from '@mysten/dapp-kit';
   import { SuiClientErrorDecoder } from 'suiclient-error-decoder';

   // 1. Define your custom error map
   const myErrorMap = { 1: "Mint limit has been reached." };
   const errorDecoder = new SuiClientErrorDecoder({ customErrorCodes: myErrorMap });

   // 2. Wrap your transaction call
   const { mutateAsync: signAndExecute } = useSignAndExecuteTransactionBlock();

   async function handleMint(txb) {
     try {
       await signAndExecute({ transactionBlock: txb });
       console.log("Transaction successful!");
     } catch (error) {
       const decodedError = errorDecoder.parseError(error);
       // Display decodedError.message to the user
       console.error(decodedError.message); 
     }
   }
   ```

***Erreurs courantes** :
* `"User rejected the request"`: L'utilisateur a fermé la fenêtre contextuelle du portefeuille. [10, 11]
* `"InsufficientGas"`: Le budget de gaz était trop faible. Laissez le portefeuille définir automatiquement le budget ; évitez de le définir manuellement sauf si nécessaire.

###**3. Optimisation des requêtes**

Pour éviter les limites de débit RPC et améliorer les performances, utilisez une combinaison de traitement par lots, de pagination et de mise en cache.

***Traitement par lots** : au lieu de récupérer les objets un par un, utilisez cette option `sui_multiGetObjects`pour récupérer les données d'un maximum de 50 identifiants d'objets en une seule demande. Cela réduit considérablement le trafic réseau.

`suix_getDynamicFields`***Pagination** : pour les grands ensembles de données tels que les champs dynamiques d'un objet, utilisez des points de fin paginés tels que. Ces points de terminaison utilisent un curseur pour récupérer les données page par page, évitant ainsi les délais d'attente.

***Mise en `useSuiClientQuery``@mysten/dapp-kit`cache** : le hook qui met automatiquement les réponses en cache. [1, 5] Pour optimiser davantage, définissez une `staleTime`pour les données qui ne changent pas fréquemment (par exemple, les métadonnées NFT). Cela indique à React Query de diffuser les données mises en cache pendant une durée spécifiée avant de les récupérer, réduisant ainsi les appels RPC redondants. [7, 12, 13]

```typescript
   const { data } = useSuiClientQuery(
     'getObject',
     { id: objectId, options: { showContent: true } },
     { staleTime: 10 * 60 * 1000 } // Cache is fresh for 10 minutes
   );
   ```

***Fournisseurs RPC** : pour les applications de production, utilisez un fournisseur RPC dédié tel que QuickNode, Ankr ou Chainstack pour garantir la fiabilité et éviter les limites de débit strictes des terminaux publics. [14, 15, 16]

###**4. Mises à jour en temps réel**

Il existe trois méthodes principales pour écouter les événements en chaîne, chacune avec des compromis différents.

1.**Sondage** : la méthode la plus simple. Utilisez `useSuiClientQuery`avec a `refetchInterval`pour demander régulièrement des mises à jour au réseau. Cela convient aux données non critiques pour lesquelles un délai de quelques secondes est acceptable. [17]

2.**Abonnements WebSocket** : cette méthode propose des mises à jour en temps réel à faible latence. Cependant, l'API WebSocket officielle Sui JSON-RPC est obsolète. Vous devez donc utiliser un fournisseur RPC tiers qui prend en charge WebSocket. [18, 19] Vous pouvez l'utiliser `client.subscribeEvent`pour écouter des événements spécifiques et vous devez gérer le cycle de vie de l'abonnement avec soin dans un `useEffect`hook React pour éviter les fuites de mémoire. [20, 21, 22]

```typescript
   useEffect(() => {
     const unsubscribe = await client.subscribeEvent({
       filter: { MoveEventModule: { package: '0x...', module: 'my_module' } },
       onMessage: (event) => {
         console.log("New event:", event);
       },
     });

     // Cleanup on component unmount
     return () => {
       unsubscribe();
     };
   },);
   ```

3.**Indexeur personnalisé** : la solution la plus puissante et la plus fiable pour les applications critiques. Un indexeur est un service backend dédié qui traite toutes les données de la chaîne et les stocke dans une base de données optimisée. Cela permet d'effectuer des requêtes complexes à faible latence, ce qui n'est pas possible avec l'API RPC standard. Cette approche est recommandée pour les plateformes DeFi, de jeu ou d'analyse de niveau production. [9, 23, 24]
3
Commentaires
.

Connaissez-vous la réponse ?

Veuillez vous connecter et la partager.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

610Publications1423Réponses
Sui.X.Peera.

Gagne ta part de 1000 Sui

Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.

Campagne de RécompensesJuillet