@frakters/nft-lending-v2
Version:
Client library for interacting with nft lenging solana program
90 lines (89 loc) • 5.14 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.unstakeAll = exports.mergeTokens = void 0;
const layouts_1 = require("./layouts");
const web3_js_1 = require("@solana/web3.js");
const web3_1 = require("./web3");
const spl_token_1 = require("@solana/spl-token");
const ids_1 = require("./ids");
const lodash_1 = require("lodash");
const stake_1 = require("./stake");
function mergeTokens(connection, wallet, auxiliaryTokenAccounts, tokenAccounts) {
return __awaiter(this, void 0, void 0, function* () {
if (!connection || !wallet)
throw new Error('Miss connection');
if (!auxiliaryTokenAccounts || auxiliaryTokenAccounts.length === 0)
throw new Error('Miss auxiliary accounts infomations');
const owner = wallet.publicKey;
const { blockhash } = yield connection.getRecentBlockhash();
const transaction = new web3_js_1.Transaction({ recentBlockhash: blockhash, feePayer: owner });
const signers = [];
const atas = [];
for (let index = 0; index < auxiliaryTokenAccounts.length; index++) {
if (index > 0) {
try {
const data = transaction.compileMessage().serialize();
// 1280 - 40 - 8 - 64 - 1 - 256
if (data.length > 911) {
break;
}
}
catch (_a) {
break;
}
}
const auxiliaryTokenAccount = auxiliaryTokenAccounts[index];
const { pubkey: from, account: accountInfo } = auxiliaryTokenAccount;
const { info } = accountInfo.data.parsed;
const { mint, tokenAmount } = info;
const mintPubkey = new web3_js_1.PublicKey(mint);
const ata = yield web3_1.findAssociatedTokenAddress(owner, mintPubkey);
const ataAccountInfo = lodash_1.get(tokenAccounts, mint);
if (!ataAccountInfo && !atas.includes(ata.toBase58())) {
transaction.add(spl_token_1.Token.createAssociatedTokenAccountInstruction(ids_1.ASSOCIATED_TOKEN_PROGRAM_ID, ids_1.TOKEN_PROGRAM_ID, mintPubkey, ata, owner, owner));
atas.push(ata.toBase58());
}
const { amount } = tokenAmount;
transaction.add(spl_token_1.Token.createTransferInstruction(ids_1.TOKEN_PROGRAM_ID, from, ata, owner, [], new spl_token_1.u64(amount)));
}
return yield web3_1.sendTransaction(connection, wallet, transaction, signers);
});
}
exports.mergeTokens = mergeTokens;
function unstakeAll(connection, wallet, farms) {
return __awaiter(this, void 0, void 0, function* () {
if (!connection || !wallet)
throw new Error('Miss connection');
if (!farms || farms.length === 0)
throw new Error('Miss farms infomations');
const transaction = new web3_js_1.Transaction();
const signers = [];
const owner = wallet.publicKey;
const atas = [];
farms.forEach((farm) => __awaiter(this, void 0, void 0, function* () {
const { farmInfo, lpAccount, rewardAccount, infoAccount, amount } = farm;
if (!farmInfo)
throw new Error('Miss pool infomations');
if (!infoAccount)
throw new Error('Miss account infomations');
if (!amount)
throw new Error('Miss amount infomations');
const userLpAccount = yield web3_1.createAssociatedTokenAccountIfNotExist(lpAccount, owner, farmInfo.lp.mintAddress, transaction, atas);
// if no reward account, create new one
const userRewardTokenAccount = yield web3_1.createAssociatedTokenAccountIfNotExist(rewardAccount, owner, farmInfo.reward.mintAddress, transaction, atas);
const programId = new web3_js_1.PublicKey(farmInfo.programId);
transaction.add(stake_1.withdrawInstruction(programId, new web3_js_1.PublicKey(farmInfo.poolId), new web3_js_1.PublicKey(farmInfo.poolAuthority), new web3_js_1.PublicKey(infoAccount), wallet.publicKey, userLpAccount, new web3_js_1.PublicKey(farmInfo.poolLpTokenAccount), userRewardTokenAccount, new web3_js_1.PublicKey(farmInfo.poolRewardTokenAccount), layouts_1.getBigNumber(amount.wei)));
}));
return yield web3_1.sendTransaction(connection, wallet, transaction, signers);
});
}
exports.unstakeAll = unstakeAll;