Publicación
Comparte tu conocimiento.

Cómo transferir una cantidad específica de fichas SUI: manejo de objetos de monedas
Cómo transferir una cantidad específica de fichas SUI: Cómo manipular objetos con monedas
El desafío
A diferencia de las cadenas de bloques tradicionales, donde los saldos de los tokens son números simples, SUI almacena los tokens comoobjetos monetariosindividuales. Esto significa que si tienes 3 fichas SUI, existen como tres objetos separados (por ejemplo, 1 SUI + 1 SUI + 1 SUI = 3 en total), no como un único saldo de «3 SUI».
Cuando quieras transferir una cantidad específica (por ejemplo, 2,5 SUI), tienes que: 1.Fusionevarios objetos monetarios si es necesario 2.Dividamonedas para obtener la cantidad exacta 3.Transferenciael objeto monetario resultante
Ejemplo de código: transferir 2.5 SUI
Este es un ejemplo completo de TypeScript que muestra cómo manejar esto:
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);
Desglose paso a paso
1.Busca objetos monedas
const coinObjects = await client.getCoins({
owner: senderAddress,
coinType: '0x2::sui::SUI'
});
Esto recupera todos los objetos de monedas SUI que pertenecen a su dirección.
2.Combina varias monedas (si es necesario)
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);
}
Si tienes varios objetos de monedas, combínalos en una moneda más grande.
3.Divida la cantidad exacta
const [transferCoin] = txb.splitCoins(primaryCoin, [amountInMist]);
Divida la cantidad exacta que desea transferir de la moneda fusionada.
4.Transfiere la moneda dividida
txb.transferObjects([transferCoin], recipientAddress);
Transfiera el objeto de moneda recién creado al destinatario.
Puntos clave para recordar
-MIST contra SUI: Convierte siempre SUI a MIST (multiplícalo por 1 000 000 000 000) cuando trabajes con transacciones -Presupuesto de gas: establezca un presupuesto de gas adecuado (normalmente basta con 0,01 SUI) -ID de objeto: cada moneda tiene un ID de objeto único al que se hace referencia en las transacciones -Operaciones atómicas: Todas las operaciones de fusión, división y transferencia se realizan en una sola transacción
Consejos para el manejo de errores
// 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`);
}
Alternativa: usar el método integrado de SUI SDK
Para casos de uso más sencillos, puedes usar el práctico método del SDK:
const txb = new TransactionBlock();
const [coin] = txb.splitCoins(txb.gas, [amountInMist]);
txb.transferObjects([coin], recipientAddress);
Esto utiliza la moneda de gasolina para la transferencia, que funciona bien para cantidades más pequeñas. Sin embargo, si la moneda de gas no tiene la cantidad requerida de SUI, se requiere el enfoque anterior/
- Sui
- Transaction Processing
- Move
Manejar objetos de monedas en SUI es como hacer manualidades en un juego
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gana tu parte de 1000 Sui
Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- ¿Por qué BCS requiere un orden de campo exacto para la deserialización cuando las estructuras Move tienen campos con nombre?53
- «Errores de verificación de múltiples fuentes» en las publicaciones del módulo Sui Move: resolución automática de errores43
- Fallo en la transacción Sui: objetos reservados para otra transacción25
- ¿Cómo interactúan las restricciones de capacidad con los campos dinámicos en colecciones heterogéneas?05