Đồng bộ Native

SOL Được Gói Là Gì?

SOL được gói (WSOL) là SOL được giữ trong token account cho native mint của Token Program. Native mint là địa chỉ mint mà Token Program sử dụng cho các token account gói SOL. Native mint cho phép SOL được sử dụng thông qua các lệnh của Token Program.

Chương trìnhĐịa chỉ native mint
Token ProgramSo11111111111111111111111111111111111111112
Token Extension Program9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP

Token account SOL được gói lưu trữ SOL trong trường lamports của tài khoản, nhưng theo dõi lượng SOL được giữ trong token account SOL được gói dưới dạng số dư token thông qua trường amount của token account. Nếu bạn chuyển SOL vào token account SOL được gói, số dư lamport tăng ngay lập tức, nhưng trường amount của token không thay đổi cho đến khi bạn gọi lệnh SyncNative của Token Program.

Cách Đồng Bộ SOL Native

Sử dụng lệnh SyncNative của Token Program sau khi chuyển SOL vào token account SOL được gói. Lệnh SyncNative cập nhật trường amount của token account để khớp với số lamport được giữ trong tài khoản vượt quá dự trữ miễn thuê của nó.

Tham Chiếu Nguồn

MụcMô tảToken ProgramToken Extension Program
AccountTrạng thái token account sử dụng is_native để đánh dấu tài khoản là WSOL và lưu trữ dự trữ native, số dư lamport tối thiểu miễn thuê mà tài khoản phải giữ, và số lượng token được theo dõi.NguồnNguồn
SyncNativeMột lệnh cập nhật trường amount của token account SOL được gói để khớp với số lamport được giữ trong tài khoản vượt quá dự trữ miễn thuê của nó.NguồnNguồn
process_sync_nativeLogic xử lý chung để đồng bộ hóa số dư SOL được gói.NguồnNguồn

Typescript

Các ví dụ dưới đây cho thấy phương pháp được khuyến nghị sử dụng Kit. Các ví dụ cũ sử dụng @solana/kit được bao gồm để tham khảo.

Kit

import { address } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
import { systemProgram } from "@solana-program/system";
import {
findAssociatedTokenPda,
getCreateAssociatedTokenInstructionAsync,
tokenProgram,
TOKEN_PROGRAM_ADDRESS
} from "@solana-program/token";
const client = await createLocalClient()
.use(systemProgram())
.use(tokenProgram());
const NATIVE_MINT = address("So11111111111111111111111111111111111111112");
const [tokenAccount] = await findAssociatedTokenPda({
mint: NATIVE_MINT,
owner: client.payer.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS
});
const result = await client.sendTransaction([
client.system.instructions.transferSol({
source: client.payer, // Account sending the SOL to wrap.
destination: tokenAccount, // WSOL token account receiving the SOL.
amount: 1_000_000n // SOL amount in lamports.
}),
client.token.instructions.syncNative({
account: tokenAccount // WSOL token account to synchronize.
})
]);
const tokenAccountData = await client.token.accounts.token.fetch(tokenAccount);
console.log("WSOL Token Account Address:", tokenAccount);
console.log("WSOL Token Account:", tokenAccountData.data);
console.log("\nTransaction Signature:", result.context.signature);
Console
Click to execute the code.

Web3.js

import {
Connection,
Keypair,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL,
SystemProgram,
Transaction
} from "@solana/web3.js";
import {
createAssociatedTokenAccount,
getAccount,
NATIVE_MINT,
syncNative,
TOKEN_PROGRAM_ID
} from "@solana/spl-token";
const result = await syncNative(
connection,
feePayer, // Account paying transaction fees.
associatedTokenAccount, // WSOL token account to synchronize.
{
commitment: "confirmed"
},
TOKEN_PROGRAM_ID // Token program to invoke.
);
const tokenAccountData = await getAccount(
connection,
associatedTokenAccount,
"confirmed",
TOKEN_PROGRAM_ID
);
console.log("WSOL Token Account Address:", associatedTokenAccount.toBase58());
console.log("WSOL Token Account:", tokenAccountData);
console.log("\nTransaction Signature:", result);
Console
Click to execute the code.

