@lifi/composer-sdk
Version:
Public Composer SDK for building and submitting flows
92 lines (89 loc) • 4.52 kB
TypeScript
import { ComposeManifest, ComposeCompileRequest, ComposeCompileResult, SimulateRequest, SimulateResult } from '@lifi/compose-spec';
import { GetZapPacksOptions, ZapPackOverview } from './discovery.js';
/**
* Configuration for creating a low-level Compose API client.
*/
interface ComposeClientOptions {
/** Base URL of the Compose API. */
readonly baseUrl: string;
/** Optional custom `fetch` implementation. Defaults to `globalThis.fetch`. */
readonly fetch?: typeof globalThis.fetch;
/** Optional LI.FI API key. When set, sent as the `x-lifi-api-key` header on every request. */
readonly apiKey?: string;
}
/**
* Low-level HTTP client for the Compose API.
*
* Handles request serialization, SDK version headers, and error mapping.
* Prefer using {@link ComposeSdk} for the full builder experience. Use this
* directly when you need to decouple request building from submission — e.g.
* build via `sdk.request()` then submit via `client.compile()` with custom
* retry logic or request inspection.
*/
interface ComposeClient {
/**
* Fetches the server's operation manifest describing all supported operations,
* guards, materialisers, and preconditions.
* @returns The manifest document.
* @throws {@link ComposeError} on network, validation, or server errors.
*/
readonly getManifest: () => Promise<ComposeManifest>;
/**
* Submits a compile request and returns the result.
*
* When the caller passes `simulationPolicy: 'allow-revert'` and the transaction
* reverts in simulation, the server responds with HTTP 206 and the SDK returns a
* partial result (`status: 'partial'`) instead of throwing. The partial result
* includes the transaction (without `gasLimit`) and revert diagnostics.
*
* @param request - The full compile request including flow and run inputs.
* @returns A discriminated result: `status: 'success'` or `status: 'partial'`.
* @throws {@link ComposeError} on network, validation, or server errors.
*/
readonly compile: (request: ComposeCompileRequest) => Promise<ComposeCompileResult>;
/**
* Fetches the available routing edges grouped by protocol.
*
* The edge catalog is dynamic — it reflects the current state of the
* backend's routing snapshot (protocols, chains, token blacklists).
* Results are not cached by the SDK; callers should cache as appropriate.
*
* @param options - Optional filter to restrict results to specific protocols.
* @returns An array of {@link ZapPackOverview} objects, one per protocol.
* @throws {@link ComposeError} on network or server errors (503 when the
* routing catalog is not yet initialized).
*/
readonly getZapPacks: (options?: GetZapPacksOptions) => Promise<readonly ZapPackOverview[]>;
/**
* Simulates a raw, pre-encoded transaction against `POST /simulate` and
* reports how the watched balances change and how much inner-call gas it
* burns.
*
* The result is a discriminated union on `status`:
* - `'ok'` — the simulation ran successfully; `deltas`/`gasUsed` are populated.
* - `'revert'` — the simulation ran but the transaction reverted on-chain. A
* revert is a *successful simulation*, not a transport error, so it is
* returned (HTTP 200) rather than thrown — mirroring how {@link compile}
* returns `status: 'partial'` on a simulated revert.
* - `'error'` — the request was well-formed but the simulation could not be
* set up or run (HTTP 422); `message` is intentionally generic.
*
* `bigint` amounts in the request (`value`, requirement `balance`/`allowance`)
* are serialised to decimal strings automatically.
*
* @param request - The raw transaction plus funding `requirements` and the
* `trackedBalances` to watch.
* @returns A {@link SimulateResult} (`ok` / `revert` / `error`).
* @throws {@link ComposeError} on network failures, HTTP 400 (malformed
* input), 401/403 (auth), 404, 429, and 5xx.
*/
readonly simulate: (request: SimulateRequest) => Promise<SimulateResult>;
}
/**
* Creates a low-level Compose API client.
*
* @param options - Client configuration including the API base URL.
* @returns A {@link ComposeClient} instance.
*/
declare const createComposeClient: (options: ComposeClientOptions) => ComposeClient;
export { type ComposeClient, type ComposeClientOptions, createComposeClient };