Mikä on kääritty SOL?
Kääritty SOL (WSOL) on SOL:ia, jota säilytetään token-tilillä Token Programin native-mintille. Native-mint on mint-osoite, jota Token Program käyttää SOL:ia kääriville token-tileille. Native-mint mahdollistaa SOL:in käytön Token Programin ohjeiden kautta.
| Ohjelma | Native mint -osoite |
|---|---|
| Token Program | So11111111111111111111111111111111111111112 |
| Token Extensions Program | 9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP |
Kääritty SOL token-tili tallentaa SOL:in tilin lamports-kenttään, mutta seuraa
käärityllä SOL token-tilillä olevaa SOL:ia token-saldona tilin amount-kentän
kautta. Jos siirrät SOL:ia käärittyyn SOL token-tiliin, lamport-saldo kasvaa
välittömästi, mutta token amount-kenttä ei muutu ennen kuin kutsut Token
Programin SyncNative-ohjetta.
Kuinka synkronoida natiivi SOL
Käytä Token Programin SyncNative-ohjetta siirrettyäsi SOL:ia käärittyyn SOL
token-tiliin. SyncNative-ohje päivittää token-tilin amount-kentän vastaamaan
tilillä olevia lamportteja yli sen vuokrasta vapautetun varauksen.
Lähdeviittaus
| Kohde | Kuvaus | Token Program | Token Extensions Program |
|---|---|---|---|
Account | Token-tilin tila käyttää is_native-arvoa merkitäkseen tilin WSOL:iksi ja tallentaa natiivivarauksen, vuokrasta vapautetun vähimmäislamport-saldon, jonka tilin on säilytettävä, sekä seuratun token-määrän. | Lähde | Lähde |
SyncNative | Ohje, joka päivittää käärityn SOL token-tilin amount-kentän vastaamaan tilillä olevia lamportteja yli sen vuokrasta vapautetun varauksen. | Lähde | Lähde |
process_sync_native | Jaettu prosessorilogiikka käärittyjen SOL-saldojen synkronointiin. | Lähde | Lähde |
Kit
Näissä esimerkeissä käytetään @solana/kit-kirjastoa.
import { address, createClient, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { systemProgram } from "@solana-program/system";import {findAssociatedTokenPda,getCreateAssociatedTokenInstructionAsync,tokenProgram,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n))).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 v3
Näissä esimerkeissä käytetään luokkapohjaista @solana/web3.js v3 -rajapintaa sekä
@solana-program-instruktiorakentajia.
import {Connection,Keypair,PublicKey,sendAndConfirmTransaction,SystemProgram,Transaction,LAMPORTS_PER_SOL} from "@solana/web3.js";import {findAssociatedTokenPda,getCreateAssociatedTokenIdempotentInstructionAsync,getSyncNativeInstruction,getTokenDecoder,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const NATIVE_MINT = new PublicKey("So11111111111111111111111111111111111111112").toBase58();const result = await sendAndConfirmTransaction(connection,new Transaction({feePayer: feePayer.publicKey,blockhash: syncBlockhash.blockhash,lastValidBlockHeight: syncBlockhash.lastValidBlockHeight}).add(SystemProgram.transfer({fromPubkey: feePayer.publicKey, // Account sending the SOL to wrap.toPubkey: new PublicKey(associatedTokenAccount), // WSOL token account receiving the SOL.lamports: 1_000_000 // SOL amount in lamports.}),getSyncNativeInstruction({account: associatedTokenAccount // WSOL token account to synchronize.})),[feePayer]);const tokenAccountInfo = await connection.getAccountInfo(new PublicKey(associatedTokenAccount));const tokenAccountData = getTokenDecoder().decode(tokenAccountInfo!.data);console.log("WSOL Token Account Address:", associatedTokenAccount);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())
Web3.js (vanha)
Näissä esimerkeissä käytetään vanhaa @solana/web3.js 1.x -versiota ja @solana/spl-token-kirjastoa.
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);
Is this page helpful?