SOL, Lamports y Unidades
Solana almacena toda la moneda nativa como lamports, enteros sin signo de 64 bits. Comprender las denominaciones evita errores de redondeo, transacciones fallidas y cálculos de tarifas incorrectos.
Busca en todas las páginas de la documentación
Solana almacena toda la moneda nativa como lamports, enteros sin signo de 64 bits. Comprender las denominaciones evita errores de redondeo, transacciones fallidas y cálculos de tarifas incorrectos.
Tarjeta de referencia rápida - lista para copiar y pegar.
import { lamports } from "@solana/kit";
const ONE_SOL = 1_000_000_000n;
const halfSol = lamports(500_000_000n);
function solToLamports(sol: number): bigint {
return BigInt(Math.round(sol * 1e9));
}
function lamportsToSol(lps: bigint): string {
return (Number(lps) / 1e9).toFixed(9);
}Cuándo usar esto:
decimals de la mint (separado del SOL nativo)import { createSolanaRpc, address, lamports } from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
import {
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
pipe,
} from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const sender = address("SENDER_PUBKEY");
const recipient = address("RECIPIENT_PUBKEY");
// El usuario introduce "0.25" SOL en un formulario de interfaz de usuario
const userInputSol = 0.25;
const amountLamports = BigInt(Math.round(userInputSol * 1_000_000_000));
const { value: balance } = await rpc.getBalance(sender).send();
if (balance < amountLamports) {
throw new Error(
`Insuficiente: tienes ${Number(lamports(balance)) / 1e9} SOL, necesitas ${userInputSol}`,
);
}
const { value: blockhash } = await rpc.getLatestBlockhash().send();
const transferIx = getTransferSolInstruction({
source: sender,
destination: recipient,
amount: amountLamports,
});
const message = pipe(
createTransactionMessage({ version: 0 }),
(m) => setTransactionMessageFeePayer(sender, m),
(m) => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
(m) => appendTransactionMessageInstruction(transferIx, m),
);
console.log("Mensaje de transferencia construido para", amountLamports, "lamports");Lo que esto demuestra:
bigint antes de cualquier comparación en la cadenagetBalance devuelve lamports - compara enteros, no flotanteslamports() de Kit envuelve valores brutos para mayor claridad de tipo| Unidad | Lamports | Uso Típico |
|---|---|---|
| 1 lamport | 1 | Unidad nativa más pequeña |
| 1 SOL | 1,000,000,000 | Visualización para el usuario |
| Tarifa de prioridad | microlamports/CU | Programa de Presupuesto de Cómputo |
| Tarifa base | 5,000 lamports/firma | Costo por firma (predeterminado actual) |
use anchor_lang::prelude::*;
const LAMPORTS_PER_SOL: u64 = 1_000_000_000;
pub fn transfer_amount(ctx: Context<Transfer>, sol: f64) -> Result<()> {
let lamports = (sol * LAMPORTS_PER_SOL as f64) as u64; // evitar en producción
// Preferir: el usuario suministra lamports directamente, o usar un crate de punto fijo
require!(lamports > 0, ErrorCode::ZeroAmount);
Ok(())
}f64 a u64 en código financiero de producción - usa entrada enteraanchor_lang proporciona el alias de tipo Lamports en algunos contextoschecked_add, checked_sub para la aritmética de saldos en programas0.1 + 0.2 !== 0.3 puede producir cantidades de lamports incorrectas. Solución: analiza las cadenas de usuario a bigint mediante aritmética entera o una biblioteca decimal.Number.MAX_SAFE_INTEGER pierden precisión. Solución: formatea los lamports como bigint o usa un formateador basado en cadenas.mint.decimals antes de convertir cantidades de tokens.getMinimumBalanceForRentExemption y almacena el valor exacto de lamports.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
bigint en TypeScript | Todo el manejo de cantidades en la cadena | Necesitas soporte de navegador heredado sin polyfills |
Decimal.js / bignumber.js | Analizar cadenas decimales de usuario de forma segura | Dentro de programas Rust en la cadena |
| Solo enteros de lamports (sin tipo SOL) | Argumentos de instrucciones del programa | Construir interfaces de billetera visibles para el usuario |
Ayudante lamports() de @solana/kit | Tuberías de Kit seguras en cuanto a tipo | Scripts RPC brutos donde Kit es excesivo |
1,000,000,000 (10^9). Esto es fijo y nunca cambia.
La ejecución determinista en todos los validadores requiere aritmética exacta. El punto flotante varía según el hardware; los enteros u64 no.
1 lamport. En la práctica, las tarifas de transacción (5,000 lamports por firma por defecto) hacen que las transferencias sub-lamport no tengan sentido.
function parseSolToLamports(input: string): bigint {
const [whole, frac = ""] = input.split(".");
const padded = (frac + "000000000").slice(0, 9);
return BigInt(whole) * 1_000_000_000n + BigInt(padded);
}Lamports. Divide por 1e9 solo para mostrar - nunca para instrucciones en la cadena.
1 microlamport = 0.000001 lamports. Las tarifas de prioridad se cotizan en microlamports por unidad de cómputo a través del Programa de Presupuesto de Cómputo.
Teóricamente, con un suministro total de ~18.4 mil millones de SOL, no es una preocupación práctica, pero la lógica del programa aún debe usar aritmética verificada.
Basado en el tamaño de los datos de la cuenta en bytes. RPC getMinimumBalanceForRentExemption(dataSize) devuelve el depósito exacto de lamports requerido.
Almacena lamports como enteros (o cadenas para valores muy grandes). Convierte a SOL solo en la capa de presentación.
El Programa del Sistema rechaza las transferencias de cero lamports. Usa un mínimo significativo o omite la instrucción.
No. Los tokens SPL usan el campo decimals de la mint. Una cantidad de USDC de 1_000_000 significa 1 USDC (6 decimales), no lamports.
Divide los lamports bigint en partes enteras y fraccionarias con aritmética de cadenas, o usa una biblioteca. Evita Number(lamports) para valores que volverás a enviar en la cadena.
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 16 jul 2026