For the complete documentation index, see llms.txt. This page is also available as Markdown.

Solana

Building ready-to-sign Solana transactions for vault actions.

The Solana-flavored surface of the Transaction Builder. Same three-step workflow — discover routes, build a transaction, submit — but the addresses, transaction format, simulation model, and response shape all differ from the EVM path.

What's different on Solana

EVM
Solana

Addresses

Hex (0x…)

Base58 pubkeys

Path chain slug

ethereum, base, …

solana

Returned tx

Hex calldata (encoded_tx_data)

Base64 v0 versioned transaction (serialized_transaction_base64)

Simulation

Tenderly (tenderly_simulation_url, simulation_gas_used)

Native Solana RPC (simulation.units_consumed, simulation.logs)

Caller

msg.sender must equal strategist_address

strategist_address is the feePayer and signer of the versioned tx

Batching

POST /execute-multiple batches actions atomically

Not currently supported — call POST /execute once per action

Examples on this page assume:

export VEDA_API_KEY=veda_user_live_...
BASE=https://api.veda.tech/v1/tx-builder/api
VAULT=4dTwdU6t92Fvf3dCQoiztbijX4Ncbu6zHKe9c8rYxmAp
STRATEGIST=GGPhD3awtUsk4SXuwTcGMsqYbCDu9uNfeBrpe4zGaAom

That vault is Balanced Yield USDC on Solana — a good starting point since it exposes ITB deposits/withdrawals, CCTP bridging, and Orca swaps under one strategist.


1. List available actions

Returns the manifest of routes the strategist can call on the vault — same shape as the EVM version. See Transaction Builder → List available actions for a full field-by-field walk of the manifest. Solana-specific note: the field on each route object is params (not parameters).

Response (abridged — one route shown):


2. Inspect parameter constraints

When a route reports has_constraints: true, call this endpoint for the valid parameter combinations. The route slug in the path is percent-encoded (e.g. orca%2Fswap).

Response is a JSON object with route and a constraints array — each entry is one valid combination of the correlated params for that route.


3. Build a single action

Body:

Field
Default
Notes

params

{}

Key-value map matching the route's params from /actions.

skip_sim

false

Skip native Solana simulation. Some routes require simulation — see Errors.

Example — deposit

Deposits 0.1 PYUSD into the vault's ITB Position Manager strategy:

You get back a JSON body containing (among other fields) serialized_transaction_base64 — that's the transaction to sign and broadcast. Its exact top-level shape depends on the route — see Response shapes below.

/execute-multiple is not currently supported on Solana. Call /execute once per action; batching may come in a later version.


Response shapes

Solana /execute responses come in two shapes. There's no top-level discriminator — check whether a transaction key is present.

Shape A — nested transaction object

Used by itb_position_manager/* and itb_supervised_loan/*:

When already_complete is true, the API is telling you the action is a no-op onchain (e.g. accept_ownership on a strategy that's already accepted). The transaction key is absent.

Shape B — flat

Used by orca/swap, cctp/bridge, xstocks_ccip/bridge, raydium/swap:

Field cheatsheet (both shapes)

Field
Notes

serialized_transaction_base64

Base64 v0 transaction. VersionedTransaction.deserialize(Buffer.from(…, "base64")).

required_signers[]

Every pubkey that must sign before broadcast. Usually just the strategist.

server_signed_signers[]

Pubkeys the API has already signed for (e.g. the CCTP relay key on cctp/bridge). Don't re-sign these.

raw_atomic_amount

Amount in smallest token unit (PYUSD is 6 decimals, so 0.1 → "100000").

simulation.successful

Whether the native Solana RPC simulation passed.

simulation.units_consumed

Compute units consumed — useful for sizing the ComputeBudget on your submit path.

simulation.logs[]

Raw program logs from the simulation. Inspect on transaction_simulation_failed errors.

already_complete

Shape A only. true = no-op; no transaction present.

finalized_authorization_slot

Slot at which the vault's authorization state was read. Internal.

active_authorization_digests[]

On-chain authorization PDAs used to build this transaction. Internal.


Submitting the transaction

Deserialize the returned base64 v0 transaction, sign with the strategist, and broadcast:

Address lookup tables referenced by the v0 message are embedded and don't need to be fetched separately for signing.

For non-EOA custody (the common case — strategists are rarely hot wallets):

  • Squads (Solana multisig) — propose the transaction with the deserialized instructions; execute after threshold is met.

  • Fordefi (Solana workflow) — hand the serialized transaction to your Fordefi policy pipeline.

  • Any custody that can sign a VersionedTransaction and enforce that the fee-payer / signer equals the strategist pubkey.


Errors

Non-2xx responses use a detail envelope:

HTTP
Code
Meaning
Fix

400

action_simulation_required

This route cannot skip simulation.

Retry with skip_sim: false.

400

invalid_request

Generic validation failure — check message.

e.g. amount exceeds the vault's finalized token balance.

422

transaction_simulation_failed

Native Solana simulation failed.

Inspect details.logs. Common cause: vault doesn't hold enough of the input token.

422

route_unavailable

Protocol route isn't currently serviceable.

Usually transient (e.g. no active Raydium digest window server-side). Retry later.

Routes that always require skip_sim: false:

  • itb_position_manager/accept_ownership, /deposit, /withdraw

  • itb_supervised_loan/accept_ownership, /deposit, /withdraw

  • orca/swap

Last updated