UNPKG

@unloc-xyz/unloc-sdk

Version:
139 lines 5.93 kB
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