Τι Είναι το Wrapped SOL;
Το Wrapped SOL (WSOL) είναι SOL που κατέχεται σε έναν token account για το native mint του Token Program. Το native mint είναι η διεύθυνση mint που χρησιμοποιεί το Token Program για token accounts που περιτυλίγουν SOL. Το native mint επιτρέπει τη χρήση του SOL μέσω των εντολών του Token Program.
| Πρόγραμμα | Διεύθυνση native mint |
|---|---|
| Token Program | So11111111111111111111111111111111111111112 |
| Token Extensions Program | 9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP |
Ένας wrapped SOL token account αποθηκεύει SOL στο πεδίο lamports του
λογαριασμού, αλλά παρακολουθεί το SOL που κατέχεται στον wrapped SOL token
account ως υπόλοιπο token μέσω του πεδίου amount του token account. Εάν
μεταφέρετε SOL σε έναν wrapped SOL token account, το υπόλοιπο lamport αυξάνεται
αμέσως, αλλά το πεδίο amount δεν αλλάζει μέχρι να καλέσετε την εντολή
SyncNative του Token Program.
Πώς να Συγχρονίσετε το Native SOL
Χρησιμοποιήστε την εντολή SyncNative του Token Program μετά τη μεταφορά SOL σε
έναν wrapped SOL token account. Η εντολή SyncNative ενημερώνει το πεδίο
amount του token account ώστε να ταιριάζει με τα lamports που κατέχονται στον
λογαριασμό πάνω από το αποθεματικό απαλλαγής ενοικίου του.
Αναφορά Πηγής
| Στοιχείο | Περιγραφή | Token Program | Token Extensions Program |
|---|---|---|---|
Account | Η κατάσταση του token account χρησιμοποιεί το is_native για να επισημάνει τον λογαριασμό ως WSOL και αποθηκεύει το native reserve, το ελάχιστο υπόλοιπο lamport απαλλαγής ενοικίου που πρέπει να διατηρεί ο λογαριασμός, και το παρακολουθούμενο ποσό token. | Πηγή | Πηγή |
SyncNative | Μια εντολή που ενημερώνει το πεδίο amount ενός wrapped SOL token account ώστε να ταιριάζει με τα lamports που κατέχονται στον λογαριασμό πάνω από το αποθεματικό απαλλαγής ενοικίου του. | Πηγή | Πηγή |
process_sync_native | Κοινή λογική επεξεργαστή για τον συγχρονισμό των υπολοίπων wrapped SOL. | Πηγή | Πηγή |
Typescript
Τα παρακάτω παραδείγματα Kit δείχνουν την προτεινόμενη προσέγγιση
χρησιμοποιώντας @solana/kit. Παλαιότερα παραδείγματα που χρησιμοποιούν
@solana/web3.js περιλαμβάνονται για αναφορά.
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);
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);
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(())}
Python
#!/usr/bin/env python3import asyncioimport jsonfrom solana.rpc.async_api import AsyncClientfrom solders.keypair import Keypairfrom solders.message import Messagefrom solders.pubkey import Pubkeyfrom solders.transaction import Transactionfrom solders.system_program import transfer, TransferParamsfrom spl.token.async_client import AsyncTokenfrom 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_MINTAMOUNT_TO_WRAP = 1_000_000async 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 valuefor 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())
Is this page helpful?