SOL Envuelto
SOL Envuelto (wSOL) es SOL nativo que se mantiene dentro de una cuenta de token SPL. Los programas de DeFi esperan CPIs de tokens SPL, por lo que el SOL se envuelve temporalmente, se usa y luego se desenvuelve de nuevo a lamports nativos.
Receta
spl-token wrap 1.5
spl-token unwrap <WSOL_TOKEN_ACCOUNT>use anchor_lang::system_program;
use anchor_spl::token::{self, sync_native, TokenAccount};
// Deposita lamports en WSOL ATA, luego sync_nativeCuándo recurrir a esto:
- Pagar o intercambiar en AMMs que solo aceptan tokens SPL
- Depósitos en pools donde un lado es SOL
- Programas que unifican SOL y SPL en una única ruta de código de transferencia
- Cerrar WSOL ATA para recuperar SOL después de la interacción DeFi
Ejemplo de Trabajo
solana balance
spl-token address --token So11111111111111111111111111111111111111112
spl-token wrap 0.5
spl-token balance So11111111111111111111111111111111111111112
spl-token unwrap <WSOL_ATA_ADDRESS>
solana balanceuse anchor_lang::prelude::*;
use anchor_spl::token::{self, Token, TokenAccount, SyncNative};
pub const WSOL_MINT: Pubkey = anchor_spl::token::spl_token::native_mint::ID;
#[derive(Accounts)]
pub struct WrapSol<'info> {
#[account(mut)]
pub payer: Signer<'info>,
#[account(
mut,
constraint = wsol_ata.mint == WSOL_MINT @ ErrorCode::NotWsol,
)]
pub wsol_ata: Account<'info, TokenAccount>,
pub token_program: Program<'info, Token>,
pub system_program: Program<'info, System>,
}
pub fn wrap_sol(ctx: Context<WrapSol>, lamports: u64) -> Result<()> {
system_program::transfer(
CpiContext::new(
ctx.accounts.system_program.to_account_info(),
system_program::Transfer {
from: ctx.accounts.payer.to_account_info(),
to: ctx.accounts.wsol_ata.to_account_info(),
},
),
lamports,
)?;
token::sync_native(CpiContext::new(
ctx.accounts.token_program.to_account_info(),
SyncNative {
account: ctx.accounts.wsol_ata.to_account_info(),
},
))?;
Ok(())
}
#[error_code]
pub enum ErrorCode {
NotWsol,
}import { createSolanaRpc, address } from "@solana/kit";
const WSOL_MINT = address("So11111111111111111111111111111111111111112");
const rpc = createSolanaRpc("https://api.devnet.solana.com");
// Muchos SDKs de DEX envuelven SOL automáticamente; los flujos manuales usan la instrucción syncNative después de la transferencia de lamportsLo que esto demuestra:
- La dirección de emisión de WSOL es la clave pública de emisión nativa conocida
- Transferencia de lamports a la cuenta de token +
sync_nativeactualiza el saldo de SPL - Desenvolver cierra o agota la WSOL ATA para devolverla a la billetera nativa de SOL
Análisis Profundo
Cómo Funciona
- Dirección de emisión nativa:
So11111111111111111111111111111111111111112 - La cuenta de token puede contener lamports directamente;
sync_nativereconcilia el campo de cantidad de SPL - 9 decimales - coincide con la precisión de los lamports de SOL
- Los AMMs a menudo crean una WSOL ATA, envuelven, intercambian y desenvuelven en una sola transacción
SOL Envuelto vs. SOL Nativo
| Forma | Tipo de Cuenta | Usado por |
|---|---|---|
| SOL Nativo | Billetera propiedad del sistema | Transferencias, tarifas, staking |
| wSOL | Cuenta de token SPL (misma emisión) | AMMs, bóvedas de tokens unificadas |
Notas de Rust
// Cierra la cuenta WSOL para desenvolver - devuelve lamports al destino
use anchor_spl::token::CloseAccount;
// Asegúrate de que la cantidad sea 0 o usa el patrón de retiro según tu SDKTrampas Comunes
- Olvidar
sync_native- los lamports permanecen en la cuenta pero la cantidad de SPL es 0. Solución: siempre usasync_nativedespués de depositar lamports. - Usar la emisión incorrecta - solo la emisión nativa es WSOL. Solución: compara con
native_mint::ID. - Dejar polvo en la WSOL ATA - lamports bloqueados hasta que se desenvuelvan. Solución: desenvolver o cerrar después del flujo DeFi.
- Pagar el alquiler dos veces - la WSOL ATA necesita financiación exenta de alquiler. Solución: reutiliza la WSOL ATA persistente por billetera.
- Asumir que los programas aceptan SOL nativo - muchos solo usan CPI de transferencia SPL. Solución: envolver o usar la instrucción de depósito nativo del programa.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Transferencia de SOL Nativo | Pagos simples | AMM requiere CPI SPL |
Ayudante deposit_sol del programa | El protocolo abstrae el envoltorio | Conjunto de instrucciones personalizado |
| WSOL ATA persistente | Trader frecuente | Pago único |
Preguntas Frecuentes
¿Qué es SOL envuelto?
SOL depositado en una cuenta de token SPL para la emisión nativa, haciéndolo comportarse como cualquier token SPL en los programas.
¿Cuál es la dirección de emisión de WSOL?
So11111111111111111111111111111111111111112 en todos los clústeres.
¿Por qué envolver SOL?
Las CPIs del programa SPL Token no pueden mover lamports nativos de las billeteras sin el patrón de envoltorio.
¿Cuántos decimales usa WSOL?
9, coincidiendo con los lamports por SOL.
¿El envoltorio de SOL reduce el saldo de SOL de la billetera?
Sí. Los lamports se mueven a la cuenta de token WSOL (más tarifas).
¿Qué hace `sync_native`?
Actualiza el campo de cantidad de la cuenta de token para que coincida con los lamports que tiene la cuenta.
¿Puedo enviar WSOL como cualquier token SPL?
Sí. Transferencia estándar entre cuentas de token WSOL.
¿Cómo se desenvuelve?
spl-token unwrap o cerrar/drenar la WSOL ATA según los patrones del SDK.
¿Los swaps de Jupiter envuelven automáticamente?
Sí, para la mayoría de los swaps de entrada de SOL - el SDK maneja el envoltorio/desenvoltorio en la transacción.
¿La autoridad de emisión de WSOL es revocable?
La emisión nativa está definida por el protocolo - no es una emisión de lanzamiento típica.
¿Pueden los programas mantener WSOL?
Sí, en WSOL ATAs propiedad de PDA con las semillas de firmante adecuadas en la transferencia.
¿WSOL en Token-2022?
WSOL utiliza la emisión nativa clásica en el programa Token, no en Token-2022.
Relacionado
- Cuentas de Token Asociadas (ATAs) - WSOL ATA
- Decimales y Cantidades - 9 decimales
- SPL Token en Programas -
sync_nativeCPI
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.