@thespidercode/openbook-swap
Version:
Ready-to-use swap tool using Openbook DEX
94 lines (93 loc) • 4.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.initialAccountDetails = exports.getWalletToken = exports.getOpenOrderAccount = exports.getAccountDetail = void 0;
const web3_js_1 = require("@solana/web3.js");
const token_account_1 = require("./token-account");
const spl_token_1 = require("@solana/spl-token");
const getAccountDetail = async (marketDetails, market, transaction, owner, connection, lamports = 0) => {
try {
const accountDetails = { ...exports.initialAccountDetails };
const baseTokenAccount = await (0, token_account_1.getOrCreateTokenAccount)(owner, marketDetails.base.mint, transaction, connection, lamports);
if (baseTokenAccount && baseTokenAccount?.publicKey) {
accountDetails.baseTokenAccount = baseTokenAccount.publicKey;
accountDetails.signers ? accountDetails.signers.push(baseTokenAccount) : accountDetails.signers = [baseTokenAccount];
}
else {
if (!baseTokenAccount) {
console.log('Could not get or create base token account.');
return null;
}
accountDetails.baseTokenAccount = baseTokenAccount;
}
const quoteTokenAccount = await (0, token_account_1.getOrCreateTokenAccount)(owner, marketDetails.quote.mint, transaction, connection, lamports);
if (quoteTokenAccount && quoteTokenAccount?.publicKey) {
accountDetails.quoteTokenAccount = quoteTokenAccount.publicKey;
accountDetails.signers ? accountDetails.signers.push(quoteTokenAccount) : accountDetails.signers = [quoteTokenAccount];
}
else {
if (!quoteTokenAccount) {
console.log('Could not get or create quote token account.');
return null;
}
accountDetails.quoteTokenAccount = quoteTokenAccount;
}
accountDetails.openOrders = await (0, exports.getOpenOrderAccount)(market, owner, connection);
return accountDetails;
}
catch (error) {
console.log(error);
return null;
}
};
exports.getAccountDetail = getAccountDetail;
const getOpenOrderAccount = async (market, owner, connection) => {
try {
let openOrdersAccounts = await market.findOpenOrdersAccountsForOwner(connection, owner);
if (openOrdersAccounts && openOrdersAccounts.filter(oo => oo.market.toString() == market.address.toString()).length == 1) {
return openOrdersAccounts.filter(oo => oo.market.toString() == market.address.toString())[0].address;
}
else {
// TODO: SEE IF THAT CAN BE THE CASE
if (openOrdersAccounts.filter(oo => oo.market.toString() == market.address.toString()).length > 1) {
console.log('Weird, possible to have multiple Open Orders accounts?');
}
else {
const openOrdersAccount = new web3_js_1.Keypair();
return openOrdersAccount;
}
}
}
catch (error) {
console.log(error);
return undefined;
}
};
exports.getOpenOrderAccount = getOpenOrderAccount;
const getSolBalance = async (owner, connection) => {
try {
return (await connection.getBalance(owner)) / web3_js_1.LAMPORTS_PER_SOL;
}
catch (error) {
throw (error);
}
};
const getSplTokenBalance = async (owner, mint, connection) => {
const splTokenAccounts = await connection.getParsedTokenAccountsByOwner(owner, { mint });
return splTokenAccounts.value.length > 0 ? splTokenAccounts.value[0].account.data.parsed.info.tokenAmount.uiAmount : 0;
};
const getWalletToken = async (owner, marketDetails, connection) => {
const nativeMint = spl_token_1.NATIVE_MINT.toString();
const baseMint = marketDetails.base.mint.toString();
const quoteMint = marketDetails.quote.mint.toString();
return {
amountBaseToken: baseMint == nativeMint ? await getSolBalance(owner, connection) : await getSplTokenBalance(owner, marketDetails.base.mint, connection),
amountQuoteToken: quoteMint == nativeMint ? await getSolBalance(owner, connection) : await getSplTokenBalance(owner, marketDetails.quote.mint, connection)
};
};
exports.getWalletToken = getWalletToken;
exports.initialAccountDetails = {
baseTokenAccount: undefined,
openOrders: undefined,
quoteTokenAccount: undefined,
signers: undefined
};