Sui.

Beitrag

Teile dein Wissen.

article banner.
Sergey Ilin.
Jun 04, 2025
Artikel

So übertragen Sie eine bestimmte Menge an SUI-Tokens: Umgang mit Münzobjekten

So übertragen Sie eine bestimmte Menge an SUI-Tokens: Umgang mit Münzobjekten

Die Herausforderung

Im Gegensatz zu herkömmlichen Blockchains, bei denen Token-Guthaben aus einfachen Zahlen bestehen, speichert SUI Token als einzelneCoin-Objekte. Das heißt, wenn Sie 3 SUI-Tokens haben, existieren diese als drei separate Objekte (z. B. 1 SUI + 1 SUI + 1 SUI = 3 insgesamt), nicht als ein einziger Saldo von „3 SUI“.

Wenn du einen bestimmten Betrag (z. B. 2,5 SUI) überweisen möchtest, musst du: 1.KombinierenSie bei Bedarf mehrere Münzobjekte 2.SplitMünzen, um den genauen Betrag zu erhalten 3.Transferdas resultierende Münzobjekt

Code-Beispiel: Übertragung von 2,5 SUI

Hier ist ein vollständiges TypeScript-Beispiel, das zeigt, wie man damit umgeht:

import { SuiClient, getFullnodeUrl } from '@mysten/sui.js/client';
import { TransactionBlock } from '@mysten/sui.js/transactions';
import { Ed25519Keypair } from '@mysten/sui.js/keypairs/ed25519';

// Initialize client and keypair
const client = new SuiClient({ url: getFullnodeUrl('testnet') });
const keypair = Ed25519Keypair.fromSecretKey(YOUR_SECRET_KEY);
const senderAddress = keypair.getPublicKey().toSuiAddress();

async function transferSUI(recipientAddress: string, amountInSUI: number) {
  try {
    // Convert SUI to MIST (1 SUI = 1,000,000,000 MIST)
    const amountInMist = Math.floor(amountInSUI * 1_000_000_000);
    
    // Step 1: Get all SUI coin objects owned by sender
    const coinObjects = await client.getCoins({
      owner: senderAddress,
      coinType: '0x2::sui::SUI'
    });
    
    if (coinObjects.data.length === 0) {
      throw new Error('No SUI coins found');
    }
    
    console.log(`Found ${coinObjects.data.length} SUI coin objects`);
    coinObjects.data.forEach((coin, index) => {
      console.log(`Coin ${index + 1}: ${coin.balance} MIST`);
    });
    
    // Step 2: Create transaction block
    const txb = new TransactionBlock();
    
    // Step 3: Handle coin merging and splitting
    let primaryCoin;
    
    if (coinObjects.data.length === 1) {
      // Single coin - just split it
      primaryCoin = coinObjects.data[0].coinObjectId;
    } else {
      // Multiple coins - merge them first
      primaryCoin = coinObjects.data[0].coinObjectId;
      const coinsToMerge = coinObjects.data.slice(1).map(coin => coin.coinObjectId);
      
      if (coinsToMerge.length > 0) {
        txb.mergeCoins(primaryCoin, coinsToMerge);
        console.log(`Merging ${coinsToMerge.length} coins into primary coin`);
      }
    }
    
    // Step 4: Split the exact amount needed
    const [transferCoin] = txb.splitCoins(primaryCoin, [amountInMist]);
    
    // Step 5: Transfer the split coin
    txb.transferObjects([transferCoin], recipientAddress);
    
    // Step 6: Set gas budget and execute
    txb.setGasBudget(10000000); // 0.01 SUI in MIST
    
    const result = await client.signAndExecuteTransactionBlock({
      signer: keypair,
      transactionBlock: txb,
      options: {
        showEffects: true,
        showObjectChanges: true,
      },
    });
    
    console.log('Transaction successful!');
    console.log('Digest:', result.digest);
    console.log('Gas used:', result.effects?.gasUsed);
    
    return result;
    
  } catch (error) {
    console.error('Transfer failed:', error);
    throw error;
  }
}

// Usage example
async function main() {
  const recipientAddress = '0x742d35cc6db7e3b6c7e4c46e7f8c7e6f1234567890abcdef';
  const amountToTransfer = 2.5; // SUI
  
  await transferSUI(recipientAddress, amountToTransfer);
}

// Run the transfer
main().catch(console.error);

Schrittweise Aufschlüsselung

1.Münzobjekte holen

const coinObjects = await client.getCoins({
  owner: senderAddress,
  coinType: '0x2::sui::SUI'
});

Dadurch werden alle SUI-Münzobjekte abgerufen, die Ihrer Adresse gehören.

2.Füge mehrere Coins zusammen (falls erforderlich)

if (coinObjects.data.length > 1) {
  const primaryCoin = coinObjects.data[0].coinObjectId;
  const coinsToMerge = coinObjects.data.slice(1).map(coin => coin.coinObjectId);
  txb.mergeCoins(primaryCoin, coinsToMerge);
}

Wenn du mehrere Münzobjekte hast, füge sie zu einer größeren Münze zusammen.

3.Exakten Betrag aufteilen

const [transferCoin] = txb.splitCoins(primaryCoin, [amountInMist]);

Teilen Sie den genauen Betrag auf, den Sie von der zusammengeführten Münze überweisen möchten.

4.Transferiere die geteilte Münze

txb.transferObjects([transferCoin], recipientAddress);

Übertrage das neu erstellte Münzobjekt an den Empfänger.

Wichtige Punkte, die Sie sich merken sollten

-MIST vs SUI: Bei Transaktionen immer SUI in MIST umwandeln (mit 1.000.000.000 multiplizieren) -Gasbudget: Legen Sie ein angemessenes Gasbudget fest (in der Regel sind 0,01 SUI ausreichend) -Objekt-IDs: Jede Münze hat eine eindeutige Objekt-ID, auf die Sie bei Transaktionen verweisen -Atomare Operationen: Alle Merge-, Split- und Transfer-Operationen finden in einer einzigen Transaktion statt

Tipps zur Fehlerbehandlung

// Check if you have enough balance
const totalBalance = coinObjects.data.reduce((sum, coin) => 
  sum + parseInt(coin.balance), 0
);

if (totalBalance < amountInMist) {
  throw new Error(`Insufficient balance. Have: ${totalBalance/1e9} SUI, Need: ${amountInSUI} SUI`);
}

Alternative: Verwenden der integrierten Methode des SUI SDK

Für einfachere Anwendungsfälle können Sie die praktische Methode des SDK verwenden:

const txb = new TransactionBlock();
const [coin] = txb.splitCoins(txb.gas, [amountInMist]);
txb.transferObjects([coin], recipientAddress);

Dabei wird die Gasmünze für den Transfer verwendet, was bei kleineren Beträgen gut funktioniert. Wenn die Gasmünze jedoch nicht über die erforderliche Menge an SUI verfügt, ist die oben beschriebene Vorgehensweise erforderlich/

  • Sui
  • Transaction Processing
  • Move
1
Teilen
Kommentare
.
harry phan.
Jun 5 2025, 04:31

Der Umgang mit Münzobjekten in SUI fühlt sich an wie das Basteln in einem Spiel.

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

610Beiträge1335Antworten
Sui.X.Peera.

Verdiene deinen Anteil an 1000 Sui

Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.

BelohnungskampagneJuli