@symmetry-hq/baskets-v2-sdk
Version:
Symmetry Baskets V2 SDK
265 lines (264 loc) • 13.3 kB
JavaScript
"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;