UNPKG

@frakt-protocol/frakt-sdk

Version:

Frakt SDK for interacting with frakt.xyz protocols

142 lines (141 loc) 7.38 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.createProposeLoan = exports.createProposeLoans = void 0; const anchor_1 = require("@project-serum/anchor"); const lodash_1 = require("lodash"); const constants_1 = require("../../common/constants"); const proposeLoan_1 = require("../functions/public/proposeLoan"); const constants_2 = require("./constants"); const createProposeLoansTxns = ({ programPublicKey, adminPublicKey, connection, walletPublicKey, bulkNfts, }) => __awaiter(void 0, void 0, void 0, function* () { const ixnsAndSigners = yield Promise.all(bulkNfts.map((bulkNft) => __awaiter(void 0, void 0, void 0, function* () { const { mint, valuation, isPriceBased, priceBased, solLoanValue } = bulkNft; const valuationNumber = parseFloat(valuation); const suggestedLoanValue = (priceBased === null || priceBased === void 0 ? void 0 : priceBased.suggestedLoanValue) || 0; const suggestedLtvPersent = (suggestedLoanValue / valuationNumber) * 100; const rawLoanToValue = (solLoanValue / valuationNumber) * 100; const proposedNftPrice = valuationNumber * Math.pow(10, constants_1.SOL_TOKEN.decimals); const loanToValue = rawLoanToValue || suggestedLtvPersent; const { ixs, loan } = yield (0, proposeLoan_1.proposeLoanIx)({ programId: programPublicKey, connection, user: walletPublicKey, nftMint: new anchor_1.web3.PublicKey(mint), proposedNftPrice: new anchor_1.BN(proposedNftPrice), isPriceBased: !!isPriceBased, loanToValue: new anchor_1.BN(loanToValue * 100), admin: adminPublicKey, }); return { instructions: ixs, signer: loan, }; }))); const txnsAndSigners = (0, lodash_1.chunk)(ixnsAndSigners, constants_2.PROPOSE_LOAN_IXS_PER_TXN).map((ixnsAndSigners) => ({ transaction: new anchor_1.web3.Transaction().add(...ixnsAndSigners.map(({ instructions }) => instructions)), signers: ixnsAndSigners.map(({ signer }) => signer), })); return txnsAndSigners; }); const createProposeLoanTxn = ({ programPublicKey, adminPublicKey, connection, walletPublicKey, nftMint, valuation, ltv, isPriceBased = false, }) => __awaiter(void 0, void 0, void 0, function* () { const { ixs, loan } = yield (0, proposeLoan_1.proposeLoanIx)({ programId: new anchor_1.web3.PublicKey(programPublicKey), connection, user: walletPublicKey, nftMint: new anchor_1.web3.PublicKey(nftMint), proposedNftPrice: new anchor_1.BN(valuation * Math.pow(10, constants_1.SOL_TOKEN.decimals)), isPriceBased, loanToValue: new anchor_1.BN(ltv * 100), admin: new anchor_1.web3.PublicKey(adminPublicKey), }); return { transaction: new anchor_1.web3.Transaction().add(ixs[0]).add(ixs[1]), signers: [loan], }; }); const signAndSendTransaction = ({ txnAndSigners, connection, wallet, commitment = 'finalized', onBeforeApprove, onAfterSend, }) => __awaiter(void 0, void 0, void 0, function* () { var _a; onBeforeApprove === null || onBeforeApprove === void 0 ? void 0 : onBeforeApprove(); const { transaction } = txnAndSigners; const { blockhash, lastValidBlockHeight } = yield connection.getLatestBlockhash(); transaction.recentBlockhash = blockhash; transaction.feePayer = wallet.publicKey; if ((_a = txnAndSigners === null || txnAndSigners === void 0 ? void 0 : txnAndSigners.signers) === null || _a === void 0 ? void 0 : _a.length) { transaction.sign(...txnAndSigners.signers); } const signedTransaction = yield wallet.signTransaction(transaction); const signature = yield connection.sendRawTransaction(signedTransaction.serialize(), { skipPreflight: false }); onAfterSend === null || onAfterSend === void 0 ? void 0 : onAfterSend(); return yield connection.confirmTransaction({ signature, blockhash, lastValidBlockHeight, }, commitment); }); const signAndSendAllTransactions = ({ txnAndSignersArray, connection, wallet, commitment = 'finalized', onBeforeApprove, onAfterSend, }) => __awaiter(void 0, void 0, void 0, function* () { onBeforeApprove === null || onBeforeApprove === void 0 ? void 0 : onBeforeApprove(); const { blockhash, lastValidBlockHeight } = yield connection.getLatestBlockhash(); const transactions = txnAndSignersArray.map(({ transaction, signers = [] }) => { transaction.recentBlockhash = blockhash; transaction.feePayer = wallet.publicKey; if (signers.length) { transaction.sign(...signers); } return transaction; }); const signedTransactions = yield wallet.signAllTransactions(transactions); const txnSignatures = yield Promise.all(signedTransactions.map((txn) => connection.sendRawTransaction(txn.serialize(), { skipPreflight: false, }))); onAfterSend === null || onAfterSend === void 0 ? void 0 : onAfterSend(); return yield Promise.allSettled(txnSignatures.map((signature) => connection.confirmTransaction({ signature, blockhash, lastValidBlockHeight, }, commitment))); }); const createProposeLoans = ({ programPublicKey, adminPublicKey }) => ({ bulkNfts, connection, wallet, onAfterSend, onBeforeApprove }) => __awaiter(void 0, void 0, void 0, function* () { const txnAndSignersArray = yield createProposeLoansTxns({ programPublicKey: new anchor_1.web3.PublicKey(programPublicKey), adminPublicKey: new anchor_1.web3.PublicKey(adminPublicKey), connection, walletPublicKey: wallet.publicKey, bulkNfts, }); return yield signAndSendAllTransactions({ txnAndSignersArray, connection, wallet, onAfterSend, onBeforeApprove, }); }); exports.createProposeLoans = createProposeLoans; const createProposeLoan = ({ programPublicKey, adminPublicKey }) => ({ connection, wallet, nftMint, valuation, ltv, isPriceBased, onAfterSend, onBeforeApprove }) => __awaiter(void 0, void 0, void 0, function* () { const txnAndSigners = yield createProposeLoanTxn({ programPublicKey: new anchor_1.web3.PublicKey(programPublicKey), adminPublicKey: new anchor_1.web3.PublicKey(adminPublicKey), connection, walletPublicKey: wallet.publicKey, nftMint, valuation, ltv, isPriceBased, }); return yield signAndSendTransaction({ txnAndSigners, connection, wallet, onAfterSend, onBeforeApprove, }); }); exports.createProposeLoan = createProposeLoan;