import { utils } from "@coral-xyz/anchor"; import { PublicKey } from "@solana/web3.js"; import BN from "bn.js"; export interface PDAInfo { key: PublicKey; bump: number; } export class PDA { readonly programId: PublicKey; public constructor(programId: PublicKey) { this.programId = programId; } config = (): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("config")], this.programId ); return { key: pda, bump, } } treasury = (): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("treasury")], this.programId ); return { key: pda, bump, } } flexibleStakingAccount = (user: PublicKey): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("flexible_staking_account"), user.toBuffer()], this.programId ); return { key: pda, bump, } } flexibleStakingAccountV2 = (mint: PublicKey, user: PublicKey): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("flexible_staking_account"), mint.toBuffer(), user.toBuffer()], this.programId ); return { key: pda, bump, } } flexibleVault = (): PDAInfo => { const config = this.config().key; const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("flexible_vault"), config.toBuffer()], this.programId ); return { key: pda, bump, } } flexibleVaultV2 = (mint: PublicKey): PDAInfo => { const config = this.config().key; const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("flexible_vault"), config.toBuffer(), mint.toBuffer()], this.programId ); return { key: pda, bump, } } user = (user: PublicKey): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("user"), user.toBuffer()], this.programId ); return { key: pda, bump, } } userV2 = (mint: PublicKey, user: PublicKey): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("user"), mint.toBuffer(), user.toBuffer()], this.programId ); return { key: pda, bump, } } lockupStakingAccount = (user: PublicKey, index: BN, vaultIndex: BN, mint?: PublicKey): PDAInfo => { const lockupVault = mint ? this.lockupVaultV2(mint, vaultIndex).key : this.lockupVault(vaultIndex).key; const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("lockup_staking_account"), user.toBuffer(), lockupVault.toBuffer(), Buffer.from(index.toArray("le", 4))], this.programId ); return { key: pda, bump, } } lockupVault = (index: BN): PDAInfo => { const config = this.config().key; const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("lockup_vault"), config.toBuffer(), Buffer.from(index.toArray("le", 2))], this.programId ); return { key: pda, bump, } } lockupVaultV2 = (mint: PublicKey, index: BN): PDAInfo => { const config = this.config().key; const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("lockup_vault"), config.toBuffer(), mint.toBuffer(), Buffer.from(index.toArray("le", 2))], this.programId ); return { key: pda, bump, } } withdrawPosition = (user: PublicKey, index: BN): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("withdraw_position"), user.toBuffer(), Buffer.from(index.toArray("le", 4))], this.programId ); return { key: pda, bump, } } withdrawPositionV2 = (mint: PublicKey, user: PublicKey, index: BN): PDAInfo => { const [pda, bump] = PublicKey.findProgramAddressSync( [utils.bytes.utf8.encode("withdraw_position"), mint.toBuffer(), user.toBuffer(), Buffer.from(index.toArray("le", 4))], this.programId ); return { key: pda, bump, } } }