Probando devnet y airdrops. A continuación se muestra mi código para una billetera básica con un airdrop de 2 soles. Estoy tratando de convertir Lamports nuevamente en SOL dividiendo la constante LAMPARTS_PER_SOL . El resultado esperado debería ser que el Wallet balance is 2 cuando se divide por la constante mencionada anteriormente, en su lugar, el Wallet balance is 0 . ¿Cómo puedo resolver esto?
Mi código:
const { Connection, PublicKey, clusterApiUrl, Keypair, LAMPORTS_PER_SOL, } = require("@solana/web3.js"); const wallet = new Keypair(); const publicKey = new PublicKey(wallet._keypair.publicKey); const secretKey = wallet._keypair.secretKey; const getWalletBalance = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const walletBalance = await connection.getBalance(publicKey); console.log(`Wallet balance is ${walletBalance}`); } catch (err) { console.error(err); } }; const airDropSol = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const fromAirDropSignature = await connection.requestAirdrop( publicKey, (2 * LAMPORTS_PER_SOL) /= LAMPORTS_PER_SOL ); await connection.confirmTransaction(fromAirDropSignature); } catch (err) { console.log(err); } }; const main = async () => { await getWalletBalance(); await airDropSol(); await getWalletBalance(); }; main();En todas las librerías creo que hay operaciones auxiliares para realizar estas conversiones, en la librería Solnet para .Net hacemos esta operación:
decimal ConvertToSol(ulong lamports) { return decimal.Round((decimal)lamports / 1000000000m, 9); }Si lo traduces a JS te dará el mismo resultado y te funciona
No hay mucho que pueda encontrar para mi situación particular ya que el desarrollo de Solana es tan nuevo, pero pude resolverlo cuando tropecé con el método parseFloat() .
Primero tuve que eliminar el cociente de la const fromAirDropSignature y anteponer el método parseFloat() a walletBalance dentro de la sección console.log.
Código inicial:
const getWalletBalance = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const walletBalance = await connection.getBalance(publicKey); console.log(`Wallet balance is ${walletBalance}`); } catch (err) { console.error(err); } }; const airDropSol = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const fromAirDropSignature = await connection.requestAirdrop( publicKey, (2 * LAMPORTS_PER_SOL) /= LAMPORTS_PER_SOL );Producción:
Wallet balance is 0Código de trabajo:
const getWalletBalance = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const walletBalance = await connection.getBalance(publicKey); console.log( `Wallet balance is ${parseFloat(walletBalance) / LAMPORTS_PER_SOL} SOL` ); } catch (err) { console.error(err); } }; const airDropSol = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const fromAirDropSignature = await connection.requestAirdrop( publicKey, 1.0024 * LAMPORTS_PER_SOL );Producción:
Wallet balance is 1.0024 SOL Una cosa que noto es que al usar 'devnet' , no permitirá una denominación superior a 2. Cualquier número entero por debajo de eso funcionará.
Entonces puede convertir walletBalance a BigInt de Javascript, para que pueda dividir fácilmente por BigInt (LAMPORTS_PER_URL)
const { Connection, PublicKey, clusterApiUrl, Keypair, LAMPORTS_PER_SOL, } = require("@solana/web3.js"); const wallet = new Keypair(); const publicKey = new PublicKey(wallet._keypair.publicKey); const secretKey = wallet._keypair.secretKey; const getWalletBalance = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); let walletBalance = await connection.getBalance(publicKey); **walletBalance = BigInt(walletBalance) / BigInt(LAMPORTS_PER_SOL)** console.log(`Wallet balance is ${walletBalance}`); } catch (err) { console.error(err); } }; const airDropSol = async () => { try { const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); const fromAirDropSignature = await connection.requestAirdrop( publicKey, 2 * LAMPORTS_PER_SOL ); await connection.confirmTransaction(fromAirDropSignature); } catch (err) { console.log(err); } }; const main = async () => { await getWalletBalance(); await airDropSol(); await getWalletBalance(); }; main();