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 type GpaRpc = Rpc type GetRpc = Rpc async function fetchAllOrders(rpc: GpaRpc): Promise { 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 { const all = await fetchAllOrders(rpc) return all.filter((o) => o.data.listing === listingPk) } export async function fetchOrdersByBuyer( rpc: GpaRpc, buyer: Address, ): Promise { const all = await fetchAllOrders(rpc) return all.filter((o) => o.data.buyer === buyer) } export async function fetchOrder( rpc: GetRpc, addr: Address, ): Promise { return fetchSolistingStateOrderAccount(rpc, addr).catch(() => null) } export { deriveEscrowId }