Beitrag
Teile dein Wissen.

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
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.
Verdiene deinen Anteil an 1000 Sui
Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- Warum benötigt BCS eine genaue Feldreihenfolge für die Deserialisierung, wenn Move-Strukturen benannte Felder haben?53
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung43
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert25
- Wie interagieren Fähigkeitsbeschränkungen mit dynamischen Feldern in heterogenen Sammlungen?05