import { BN } from '@coral-xyz/anchor' import { Mint } from '@solana/spl-token' import { PublicKey } from '@solana/web3.js' import { VsrClient } from '../voteStakeRegistryClient' export type TokenProgramAccount = { publicKey: PublicKey account: T } export interface Voter { deposits: Deposit[] voterAuthority: PublicKey registrar: PublicKey //there are more fields but no use for them on ui yet } export interface votingMint { baselineVoteWeightScaledFactor: BN digitShift: number grantAuthority: PublicKey lockupSaturationSecs: BN maxExtraLockupVoteWeightScaledFactor: BN mint: PublicKey } export type LockupType = 'none' | 'monthly' | 'cliff' | 'constant' | 'daily' export interface Registrar { governanceProgramId: PublicKey realm: PublicKey realmAuthority: PublicKey realmGoverningTokenMint: PublicKey votingMints: votingMint[] //there are more fields but no use for them on ui yet } interface LockupKind { none: object daily: object monthly: object cliff: object constant: object } interface Lockup { endTs: BN kind: LockupKind startTs: BN } export interface Deposit { allowClawback: boolean amountDepositedNative: BN amountInitiallyLockedNative: BN isUsed: boolean lockup: Lockup votingMintConfigIdx: number } export interface DepositWithMintAccount extends Deposit { mint: TokenProgramAccount index: number available: BN vestingRate: BN | null currentlyLocked: BN nextVestingTimestamp: BN | null votingPower: BN votingPowerBaseline: BN } export const emptyPk = '11111111111111111111111111111111' export const getRegistrarPDA = async ( realmPk: PublicKey, mint: PublicKey, clientProgramId: PublicKey, ) => { const [registrar, registrarBump] = await PublicKey.findProgramAddress( [realmPk.toBuffer(), Buffer.from('registrar'), mint.toBuffer()], clientProgramId, ) return { registrar, registrarBump, } } export const getVoterPDA = async ( registrar: PublicKey, walletPk: PublicKey, clientProgramId: PublicKey, ) => { const [voter, voterBump] = await PublicKey.findProgramAddress( [registrar.toBuffer(), Buffer.from('voter'), walletPk.toBuffer()], clientProgramId, ) return { voter, voterBump, } } export const getVoterWeightPDA = async ( registrar: PublicKey, walletPk: PublicKey, clientProgramId: PublicKey, ) => { const [voterWeightPk, voterWeightBump] = await PublicKey.findProgramAddress( [ registrar.toBuffer(), Buffer.from('voter-weight-record'), walletPk.toBuffer(), ], clientProgramId, ) return { voterWeightPk, voterWeightBump, } } export const tryGetVoter = async (voterPk: PublicKey, client: VsrClient) => { try { const voter = await client?.program.account.voter.fetch(voterPk) return voter as unknown as Voter } catch (e) { return null } } export const tryGetRegistrar = async ( registrarPk: PublicKey, client: VsrClient, ) => { try { const existingRegistrar = await client.program.account.registrar.fetch(registrarPk) return existingRegistrar as unknown as Registrar } catch (e) { return null } }