Files
solisting/sdk/src/order.ts
2026-06-25 18:53:06 +02:00

66 lines
2.3 KiB
TypeScript

import { address, type Account, type Address, type Rpc } from '@solana/kit'
import { type GetProgramAccountsApi } from '@solana/rpc-api'
import { type GetAccountInfoApi } from '@solana/rpc-api'
import type { Base64EncodedBytes } from '@solana/rpc-types'
import {
decodeSolistingStateOrderAccount,
fetchSolistingStateOrderAccount,
SOLISTING_STATE_ORDER_ACCOUNT_DISCRIMINATOR,
type SolistingStateOrderAccount,
} from './generated/solisting/src/generated/index'
import { deriveEscrowId } from './pda'
const PROGRAM_ADDRESS = address('9uF64swnFqo34oFJtv8Qx9JDyXXJz73eDFF4cKRBfQBZ')
export type OrderAccountWithPda = Account<SolistingStateOrderAccount>
type GpaRpc = Rpc<GetProgramAccountsApi>
type GetRpc = Rpc<GetAccountInfoApi>
async function fetchAllOrders(rpc: GpaRpc): Promise<OrderAccountWithPda[]> {
const disc = SOLISTING_STATE_ORDER_ACCOUNT_DISCRIMINATOR
const discBase64 = Buffer.from(disc).toString('base64') as Base64EncodedBytes
const results = await rpc
.getProgramAccounts(PROGRAM_ADDRESS, {
encoding: 'base64',
filters: [{ memcmp: { offset: 0n, bytes: discBase64, encoding: 'base64' } }],
})
.send()
return (results as Array<{ pubkey: Address; account: { executable: boolean; lamports: bigint; owner: Address; space: bigint; data: [string, 'base64'] } }>).map((r) => {
const data = new Uint8Array(Buffer.from(r.account.data[0], 'base64'))
return decodeSolistingStateOrderAccount({
address: r.pubkey,
data,
executable: r.account.executable,
lamports: r.account.lamports as unknown as import('@solana/rpc-types').Lamports,
programAddress: r.account.owner,
space: r.account.space,
exists: true,
}) as OrderAccountWithPda
})
}
export async function fetchOrdersForListing(
rpc: GpaRpc,
listingPk: Address,
): Promise<OrderAccountWithPda[]> {
const all = await fetchAllOrders(rpc)
return all.filter((o) => o.data.listing === listingPk)
}
export async function fetchOrdersByBuyer(
rpc: GpaRpc,
buyer: Address,
): Promise<OrderAccountWithPda[]> {
const all = await fetchAllOrders(rpc)
return all.filter((o) => o.data.buyer === buyer)
}
export async function fetchOrder(
rpc: GetRpc,
addr: Address,
): Promise<OrderAccountWithPda | null> {
return fetchSolistingStateOrderAccount(rpc, addr).catch(() => null)
}
export { deriveEscrowId }