sbv2-solana/programs/anchor-vrf-parser/client/accounts/VrfClient.ts

135 lines
3.4 KiB
TypeScript

import * as borsh from "@project-serum/borsh" // eslint-disable-line @typescript-eslint/no-unused-vars
import { Connection, PublicKey } from "@solana/web3.js"
import BN from "bn.js" // eslint-disable-line @typescript-eslint/no-unused-vars
import { PROGRAM_ID } from "../programId"
export interface VrfClientFields {
bump: number
maxResult: BN
resultBuffer: Array<number>
result: BN
lastTimestamp: BN
authority: PublicKey
vrf: PublicKey
}
export interface VrfClientJSON {
bump: number
maxResult: string
resultBuffer: Array<number>
result: string
lastTimestamp: string
authority: string
vrf: string
}
export class VrfClient {
readonly bump: number
readonly maxResult: BN
readonly resultBuffer: Array<number>
readonly result: BN
readonly lastTimestamp: BN
readonly authority: PublicKey
readonly vrf: PublicKey
static readonly discriminator = Buffer.from([
230, 174, 157, 153, 51, 18, 230, 163,
])
static readonly layout = borsh.struct([
borsh.u8("bump"),
borsh.u64("maxResult"),
borsh.array(borsh.u8(), 32, "resultBuffer"),
borsh.u128("result"),
borsh.i64("lastTimestamp"),
borsh.publicKey("authority"),
borsh.publicKey("vrf"),
])
constructor(fields: VrfClientFields) {
this.bump = fields.bump
this.maxResult = fields.maxResult
this.resultBuffer = fields.resultBuffer
this.result = fields.result
this.lastTimestamp = fields.lastTimestamp
this.authority = fields.authority
this.vrf = fields.vrf
}
static async fetch(
c: Connection,
address: PublicKey
): Promise<VrfClient | null> {
const info = await c.getAccountInfo(address)
if (info === null) {
return null
}
if (!info.owner.equals(PROGRAM_ID)) {
throw new Error("account doesn't belong to this program")
}
return this.decode(info.data)
}
static async fetchMultiple(
c: Connection,
addresses: PublicKey[]
): Promise<Array<VrfClient | null>> {
const infos = await c.getMultipleAccountsInfo(addresses)
return infos.map((info) => {
if (info === null) {
return null
}
if (!info.owner.equals(PROGRAM_ID)) {
throw new Error("account doesn't belong to this program")
}
return this.decode(info.data)
})
}
static decode(data: Buffer): VrfClient {
if (!data.slice(0, 8).equals(VrfClient.discriminator)) {
throw new Error("invalid account discriminator")
}
const dec = VrfClient.layout.decode(data.slice(8))
return new VrfClient({
bump: dec.bump,
maxResult: dec.maxResult,
resultBuffer: dec.resultBuffer,
result: dec.result,
lastTimestamp: dec.lastTimestamp,
authority: dec.authority,
vrf: dec.vrf,
})
}
toJSON(): VrfClientJSON {
return {
bump: this.bump,
maxResult: this.maxResult.toString(),
resultBuffer: this.resultBuffer,
result: this.result.toString(),
lastTimestamp: this.lastTimestamp.toString(),
authority: this.authority.toString(),
vrf: this.vrf.toString(),
}
}
static fromJSON(obj: VrfClientJSON): VrfClient {
return new VrfClient({
bump: obj.bump,
maxResult: new BN(obj.maxResult),
resultBuffer: obj.resultBuffer,
result: new BN(obj.result),
lastTimestamp: new BN(obj.lastTimestamp),
authority: new PublicKey(obj.authority),
vrf: new PublicKey(obj.vrf),
})
}
}