UNPKG

@symmetry-hq/baskets-sdk

Version:

Software Development Kit for interacting with Symmetry Baskets Program

181 lines (180 loc) 10.4 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createBasketIx = createBasketIx; exports.editBasketIx = editBasketIx; exports.editManagerIx = editManagerIx; exports.closeBasketIx = closeBasketIx; exports.setMetadataIx = setMetadataIx; exports.buyBasketIx = buyBasketIx; exports.claimTokensFromBuyStateIxs = claimTokensFromBuyStateIxs; exports.mintFromBuyStateIx = mintFromBuyStateIx; exports.buyBasketWithMultipleTokensIx = buyBasketWithMultipleTokensIx; exports.buyBasketWithSingleTokenIx = buyBasketWithSingleTokenIx; exports.sellBasketToSingleTokenIx = sellBasketToSingleTokenIx; exports.sellBasketIx = sellBasketIx; exports.claimTokensFromSellStateIxs = claimTokensFromSellStateIxs; exports.cronRebalanceBasketIxs = cronRebalanceBasketIxs; const web3_js_1 = require("@solana/web3.js"); const config_1 = require("./config"); const anchor_1 = require("@coral-xyz/anchor"); const nodewallet_1 = __importDefault(require("@coral-xyz/anchor/dist/cjs/nodewallet")); const basketsIDL_1 = require("./basketsIDL"); const utils_1 = require("./utils"); const basketState_1 = require("./basketState"); const buyState_1 = require("./buyState"); const instructionsBuilder_1 = require("./instructionsBuilder"); const flashRebalance_1 = require("./flashRebalance"); function loadSwbProgram(connection) { return __awaiter(this, void 0, void 0, function* () { let provider = new anchor_1.AnchorProvider(connection, new nodewallet_1.default(web3_js_1.Keypair.generate()), { skipPreflight: true, preflightCommitment: "recent", commitment: "processed", }); let swbIDL = (yield anchor_1.Program.fetchIdl(config_1.SWB_PID, provider)); return new anchor_1.Program(swbIDL, provider); }); } function loadProgram(connection) { let provider = new anchor_1.AnchorProvider(connection, new nodewallet_1.default(web3_js_1.Keypair.generate()), { skipPreflight: true, preflightCommitment: "recent", commitment: "processed", }); let program = new anchor_1.Program(basketsIDL_1.IDL, provider); return program; } function createBasketIx(connection, basketParams) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); return yield (0, instructionsBuilder_1.buildCreateBasketIx)(program, tokenList, basketParams); }); } function editBasketIx(connection, basket, basketParams) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildEditBasketIx)(program, tokenList, basketObj, basketParams); }); } function editManagerIx(connection, basket, newManager) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildEditManagetIx)(program, basketObj, newManager); }); } function closeBasketIx(connection, basket) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let basketState = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildCloseBasketIx)(program, basketState); }); } function setMetadataIx(connection_1, basket_1) { return __awaiter(this, arguments, void 0, function* (connection, basket, symbol = "", name = "", uri = "") { let program = loadProgram(connection); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildSetMetadataIx)(program, basketObj, { symbol: symbol, name: name, uri: uri }); }); } function buyBasketIx(connection, user, basket, amount) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildBuyBasketIx)(program, tokenList, user, basketObj, amount); }); } function claimTokensFromBuyStateIxs(connection, user, buyState) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let buyStateObj = yield buyState_1.BuyState.loadFromPubkey(program, buyState); let basketObj = buyStateObj.basket; return yield (0, instructionsBuilder_1.buildClaimTokensFromBuyStateIxs)(program, tokenList, user, basketObj, buyStateObj); }); } function mintFromBuyStateIx(connection, user, buyState) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let buyStateObj = yield buyState_1.BuyState.loadFromPubkey(program, buyState); let basketObj = buyStateObj.basket; return yield (0, instructionsBuilder_1.buildMintFromBuyStateIx)(program, tokenList, user, basketObj, buyStateObj); }); } function buyBasketWithMultipleTokensIx(connection, user, basket, contribution) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildBuyBasketWithMultipleTokensIx)(program, tokenList, user, basketObj, contribution); }); } function buyBasketWithSingleTokenIx(connection, user, basket, contributionToken, contributionAmount) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildBuyBasketWithSingleTokenIx)(program, tokenList, user, basketObj, contributionToken, contributionAmount); }); } function sellBasketToSingleTokenIx(connection, user, basket, withdrawToken, amount) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildSellBasketToSingleTokenIx)(program, tokenList, user, basketObj, withdrawToken, amount); }); } function sellBasketIx(connection, user, basket, amount, rebalance) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildSellBasketIx)(program, user, basketObj, amount, rebalance); }); } function claimTokensFromSellStateIxs(connection, user, basket) { return __awaiter(this, void 0, void 0, function* () { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basketObj = yield basketState_1.Basket.loadFromPubkey(program, basket); return yield (0, instructionsBuilder_1.buildClaimTokensFromSellStateIxs)(program, tokenList, user, basketObj); }); } function cronRebalanceBasketIxs(connection_1, user_1, basketAddress_1) { return __awaiter(this, arguments, void 0, function* (connection, user, basketAddress, jupAPIkey = "https://quote-api.jup.ag/v6/", lamports = 50000, updateOracles = true, maxAllowedAccounts = 45, softCap = 5, hardCap = 5000, underTokens = 3, overTokens = 3) { let program = loadProgram(connection); let tokenList = yield (0, utils_1.fetchTokenList)(program); let basket = yield basketState_1.Basket.loadFromPubkey(program, basketAddress); let swbProgram = yield loadSwbProgram(connection); let lookups = yield Promise.all([ (0, flashRebalance_1.getLookupTableAccount)(program.provider.connection, config_1.BASKETS_LOOKUP_TABLE_1), (0, flashRebalance_1.getLookupTableAccount)(program.provider.connection, config_1.BASKETS_LOOKUP_TABLE_2) ]); const [oraclePriceData, timestamp, updateOraclesTxData] = yield Promise.all([ (0, utils_1.getOraclePrices)(program, tokenList), (0, flashRebalance_1.getConfirmedTimestamp)(connection, basket), updateOracles ? (0, instructionsBuilder_1.updateOraclesTxs)(swbProgram, user, basket.getSwbFeeds(tokenList), 50000) : [] ]); const forceRebalance = (0, flashRebalance_1.isForceRebalanceNeeded)(basket, user); const rebalanceInfos = (0, flashRebalance_1.getSortedRebalanceInfo)(basket, oraclePriceData, timestamp, tokenList); const txsToSend = yield (0, flashRebalance_1.buildRebalanceTransactions)(basket, rebalanceInfos, oraclePriceData, forceRebalance, lookups, maxAllowedAccounts, user, connection, program, tokenList, lamports, updateOraclesTxData, softCap, hardCap, underTokens, overTokens, jupAPIkey); return txsToSend; }); }