Skip to main content

VaeaFlash

Struct VaeaFlash 

Source
pub struct VaeaFlash { /* private fields */ }
Expand description

VAEA Flash — Universal Flash Loan SDK for Solana (Rust)

§Example

use vaea_flash::{VaeaFlash, BorrowParams, VaeaConfig, Source};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let payer = solana_sdk::signature::Keypair::new();
    let flash = VaeaFlash::new("https://api.devnet.vaea.fi", &payer)?;

    let capacity = flash.get_capacity().await?;
    println!("Available tokens: {}", capacity.tokens.len());

    let quote = flash.get_quote("SOL", 1000.0).await?;
    println!("Fee: {}%", quote.fee_breakdown.total_fee_pct);
    Ok(())
}

Implementations§

Source§

impl VaeaFlash

Source

pub fn new(api_url: &str, payer: &Keypair) -> Result<Self, VaeaError>

Create a new VaeaFlash client.

Source

pub fn with_rpc( api_url: &str, rpc_url: &str, payer: &Keypair, ) -> Result<Self, VaeaError>

Create with full config including RPC for execute().

Source

pub fn read_only(api_url: &str) -> Self

Create a read-only client (no wallet, no execute).

Source

pub fn with_source(self, source: Source) -> Self

Set fee source (sdk or ui).

Source

pub async fn get_capacity(&self) -> Result<CapacityResponse, VaeaError>

Get real-time capacity for all dynamically discovered tokens (120+).

Source

pub async fn get_quote( &self, token: &str, amount: f64, ) -> Result<QuoteResponse, VaeaError>

Get a detailed quote with fee breakdown.

Source

pub async fn build( &self, request: &BuildRequest, ) -> Result<BuildResponse, VaeaError>

Build prefix + suffix instructions for a flash loan.

Source

pub async fn get_health(&self) -> Result<HealthResponse, VaeaError>

Check system health.

Source

pub async fn get_matrix(&self) -> Result<MatrixResponse, VaeaError>

Get the full liquidity matrix — per-protocol per-token available liquidity.

Source

pub async fn get_discovery(&self) -> Result<DiscoverySummary, VaeaError>

Get discovery summary — how many tokens were found during boot-time scanning.

Source

pub async fn get_route( &self, token: &str, amount: f64, max_fee_bps: u16, ) -> Result<ResolvedRoute, VaeaError>

Resolve the optimal flash loan route for any supported token.

The Smart Router evaluates all direct routes across Marginfi, Kamino, and Jupiter Lend, then returns the cheapest feasible path.

Source

pub async fn get_sources(&self) -> Result<SourcesResponse, VaeaError>

Get information about all supported lending protocols.

Source

pub async fn get_aggregated_capacity( &self, ) -> Result<AggregatedCapacityResponse, VaeaError>

Get capacity breakdown per source (Marginfi, Kamino, Jupiter Lend) for each token.

Source

pub async fn borrow( &self, params: &BorrowParams, ) -> Result<Vec<Instruction>, VaeaError>

Build flash loan instructions with user instructions sandwiched.

Source

pub async fn execute(&self, params: BorrowParams) -> Result<String, VaeaError>

Build, sign, and send a flash loan transaction. Automatically uses the VAEA Address Lookup Table for TX compression.

Source

pub async fn simulate( &self, params: &BorrowParams, ) -> Result<SimulateResult, VaeaError>

Simulate a flash loan transaction without sending it. Returns success/failure, CU consumption, and program logs.

Source

pub async fn borrow_multi( &self, params: &BorrowMultiParams, ) -> Result<Vec<Instruction>, VaeaError>

Build a multi-token atomic flash loan with nested sandwich pattern: prefix_A → prefix_B → [user IXs] → suffix_B → suffix_A

Source

pub async fn is_profitable( &self, params: &ProfitabilityParams, ) -> Result<ProfitabilityResult, VaeaError>

Check if a flash loan strategy is profitable after all fees.

Source

pub fn borrow_local( &self, params: &BorrowParams, ) -> Result<Vec<Instruction>, VaeaError>

Build flash loan instructions 100% locally — NO API call.

~0.1ms vs ~80ms for borrow(). Use this for latency-critical bots. The instructions are identical to what /v1/build returns.

let ixs = flash.borrow_local(&BorrowParams {
    token: "SOL".to_string(),
    amount: 1000.0,
    instructions: vec![/* your arb IXs */],
    slippage_bps: None,
    max_fee_bps: None,
})?;
Source

pub async fn execute_local( &self, params: BorrowParams, ) -> Result<String, VaeaError>

Build, sign, and send a flash loan in ~100ms — NO API call.

Uses local instruction building + direct RPC. Critical path: localBuild(<1ms) → getBlockhash(~50ms) → send(~50ms)

Source

pub async fn execute_smart( &self, params: BorrowParams, ) -> Result<String, VaeaError>

Build, sign, and send a flash loan with intelligent route selection.

The Smart Router evaluates ALL available paths across Marginfi, Kamino, and Jupiter Lend, then selects the cheapest feasible route automatically. Falls back to execute_local() if the API is unavailable.

Source

pub async fn read_flash_state( &self, payer_key: &Pubkey, token_mint: &Pubkey, ) -> Result<Option<FlashStateInfo>, VaeaError>

Read an active FlashState PDA from the chain.

Use this to verify a flash loan is active without CPI — just pass the PDA as a read-only account.

Cost: 1 RPC call (~5ms). On-chain equivalent: ~2K CU via vaea-flash-ctx crate.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more