@terminusbet/stake-vote-sdk
Version:
A simple SDK for interacting with terminusbet governance
142 lines • 5.77 kB
JavaScript
;
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