141 lines
3.1 KiB
TypeScript
141 lines
3.1 KiB
TypeScript
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<T> = {
|
|
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<Mint>
|
|
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
|
|
}
|
|
}
|