> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# svm venue: solfi-v2

> 40 exports of the solfi-v2 venue integration in @eco-incorp/sauce/svm, including solfiSwapAccounts, readAccountU64, SOLFI_V2_PROGRAM_ID, OFF_ORACLE, OFF_MINT_A, OFF_MINT_B.

Solana venue integration `solfi-v2` under `svm/venues/solfi-v2`.

<Note>
  Generated from the type declarations shipped in `@eco-incorp/sauce` 0.99.4. Each entry shows the package authors' JSDoc and declaration for this SDK version. For runtime compatibility and deployed addresses, see [architecture and deployments](/programmable-transactions/sauce/architecture-and-deployments).
</Note>

### `solfiSwapAccounts`

*Function* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

The 13-account order for SolFi V2's swap (disc 0x07), shared by v1 buildSwap
and v2 buildSwapV2. Decoded from landed simulations, not docs (no IDL/docs
exist for this venue): \[signer, pool, oracle, registry, vaultA, vaultB,
userA, userB, mintA, mintB, TOKEN, TOKEN (slot repeated), instructions
sysvar]. userA/userB are POSITIONAL BY MINT, never by direction.

```typescript theme={null}
export declare function solfiSwapAccounts(c: SolfiV2PoolConfig, user: SwapUser, make: (ref: string, addr: Address, writable?: boolean) => VenueAccount, refFor?: (role: string) => string): VenueAccount[];
```

### `readAccountU64`

*Function* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

Re-exported for the ladder mirror + tests (avoids a second copy of the offset table).

```typescript theme={null}
export declare function readAccountU64(data: Uint8Array, offset: number): bigint;
```

### `SOLFI_V2_PROGRAM_ID`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
SOLFI_V2_PROGRAM_ID: Address<"SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF">
```

### `OFF_ORACLE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_ORACLE = 24
```

### `OFF_MINT_A`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_MINT_A = 56
```

### `OFF_MINT_B`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_MINT_B = 88
```

### `OFF_VAULT_A`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_VAULT_A = 120
```

### `OFF_VAULT_B`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_VAULT_B = 152
```

### `OFF_REGISTRY`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_REGISTRY = 256
```

### `CFG`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
CFG = 704
```

### `OFF_SPLINE_D1`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

Four splines, stride 0x88 from CFG; d0/d1 select by TRADE DIRECTION (not stride order).

```typescript theme={null}
OFF_SPLINE_D1: number
```

### `OFF_SPLINE_D0`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SPLINE_D0: number
```

### `OFF_SPLINE_AGE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SPLINE_AGE: number
```

### `OFF_SPLINE_SF`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SPLINE_SF: number
```

### `OFF_CACHED_TS`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_CACHED_TS: number
```

### `OFF_SPREAD_DIR1`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SPREAD_DIR1: number
```

### `OFF_SPREAD_DIR0`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SPREAD_DIR0: number
```

### `OFF_THRESHOLD`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_THRESHOLD: number
```

### `OFF_SKEW_NUM`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SKEW_NUM: number
```

### `OFF_SKEW_DEN`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SKEW_DEN: number
```

### `OFF_SKEW_HI`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SKEW_HI: number
```

### `OFF_SKEW_LO_MAG`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_SKEW_LO_MAG: number
```

### `OFF_DECAY_PPM`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_DECAY_PPM: number
```

### `OFF_LAST_SWAP_SLOT`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_LAST_SWAP_SLOT: number
```

### `OFF_FEE_SCALE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
OFF_FEE_SCALE: number
```

### `SPLINE_X_STRIDE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

Spline struct: x\[0..7] u64
@ +0x00, y\[0..7] u64
@ +0x40, len u64
@ +0x80. 136 bytes.

```typescript theme={null}
SPLINE_X_STRIDE = 0
```

### `SPLINE_Y_STRIDE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
SPLINE_Y_STRIDE = 64
```

### `SPLINE_LEN_STRIDE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
SPLINE_LEN_STRIDE = 128
```

### `SPLINE_SIZE`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
SPLINE_SIZE = 136
```

