UNPKG

@symmetry-hq/baskets-v2-sdk

Version:

Symmetry Baskets V2 SDK

265 lines (264 loc) 13.3 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.BasketsSDK = void 0; const web3_js_1 = require("@solana/web3.js"); // Local imports const constants_1 = require("./utils/constants"); const programAccounts_1 = require("./utils/programAccounts"); const basketManager_1 = require("./basketManager"); const basketTrade_1 = require("./basketTrade"); const basketRebalance_1 = require("./basketRebalance"); const jup_1 = require("./instructions/jup"); const basket_1 = require("./state/basket"); const txUtils_1 = require("./utils/txUtils"); const withdrawState_1 = require("./state/withdrawState"); const metadataUtils_1 = require("./utils/metadataUtils"); const oracle_1 = require("./utils/oracle"); const events_1 = require("./utils/events"); class BasketsSDK { constructor(params) { var _a, _b, _c, _d; this.sdkParams = { connection: params.connection, payer: (_a = params.payer) !== null && _a !== void 0 ? _a : web3_js_1.Keypair.generate().publicKey, program: (0, programAccounts_1.getBasketsProgram)(params.connection), priorityFee: (_b = params.priorityFee) !== null && _b !== void 0 ? _b : constants_1.PRIORITY_FEE, jupiterApiKey: (_c = params.jupiterApiKey) !== null && _c !== void 0 ? _c : constants_1.JUPITER_API_KEY, maxAllowedAccounts: (_d = params.maxAllowedAccounts) !== null && _d !== void 0 ? _d : constants_1.MAX_JUPITER_ACCOUNTS, }; } setPayer(payer) { return __awaiter(this, void 0, void 0, function* () { this.sdkParams.payer = payer; }); } createBasket(params) { return __awaiter(this, void 0, void 0, function* () { const basketKeypair = web3_js_1.Keypair.generate(); return Object.assign(Object.assign({}, (yield (0, basketManager_1.createBasketHandler)(this.sdkParams, params, basketKeypair))), { address: basketKeypair.publicKey }); }); } editBasketSettings(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.editBasketSettingsHandler)(this.sdkParams, params); }); } addLamportsForAutomation(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.addLamportsForAutomationHandler)(this.sdkParams, params); }); } findPoolsForToken(params) { return __awaiter(this, void 0, void 0, function* () { const oracleAccounts = [ constants_1.PYTHNET_CUSTODY_PRICE_USDC_ACCOUNT, constants_1.PYTHNET_CUSTODY_PRICE_SOL_ACCOUNT, ]; const oracleAccountInfos = yield (0, programAccounts_1.getAccountInfos)(this.sdkParams.connection, oracleAccounts); const usdcPrice = (0, oracle_1.loadOraclePrice)(constants_1.USDC_DECIMALS, oracle_1.OracleType.Pyth, oracleAccountInfos[0], null, 0, 0, 0).avgPrice; const solPrice = (0, oracle_1.loadOraclePrice)(constants_1.WSOL_DECIMALS, oracle_1.OracleType.Pyth, oracleAccountInfos[1], null, 0, 0, 0).avgPrice; const raydiumV4Pools = yield (0, programAccounts_1.getRaydiumV4Pools)(this.sdkParams.connection, params.token, usdcPrice, solPrice); const raydiumCpmmPools = yield (0, programAccounts_1.getRaydiumCpmmPools)(this.sdkParams.connection, params.token, usdcPrice, solPrice); const pythSponsoredFeeds = yield (0, programAccounts_1.getPythSponsoredFeeds)(this.sdkParams.program, params.token); const allPools = [...raydiumV4Pools, ...raydiumCpmmPools, ...pythSponsoredFeeds]; allPools.sort((a, b) => b.liquidity - a.liquidity); return allPools; }); } createPythSponsoredFeed() { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.createPythSponsoredFeedsHandler)(this.sdkParams); }); } updatePythSponsoredFeed(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.updatePythSponsoredFeedsHandler)(this.sdkParams, params); }); } addNewToken(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.addNewTokenHandler)(this.sdkParams, params); }); } removeToken(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.removeTokenHandler)(this.sdkParams, params); }); } updateTokenWeights(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketManager_1.updateTokenWeightsHandler)(this.sdkParams, params); }); } buyBasketBackend(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketTrade_1.buyBasketHandler)(this.sdkParams, params); }); } buyBasket(params) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`https://api.symmetry.fi/baskets/v2/tx/buy` + `?payer=${this.sdkParams.payer.toBase58()}` + `&basket=${params.basket.toBase58()}` + `&depositMint=${params.depositMint.toBase58()}` + `&depositAmount=${params.depositAmount}` + `&priorityFee=${this.sdkParams.priorityFee}`); const data = yield response.json(); if (data.error) throw new Error(data.error); const { blockhash, lastValidBlockHeight, versionedTxs: rawTxs, batches } = data; const versionedTxs = rawTxs.map((tx) => web3_js_1.VersionedTransaction.deserialize(Uint8Array.from(Buffer.from(tx, "base64")))); return { blockhash, lastValidBlockHeight, versionedTxs, batches, }; }); } sellBasketBackend(params) { return __awaiter(this, void 0, void 0, function* () { const withdrawStateSeed = (0, programAccounts_1.getRandomSeed)(); const address = (0, programAccounts_1.getWithdrawStateAccount)(withdrawStateSeed); return Object.assign(Object.assign({}, (yield (0, basketTrade_1.sellBasketHandler)(this.sdkParams, Object.assign(Object.assign({}, params), { withdrawStateSeed })))), { address }); }); } sellBasket(params) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(`https://api.symmetry.fi/baskets/v2/tx/sell` + `?payer=${this.sdkParams.payer.toBase58()}` + `&basket=${params.basket.toBase58()}` + `&amountToWithdraw=${params.amountToWithdraw}` + `&destinationMint=${params.destinationMint.toBase58()}` + `&rebalance=${params.rebalance}` + `&priorityFee=${this.sdkParams.priorityFee}`); const data = yield response.json(); if (data.error) throw new Error(data.error); const { address, blockhash, lastValidBlockHeight, versionedTxs: rawTxs, batches } = data; const versionedTxs = rawTxs.map((tx) => web3_js_1.VersionedTransaction.deserialize(Uint8Array.from(Buffer.from(tx, "base64")))); return { blockhash, lastValidBlockHeight, versionedTxs, batches, address, }; }); } rebalanceSellState(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketTrade_1.sellRebalanceHandler)(this.sdkParams, params); }); } claimTokens(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketTrade_1.claimTokensHandler)(this.sdkParams, params); }); } generateSwapQuote(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, jup_1.getQuoteResponseHandler)(Object.assign({ jupiterApiKey: this.sdkParams.jupiterApiKey, maxAllowedAccounts: this.sdkParams.maxAllowedAccounts }, params)); }); } swapTokens(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketRebalance_1.swapTokensHandler)(this.sdkParams, params); }); } rebalanceBasketTokensBackend(params) { return __awaiter(this, void 0, void 0, function* () { return yield (0, basketRebalance_1.rebalanceBasketTokensHandler)(this.sdkParams, params); }); } rebalanceBasketTokens(params) { return __awaiter(this, void 0, void 0, function* () { let str = `https://api.symmetry.fi/baskets/v2/tx/rebalance` + `?payer=${this.sdkParams.payer.toBase58()}` + `&basket=${params.basket.toBase58()}` + `&priorityFee=${this.sdkParams.priorityFee}`; if (params.fromToken) str += `&fromToken=${params.fromToken.toBase58()}`; if (params.toToken) str += `&toToken=${params.toToken.toBase58()}`; if (params.minSwapValue) str += `&minSwapValue=${params.minSwapValue}`; if (params.maxSellValuePerToken) str += `&maxSellValuePerToken=${params.maxSellValuePerToken}`; if (params.maxNumberOfSwaps) str += `&maxNumberOfSwaps=${params.maxNumberOfSwaps}`; const response = yield fetch(str); const data = yield response.json(); if (data.error) throw new Error(data.error); const { blockhash, lastValidBlockHeight, versionedTxs: rawTxs, batches } = data; const versionedTxs = rawTxs.map((tx) => web3_js_1.VersionedTransaction.deserialize(Uint8Array.from(Buffer.from(tx, "base64")))); return { blockhash, lastValidBlockHeight, versionedTxs, batches, }; }); } getBasket(params) { return __awaiter(this, void 0, void 0, function* () { const basketState = yield (0, basket_1.fetchBasketState)(this.sdkParams.program, params.basket); const metadata = yield (0, metadataUtils_1.parseMetadata)(this.sdkParams.connection, basketState.metadataAccount); let tvl = null, tokenValues = null; if (params.requestTvl) ({ tvl, tokenValues } = yield (0, basket_1.getBasketTvl)(this.sdkParams.program, basketState)); return Object.assign(Object.assign({}, (0, basket_1.parseBasketState)(basketState)), { metadata: metadata, tokenValues: tokenValues, tvl: tvl }); }); } getWithdrawState(params) { return __awaiter(this, void 0, void 0, function* () { const withdrawStateData = yield (0, withdrawState_1.fetchWithdrawState)(this.sdkParams.program, params.withdrawState); return (0, withdrawState_1.parseWithdrawState)(withdrawStateData); }); } getAllBaskets() { return __awaiter(this, void 0, void 0, function* () { return yield (0, programAccounts_1.getAllBaskets)(this.sdkParams.program); }); } getBasketsByCreator(creator) { return __awaiter(this, void 0, void 0, function* () { return yield (0, programAccounts_1.getBasketsByCreator)(this.sdkParams.program, creator); }); } getWithdrawStatesByUser(user) { return __awaiter(this, void 0, void 0, function* () { return yield (0, programAccounts_1.getWithdrawStatesByUser)(this.sdkParams.program, user); }); } sendSignedVersionedTxs(txs_1) { return __awaiter(this, arguments, void 0, function* (txs, simulateTransactions = false) { return yield (0, txUtils_1.sendV0Transactions)(this.sdkParams.connection, txs, simulateTransactions); }); } addSwapListener(callback) { return this.sdkParams.program.addEventListener("rebalance", (event, slot, signature) => { let processedEvent = (0, events_1.parseRebalanceEvent)(event); try { callback(processedEvent, slot, signature); } catch (e) { console.log(e.message); } }); } removeEventListener(id) { this.sdkParams.program.removeEventListener(id); } } exports.BasketsSDK = BasketsSDK;