Rust

Rust
use anyhow::Result;
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_commitment_config::CommitmentConfig;
use solana_sdk::{
program_pack::Pack,
signature::{Keypair, Signer},
transaction::Transaction,
};
use solana_system_interface::instruction::transfer;
use spl_associated_token_account_interface::{
address::get_associated_token_address, instruction::create_associated_token_account,
};
use spl_token_interface::{
id as token_program_id,
instruction::sync_native,
native_mint::ID as NATIVE_MINT_ID,
state::Account,
};
#[tokio::main]
async fn main() -> Result<()> {
let client = RpcClient::new_with_commitment(
String::from("http://localhost:8899"),
CommitmentConfig::confirmed(),
);
let associated_token_address = get_associated_token_address(&fee_payer.pubkey(), &NATIVE_MINT_ID);
let sync_amount = 1_000_000;
let transaction = Transaction::new_signed_with_payer(
&[
transfer(
&fee_payer.pubkey(), // Account sending the SOL to wrap.
&associated_token_address, // WSOL token account receiving the SOL.
sync_amount, // SOL amount in lamports.
),
sync_native(
&token_program_id(), // Token program to invoke.
&associated_token_address, // WSOL token account to synchronize.
)?,
],
Some(&fee_payer.pubkey()),
&[&fee_payer],
latest_blockhash,
);
let transaction_signature = client.send_and_confirm_transaction(&transaction).await?;
let token_account = client.get_account(&associated_token_address).await?;
let token_data = Account::unpack(&token_account.data)?;
println!("WSOL Token Account Address: {}", associated_token_address);
println!("WSOL Token Account: {:#?}", token_data);
println!("\nTransaction Signature: {}", transaction_signature);
Ok(())
}
Console
Click to execute the code.

Python

Python
#!/usr/bin/env python3
import asyncio
import json
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.message import Message
from solders.pubkey import Pubkey
from solders.transaction import Transaction
from solders.system_program import transfer, TransferParams
from spl.token.async_client import AsyncToken
from spl.token.instructions import (
create_associated_token_account,
get_associated_token_address,
sync_native,
SyncNativeParams,
)
from spl.token.constants import TOKEN_PROGRAM_ID, WRAPPED_SOL_MINT
AMOUNT_TO_WRAP = 1_000_000
async def main():
rpc = AsyncClient("http://localhost:8899")
async with rpc:
sync_native_instructions = [
transfer(
TransferParams(
from_pubkey=fee_payer.pubkey(), # Account sending SOL to the wrapped SOL token account.
to_pubkey=wrapped_sol_account, # Wrapped SOL token account receiving the lamports.
lamports=AMOUNT_TO_WRAP, # Lamports to wrap as WSOL.
)
),
sync_native(
SyncNativeParams(
program_id=TOKEN_PROGRAM_ID, # Token program to invoke.
account=wrapped_sol_account, # Wrapped SOL token account whose amount field updates.
)
),
]
latest_blockhash = await rpc.get_latest_blockhash()
transaction = Transaction(
[fee_payer],
Message(sync_native_instructions, fee_payer.pubkey()),
latest_blockhash.value.blockhash,
)
result = await rpc.send_transaction(transaction)
token_account_info = await token.get_account_info(wrapped_sol_account)
token_account = {
key: str(value) if isinstance(value, Pubkey) else value
for key, value in token_account_info._asdict().items()
}
print("Native Mint Address:", WRAPPED_SOL_MINT)
print("\nWrapped SOL Token Account Address:", wrapped_sol_account)
print("Token Account:")
print(json.dumps(token_account, indent=2))
print("\nTransaction Signature:", result.value)
if __name__ == "__main__":
asyncio.run(main())
Console
Click to execute the code.

Is this page helpful?

Mục lục

Chỉnh sửa trang

Quản lý bởi

© 2026 Solana Foundation.
Đã đăng ký bản quyền.
Kết nối