@symmetry-hq/baskets-v2-sdk
Version:
Symmetry Baskets V2 SDK
288 lines (276 loc) • 8.48 kB
text/typescript
// Core dependencies
import { Program } from "@coral-xyz/anchor";
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
// Local imports
import { BasketsProgram } from "./idl/types";
import { createBasketIxs } from "./instructions/creator/createBasket";
import { getAccountInfos } from "./utils/programAccounts";
import { prepareV0Transactions, VersionedTxs } from "./utils/txUtils";
import { editBasketIx } from "./instructions/creator/editBasket";
import { validateOracle } from "./utils/oracle";
import { addNewTokenIx } from "./instructions/manager/addNewToken";
import { removeTokenIx } from "./instructions/manager/removeToken";
import { updateTokenWeightsIx } from "./instructions/manager/updateTokenWeights";
import { updatePythSponsoredFeedsIx } from "./instructions/oracleUpdate/updatePythSponsoredFeeds";
import { createPythSponsoredFeedsIxs } from "./instructions/oracleUpdate/createPythSponsoredFeeds";
import { addLamportsForAutomationIx } from "./instructions/manager/addLamportsForAutomation";
export interface CreateBasketParams {
basketType: number,
creatorDepositFeeBps: number,
creatorManagementFeeBps: number,
creatorPerformanceFeeBps: number,
host: PublicKey,
hostDepositFeeBps: number,
hostManagementFeeBps: number,
hostPerformanceFeeBps: number,
managers: PublicKey[],
managersWeightBps: number[],
managersAuthority: number[],
managersDepositFeeBps: number,
managersManagementFeeBps: number,
managersPerformanceFeeBps: number,
basketDepositFeeBps: number,
basketWithdrawFeeBps: number,
rebalanceIntervalSeconds: number,
rebalanceThresholdBps: number,
rebalanceSlippageBps: number,
lpThresholdBps: number,
allowAutomation: boolean,
allowLp: boolean,
name: string,
symbol: string,
uri: string,
}
export interface EditBasketParams extends CreateBasketParams {
basket: PublicKey,
}
export async function createBasketHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: CreateBasketParams,
basketKeypair: Keypair,
): Promise<VersionedTxs>{
const ixs = await createBasketIxs({
...params,
basketKeypair: basketKeypair,
creator: sdkParams.payer,
program: sdkParams.program,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [ixs],
multipleLookupTableAddresses: [[]],
signers: [[basketKeypair]],
batches: [1],
});
}
export async function editBasketSettingsHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: EditBasketParams,
): Promise<VersionedTxs> {
const ix = await editBasketIx({
...params,
creator: sdkParams.payer,
program: sdkParams.program,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [[ix]],
multipleLookupTableAddresses: [[]],
signers: [[]],
batches: [1],
});
}
export async function addLamportsForAutomationHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: {
basket: PublicKey;
amount: number;
},
): Promise<VersionedTxs> {
const ix = await addLamportsForAutomationIx({
program: sdkParams.program,
basket: params.basket,
manager: sdkParams.payer,
amount: params.amount,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [[ix]],
multipleLookupTableAddresses: [[]],
signers: [[]],
batches: [1],
});
}
export async function addNewTokenHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: {
basket: PublicKey;
token: PublicKey;
tokenWeight: number;
oracleType: number;
oraclePool: PublicKey;
oracle1: PublicKey;
oracle2: PublicKey;
},
): Promise<VersionedTxs> {
const accountInfos = await getAccountInfos(
sdkParams.connection,
[ params.token, params.oraclePool ],
);
const validation = validateOracle(
sdkParams.program,
params.token, //@ts-ignore
accountInfos[0],
accountInfos[1],
params.oracleType,
params.oracle1,
params.oracle2,
);
if (validation != "OK")
throw new Error("Error: " + validation);
const ix = await addNewTokenIx({
program: sdkParams.program,
manager: sdkParams.payer,
...params,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [[ix]],
multipleLookupTableAddresses: [[]],
signers: [[]],
batches: [1],
});
}
export async function removeTokenHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: {
basket: PublicKey;
token: PublicKey;
},
): Promise<VersionedTxs> {
const ix = await removeTokenIx({
program: sdkParams.program,
manager: sdkParams.payer,
...params,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [[ix]],
multipleLookupTableAddresses: [[]],
signers: [[]],
batches: [1],
});
}
export async function updateTokenWeightsHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: {
basket: PublicKey;
tokenWeights: number[];
writeVersion: number;
},
): Promise<VersionedTxs> {
const ix = await updateTokenWeightsIx({
program: sdkParams.program,
manager: sdkParams.payer,
...params,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [[ix]],
multipleLookupTableAddresses: [[]],
signers: [[]],
batches: [1],
});
}
export async function createPythSponsoredFeedsHandler(sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
}): Promise<VersionedTxs> {
const pythSponsoredFeedsKeypair = Keypair.generate();
const ixs = await createPythSponsoredFeedsIxs({
program: sdkParams.program,
payer: sdkParams.payer,
pythSponsoredFeeds: pythSponsoredFeedsKeypair.publicKey,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [ixs],
multipleLookupTableAddresses: [[]],
signers: [[pythSponsoredFeedsKeypair]],
batches: [1],
});
}
export async function updatePythSponsoredFeedsHandler(
sdkParams: {
payer: PublicKey,
connection: Connection,
program: Program<BasketsProgram>,
priorityFee: number,
},
params: {
tokenMint: PublicKey;
feedAccount: PublicKey;
isActive: boolean;
},
): Promise<VersionedTxs> {
const ix = await updatePythSponsoredFeedsIx({
program: sdkParams.program,
payer: sdkParams.payer,
...params,
});
return await prepareV0Transactions({
connection: sdkParams.connection,
payer: sdkParams.payer,
priorityFee: sdkParams.priorityFee,
multipleIxs: [[ix]],
multipleLookupTableAddresses: [[]],
signers: [[]],
batches: [1],
});
}