UNPKG

@frakters/nft-lending-v2

Version:

Client library for interacting with nft lenging solana program

90 lines (89 loc) 5.14 kB
"use strict"; 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;