@symmetry-hq/baskets-sdk
Version:
Software Development Kit for interacting with Symmetry Baskets Program
181 lines (180 loc) • 10.4 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.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;
});
}