@symmetry-hq/baskets-v2-sdk
Version:
Symmetry Baskets V2 SDK
78 lines (77 loc) • 3.56 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.getQuoteResponseHandler = getQuoteResponseHandler;
exports.processInstruction = processInstruction;
exports.generateSwapInstruction = generateSwapInstruction;
const web3_js_1 = require("@solana/web3.js");
const axios_1 = __importDefault(require("axios"));
/**
* Gets a quote from Jupiter for swapping tokens
*/
function getQuoteResponseHandler(quoteParams) {
return __awaiter(this, void 0, void 0, function* () {
// Build URL with required parameters
const baseRequestURL = `${quoteParams.jupiterApiKey}quote?` +
`inputMint=${quoteParams.fromToken.toBase58()}&` +
`outputMint=${quoteParams.toToken.toBase58()}&` +
`amount=${quoteParams.amount}&` +
`slippageBps=${quoteParams.slippageBps}`;
// Add maxAccounts if not using default 64
const requestURL = quoteParams.maxAllowedAccounts !== 64
? `${baseRequestURL}&maxAccounts=${quoteParams.maxAllowedAccounts}`
: baseRequestURL;
try {
const response = yield axios_1.default.get(requestURL);
return response.data;
}
catch (error) {
//@ts-ignore
console.log("Jupiter quote error on:", baseRequestURL, error.message);
return { data: null };
}
});
}
/**
* Converts Jupiter instruction format to Solana TransactionInstruction
*/
function processInstruction(instruction) {
return {
programId: new web3_js_1.PublicKey(instruction.programId),
keys: instruction.accounts.map((a) => (Object.assign(Object.assign({}, a), { pubkey: new web3_js_1.PublicKey(a.pubkey) }))),
data: Buffer.from(instruction.data, "base64")
};
}
/**
* Generates a swap instruction using Jupiter
*/
function generateSwapInstruction(quoteParams) {
return __awaiter(this, void 0, void 0, function* () {
const { payer, jupiterApiKey, quoteResponse, } = quoteParams;
// Get swap instructions from Jupiter API
const rawResponse = yield axios_1.default.post(`${jupiterApiKey}swap-instructions`, {
quoteResponse: quoteResponse,
userPublicKey: payer.toBase58(),
wrapAndUnwrapSol: false,
}, { headers: { 'Content-Type': 'application/json' } }).catch((e) => {
// console.log(e.message, quoteResponse);
throw new Error("Jupiter swap instructions error");
});
const instructions = rawResponse.data;
return {
ix: processInstruction(instructions.swapInstruction),
luts: instructions.addressLookupTableAddresses.map((a) => new web3_js_1.PublicKey(a)),
};
});
}