fbonds-core
Version:
Banx protocol sdk
106 lines (105 loc) • 4.97 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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fetchTokenOffers = fetchTokenOffers;
exports.fetchTokenPriceVsCollateral = fetchTokenPriceVsCollateral;
exports.fetchTokenDecimals = fetchTokenDecimals;
exports.fetchUserVaults = fetchUserVaults;
const types_1 = require("../types");
const utils_1 = require("./utils");
const anchor_1 = require("@coral-xyz/anchor");
const bs58_1 = __importDefault(require("bs58"));
const lodash_1 = require("lodash");
const solana_transactions_parser_1 = require("solana-transactions-parser");
function fetchTokenOffers(_a) {
return __awaiter(this, arguments, void 0, function* ({ program, market, bondingCurveType, }) {
const rawAccounts = yield program.account.bondOfferV3.all([
{
memcmp: {
offset: 8,
bytes: market.toBase58(),
},
},
{
memcmp: {
offset: 8 + 32,
bytes: bs58_1.default.encode(
//? Fetch only active offers
new anchor_1.BN((0, utils_1.getEnumIndex)(types_1.PairState, types_1.PairState.PerpetualBondingCurveOnMarket)).toBuffer()),
},
},
{
memcmp: {
offset: 8 + 32 + 1 + 8,
bytes: bs58_1.default.encode(new anchor_1.BN((0, utils_1.getEnumIndex)(types_1.BondingCurveType, bondingCurveType)).toBuffer()),
},
},
]);
return ((0, lodash_1.chain)(rawAccounts)
.map((rawAccount) => (0, solana_transactions_parser_1.parseEnumsInAccount)(Object.assign({ publicKey: rawAccount.publicKey }, rawAccount.account)))
//? Just to make sure. Filter only token offers.
.filter(({ validation }) => validation.bondFeatures === types_1.BondFeatures.AutoReceiveAndReceiveSpl)
.value());
});
}
function fetchTokenPriceVsCollateral(_a) {
return __awaiter(this, arguments, void 0, function* ({ connection, tokenTicker, collateralTicker, }) {
try {
const response = yield fetch(`https://price.jup.ag/v6/price?ids=${tokenTicker}&vsToken=${collateralTicker}`);
const { data } = (yield response.json());
const { price, vsToken } = data[tokenTicker];
const { value: { decimals: collateralDecimals }, } = yield connection.getTokenSupply(new anchor_1.web3.PublicKey(vsToken));
return new anchor_1.BN(price * Math.pow(10, collateralDecimals));
}
catch (error) {
console.error(error);
throw new Error('Failed to fetch token price');
}
});
}
function fetchTokenDecimals(mint, connection) {
return __awaiter(this, void 0, void 0, function* () {
try {
const { value: { decimals }, } = yield connection.getTokenSupply(mint);
return decimals;
}
catch (error) {
console.error(error);
throw new Error('Failed to fetch token decimals');
}
});
}
function fetchUserVaults(_a) {
return __awaiter(this, arguments, void 0, function* ({ program, lendingTokenType }) {
const rawAccounts = yield program.account.userVault.all([
{
memcmp: {
offset: 8,
bytes: bs58_1.default.encode(
//? Fetch only active UserVaults
new anchor_1.BN((0, utils_1.getEnumIndex)(types_1.UserVaultState, types_1.UserVaultState.Active)).toBuffer()),
},
},
{
memcmp: {
offset: 8 + 1 + 32,
bytes: bs58_1.default.encode(new anchor_1.BN((0, utils_1.getEnumIndex)(types_1.LendingTokenType, lendingTokenType)).toBuffer()),
},
},
]);
return (0, lodash_1.chain)(rawAccounts)
.map((rawAccount) => (0, solana_transactions_parser_1.parseEnumsInAccount)(Object.assign({ publicKey: rawAccount.publicKey }, rawAccount.account)))
.value();
});
}