UNPKG

@terminusbet/stake-vote-sdk

Version:

A simple SDK for interacting with terminusbet governance

142 lines 5.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSPLBalance = exports.DEFAULT_FINALITY = exports.DEFAULT_COMMITMENT = void 0; exports.simulateMethodCall = simulateMethodCall; exports.sendTx = sendTx; exports.buildVersionedTx = buildVersionedTx; exports.getTxDetails = getTxDetails; exports.confirmTransaction = confirmTransaction; const web3_js_1 = require("@solana/web3.js"); const spl_token_1 = require("@solana/spl-token"); exports.DEFAULT_COMMITMENT = "confirmed"; exports.DEFAULT_FINALITY = "confirmed"; async function simulateMethodCall(connection, payer, transaction) { const versionedTransaction = await buildVersionedTx(connection, payer, transaction, [], 'confirmed'); return await connection.simulateTransaction(versionedTransaction); } async function sendTx(connection, tx, payer, signers, priorityFees, addressLookupTableAccounts = [], commitment = exports.DEFAULT_COMMITMENT, finality = exports.DEFAULT_FINALITY) { let newTx = new web3_js_1.Transaction(); if (priorityFees) { const modifyComputeUnits = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: priorityFees.unitLimit, }); const addPriorityFee = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFees.unitPrice, }); newTx.add(modifyComputeUnits); newTx.add(addPriorityFee); } newTx.add(tx); const latestBlockhash = (await connection.getLatestBlockhash(commitment)); let versionedTx = await buildVersionedTx(connection, payer, newTx, addressLookupTableAccounts, commitment, latestBlockhash); versionedTx.sign(signers); try { const sig = await connection.sendTransaction(versionedTx, { skipPreflight: false, preflightCommitment: commitment, maxRetries: 3 }); console.log("sig:", `https://solscan.io/tx/${sig}`); // sleep for 3 seconds to allow the transaction to be processed // console.log("Waiting for confirmation......"); await new Promise(resolve => setTimeout(resolve, 1000)); let txResult = await getTxDetails(connection, sig, commitment, finality, latestBlockhash); if (!txResult) { return { success: false, error: "Transaction failed", }; } return { success: true, signature: sig, results: txResult, }; } catch (e) { if (e instanceof web3_js_1.SendTransactionError) { let ste = e; console.log("SendTransactionError=>" + await ste.getLogs(connection)); } else { console.error("GotTxDetails other error=>", e); } return { error: e, success: false, }; } } async function buildVersionedTx(connection, payer, tx, lookupTable = [], commitment = exports.DEFAULT_COMMITMENT, opt) { if (!opt?.blockhash) { opt = await connection.getLatestBlockhash(commitment); } let messageV0 = new web3_js_1.TransactionMessage({ payerKey: payer, recentBlockhash: opt.blockhash, instructions: tx.instructions, }).compileToV0Message(lookupTable); return new web3_js_1.VersionedTransaction(messageV0); } ; async function getTxDetails(connection, sig, commitment = exports.DEFAULT_COMMITMENT, finality = exports.DEFAULT_FINALITY, opt) { if (!opt?.blockhash) { opt = await connection.getLatestBlockhash(); } await connection.confirmTransaction({ blockhash: opt.blockhash, lastValidBlockHeight: opt.lastValidBlockHeight, signature: sig, }, commitment); return connection.getTransaction(sig, { maxSupportedTransactionVersion: 0, commitment: finality, }); } ; async function confirmTransaction(connection, signature, desiredConfirmationStatus = 'confirmed', timeout = 60000, pollInterval = 1000, searchTransactionHistory = false) { const start = Date.now(); console.log("signature:", signature); while (Date.now() - start < timeout) { const { value: statuses } = await connection.getSignatureStatuses([signature], { searchTransactionHistory }); console.log("statuses:", statuses); if (!statuses || statuses.length === 0) { throw new Error('Failed to get signature status'); } const status = statuses[0]; if (status === null) { // If status is null, the transaction is not yet known await new Promise(resolve => setTimeout(resolve, pollInterval)); continue; } if (status.err) { throw new Error(`Transaction failed: ${JSON.stringify(status.err)}`); } if (status.confirmationStatus && status.confirmationStatus === desiredConfirmationStatus) { return status; } if (status.confirmationStatus === 'finalized') { return status; } await new Promise(resolve => setTimeout(resolve, pollInterval)); } return { slot: 0, confirmations: 0, err: new Error(`Transaction confirmation timeout after ${timeout}ms`), confirmationStatus: "processed" }; } const getSPLBalance = async (connection, mintAddress, pubKey, allowOffCurve = false) => { try { let ata = (0, spl_token_1.getAssociatedTokenAddressSync)(mintAddress, pubKey, allowOffCurve); const balance = await connection.getTokenAccountBalance(ata, "processed"); return balance.value.uiAmount; } catch (e) { console.log("[getSPLBalance]", e); } return null; }; exports.getSPLBalance = getSPLBalance; //# sourceMappingURL=util.js.map