Sui.

Publicación

Comparte tu conocimiento.

article banner.
Sergey Ilin.
Jun 04, 2025
Artículo

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
1
Cuota
Comentarios
.
harry phan.
Jun 5 2025, 04:31

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.

610Publicaciones1335Respuestas
Sui.X.Peera.

Gana tu parte de 1000 Sui

Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.

Campaña de RecompensasJulio