Trader Interactions
Install Dependencies
yarn add flash-sdk @coral-xyz/anchor @solana/web3.js @solana/spl-token dotenvPool auto-routing
Fetch prices via Pyth Lazer
import { BN_ZERO, OraclePrice, PoolConfig } from 'flash-sdk'
import { BN } from '@coral-xyz/anchor'
export const LAZER_PROXY_BASE_URL =
process.env.LAZER_PROXY_URL ?? 'https://pyth-lazer-proxy-3.dourolabs.app'
interface LazerV1Feed {
priceFeedId: number
price: string
exponent: number
confidence: number
marketSession: string
feedUpdateTimestamp: number // microseconds
}
interface LazerV1Response {
timestampUs: string
priceFeeds: LazerV1Feed[]
}
type PoolToken = PoolConfig['tokens'][number]
/**
* Returns Map<tokenSymbol, { price, emaPrice }> for every token across every pool.
* Lazer V1 has no separate EMA price — we reuse `price` for both (same trick
* flash-main-ui uses in workers/lazerPrice.worker.ts).
*/
export const getPrices = async () => {
const lazerIdToTokens = new Map<number, PoolToken[]>()
for (const config of POOL_CONFIGS) {
for (const token of config.tokens) {
const list = lazerIdToTokens.get(token.lazerId) ?? []
list.push(token)
lazerIdToTokens.set(token.lazerId, list)
}
}
const uniqueIds = Array.from(lazerIdToTokens.keys())
const feedParams = uniqueIds.map((id) => `price_feed_ids=${id}`).join('&')
const url = `${LAZER_PROXY_BASE_URL}/v1/latest_price?${feedParams}`
const response = await fetch(url)
if (!response.ok) {
throw new Error(`Lazer latest_price HTTP ${response.status} ${response.statusText}`)
}
const json = (await response.json()) as LazerV1Response
const priceMap = new Map<string, { price: OraclePrice; emaPrice: OraclePrice }>()
for (const feed of json.priceFeeds) {
const matchedTokens = lazerIdToTokens.get(feed.priceFeedId)
if (!matchedTokens) continue
const priceOracle = new OraclePrice({
price: new BN(feed.price),
exponent: new BN(feed.exponent),
confidence: new BN(feed.confidence.toString()),
timestamp: new BN(Math.floor(feed.feedUpdateTimestamp / 1_000_000)), // µs → s
})
for (const token of matchedTokens) {
priceMap.set(token.symbol, { price: priceOracle, emaPrice: priceOracle })
}
}
return priceMap
}Privilege accounts (Referral & Stake)
Deriving the PDAs
Resolving the triplet automatically
Wiring it into a trade
Open a position
Open a position (auto-routed)
Open a position with a swap
Close a position
Add collateral
Remove collateral
List user positions
Liquidation price
Set full or partial Take Profit / Stop Loss on an existing position
Common gotchas
Last updated
Was this helpful?

