@frakt-protocol/frakt-sdk
Version:
Frakt SDK for interacting with frakt.xyz protocols
142 lines (141 loc) • 7.38 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.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;