@unloc-xyz/unloc-sdk
Version:
139 lines • 5.93 kB
JavaScript
import * as anchor from "@project-serum/anchor";
import { BUYBACK_PID, UNLOC_MINT, USDC_MINT, WSOL_MINT, } from "./../global-config";
import { defaults, pda, SOLANA_CONNECTION } from "./../utils";
import { IDL } from "../types/unloc_burn";
import { Liquidity, SERUM_PROGRAM_ID_V3 } from "@raydium-io/raydium-sdk";
import { getAssociatedPoolKeys, getMarket, getVaultOwnerAndNonce } from "./buyback-utils";
export const BUYBACK_GLOBAL_STATE_SEED = Buffer.from("GLOBAL_STATE_SEED");
export const UNLOC_VAULT_SEED = Buffer.from("UNLOC_VAULT_SEED");
export const WSOL_VAULT_SEED = Buffer.from("WSOL_VAULT_SEED");
export const USDC_VAULT_SEED = Buffer.from("USDC_VAULT_SEED");
export let buybackProgram = null;
export let buybackProgramProvider = null;
export let buybackProgramId = null;
export const initBuybackProgram = (wallet, connection = SOLANA_CONNECTION, pid = BUYBACK_PID) => {
if (buybackProgram != null) {
return;
}
buybackProgramId = pid;
// const provider = new anchor.Provider(connection, wallet, anchor.Provider.defaultOptions())
const provider = new anchor.AnchorProvider(connection, wallet, {
skipPreflight: true,
});
buybackProgramProvider = provider;
// Generate the program client from IDL.
buybackProgram = new anchor.Program(IDL, buybackProgramId, provider);
};
export const getUnlocVaultKey = async () => {
const unlocVault = await pda([UNLOC_VAULT_SEED], buybackProgramId);
return unlocVault;
};
export const getUsdcVaultKey = async () => {
const usdcVault = await pda([USDC_VAULT_SEED], buybackProgramId);
return usdcVault;
};
export const getWsolVaultKey = async () => {
const wsolVault = await pda([WSOL_VAULT_SEED], buybackProgramId);
return wsolVault;
};
export const setBuybackGlobalState = async (newAuthority, amm, serumMarket, ammProgram = Liquidity.getProgramId(4), serumProgram = SERUM_PROGRAM_ID_V3, signer = buybackProgramProvider.wallet.publicKey, signers = []) => {
const globalState = await pda([BUYBACK_GLOBAL_STATE_SEED], buybackProgramId);
const unlocVault = await pda([UNLOC_VAULT_SEED], buybackProgramId);
const usdcVault = await pda([USDC_VAULT_SEED], buybackProgramId);
const wsolVault = await pda([WSOL_VAULT_SEED], buybackProgramId);
const superOwner = signer;
const tx = await buybackProgram.rpc.setGlobalState(newAuthority, {
accounts: {
authority: superOwner,
globalState,
unlocMint: UNLOC_MINT,
unlocVault,
usdcMint: USDC_MINT,
usdcVault,
wsolMint: WSOL_MINT,
wsolVault,
ammProgram,
amm,
serumProgram,
serumMarket,
...defaults,
},
signers,
});
// eslint-disable-next-line no-console
console.log("setGlobalState tx = ", tx);
};
// backend api will call this function regularly
export const burn = async () => {
const globalState = await pda([BUYBACK_GLOBAL_STATE_SEED], buybackProgramId);
const unlocVault = await pda([UNLOC_VAULT_SEED], buybackProgramId);
const tx = await buybackProgram.rpc.burn({
accounts: {
globalState,
unlocMint: UNLOC_MINT,
unlocVault,
...defaults,
},
});
// eslint-disable-next-line no-console
console.log("setGlobalState tx = ", tx);
};
// backend api will call this function regularly
export const buyback = async (ammProgram = Liquidity.getProgramId(4), serumProgram = SERUM_PROGRAM_ID_V3) => {
const globalState = await pda([BUYBACK_GLOBAL_STATE_SEED], buybackProgramId);
const globalStateData = await buybackProgram.account.globalState.fetch(globalState);
const amm = globalStateData.amm;
const serumMarket = globalStateData.serumMarket;
const market = await getMarket(buybackProgram.provider.connection, serumMarket.toBase58(), serumProgram.toBase58());
const poolKeys = await getAssociatedPoolKeys({
programId: ammProgram,
serumProgramId: serumProgram,
marketId: market.address,
baseMint: market.baseMint,
quoteMint: market.quoteMint
});
const ammAuthority = poolKeys.authority;
const poolCoinTokenAccount = poolKeys.baseVault;
const poolPcTokenAccount = poolKeys.quoteVault;
const ammTargetOrders = poolKeys.targetOrders;
const ammOpenOrders = poolKeys.openOrders;
const serumBids = market.bids;
const serumAsks = market.asks;
const serumEventQueue = market.eventQueue;
const serumCoinVaultAccount = market.baseVault;
const serumPcVaultAccount = market.quoteVault;
const vaultOwnerData = await getVaultOwnerAndNonce(market.address, serumProgram);
const serumVaultSigner = vaultOwnerData.vaultOwner;
const unlocVault = await pda([UNLOC_VAULT_SEED], buybackProgramId);
const usdcVault = await pda([USDC_VAULT_SEED], buybackProgramId);
const tx = await buybackProgram.rpc.buyback({
accounts: {
globalState,
ammProgram,
amm,
ammAuthority,
ammOpenOrders,
ammTargetOrders,
poolCoinTokenAccount,
poolPcTokenAccount,
serumProgram,
serumMarket,
serumBids,
serumAsks,
serumEventQueue,
serumCoinVaultAccount,
serumPcVaultAccount,
serumVaultSigner,
userSourceTokenAccount: usdcVault,
userDestinationTokenAccount: unlocVault,
splTokenProgram: defaults.tokenProgram,
},
});
// eslint-disable-next-line no-console
console.log("setGlobalState tx = ", tx);
};
export const getBuybackGlobalState = async () => {
const globalState = await pda([BUYBACK_GLOBAL_STATE_SEED], buybackProgramId);
return await buybackProgram.account.globalState.fetch(globalState);
};
//# sourceMappingURL=index.js.map