### `ORACLE_OFF_EXP`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_EXP = 0
```

### `ORACLE_OFF_MAN`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_MAN = 8
```

### `ORACLE_OFF_SLOT`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_SLOT = 16
```

### `ORACLE_OFF_TS`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_TS = 24
```

### `ORACLE_OFF_CONF`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_CONF = 32
```

### `ORACLE_OFF_EXPIRY_SLOT`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_EXPIRY_SLOT = 40
```

### `ORACLE_OFF_FEE_WORD`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
ORACLE_OFF_FEE_WORD = 56
```

### `ORACLE_KEY_WORDS`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

168-byte XOR keystream (21 u64 words), recovered from fn 0x26328
(0x26380-0x264a8 stores it as 21 immediates; XOR loop at 0x264c0-0x26518).
Word i covers plaintext bytes \[8i, 8i+8). Only the words this adapter
actually reads are listed; word 3 (bytes 24..31, the ms timestamp) is
literally 0 - that field is plaintext in the raw account.

```typescript theme={null}
ORACLE_KEY_WORDS: Record<number, bigint>
```

### `POOL_K`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

The one un-derived additive constant (units of 1e-7 impact), keyed by POOL - see ladder.ts's module doc "residualRisk" for how it composes on-chain.

FIXED (2026-07): this table used to be keyed by REGISTRY, not pool, on the
false premise that every pool sharing a registry shares its K. It does not:
registry QoFvFhDZg9TaZEi4SsasWpH5xXzk3zBqfRyicGexfNQ alone carries at least
two pools with DIFFERENT, independently-fitted K (K in \[0, 12000] bisected
against drift-free bursts) - FkEB6uvyzuoaGpgs4yRtFtxC4WJxhejNFbUkj5R6wR32
(USDT/USDC) needs K=0, 2Q6S8p9iZNzMvpTemiC56HqCJ3F3szNoyRkvqEKfCanY needs
K=5832 - and the old registry-keyed table quoted BOTH with 5832, so the
USDT pool was systematically wrong by 5832 units of 1e-7 impact (5.832 bps),
understating the true impact and so OVER-quoting the output by that amount
on every trade - not the "\<=1 unit, always-safe" residual the old comment
claimed (that claim was true of ONE pool, 65ZHSArs..., and was written as if
venue-wide). fetchPoolConfig read the registry key blindly, admitting all
\~18 pools on that registry with an unverified, borrowed K.

Fixed: keyed by POOL. A pool whose K has not been independently verified
throws at fetchPoolConfig instead of borrowing its registry-mate's value - REFUSE, don't guess (see fetchPoolConfig below). Each entry below is
verified wei-exact against fresh mainnet `simulateTransaction` calls at
that SPECIFIC pool (65ZHSArs...: 84+ calls, 0 mismatch, within one
oracle-publish burst - see ladder.ts's module doc and solfi-v2.test.ts;
FkEB6uvy.../2Q6S8p9i...: bisected against drift-free bursts, K in
\[0, 12000]).

```typescript theme={null}
POOL_K: Record<string, bigint>
```

### `SolfiV2PoolConfig`

*Interface* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
export interface SolfiV2PoolConfig extends PoolConfig {
    venue: typeof SLUG;
    direction: 0 | 1;
    mintA: Address;
    mintB: Address;
    vaultA: Address;
    vaultB: Address;
    oracle: Address;
    registry: Address;
    tokenProgram: Address;
    additiveK: bigint;
}
```

### `solfiV2`

*Variable* · `sdk/dist/svm/venues/solfi-v2/index.d.ts`

```typescript theme={null}
solfiV2: {
    slug: string;
    kind: "constant-product";
    programId: Address<"SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF">;
    fetchPoolConfig(load: AccountLoader, pool: Address, direction?: 0 | 1): Promise<SolfiV2PoolConfig>;
    quoteAccounts(cfg: PoolConfig): VenueAccount[];
    buildSwap(cfg: PoolConfig, user: SwapUser, amountIn: bigint): {
        programId: Address<"SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF">;
        data: Uint8Array<ArrayBuffer>;
        accounts: VenueAccount[];
    };
}
```
