Skip to main content
An order is a proposed transaction on a multisig vault. It carries the payload, collects owner signatures, and becomes executable once the vault threshold is met. The SDK exposes one set of methods across every chain, but the underlying work differs a lot: on EVM signing is an off-chain EIP-712 signature; on Solana every step is its own on-chain transaction; on Tron and XRP the SDK must fetch a server-built transaction before it can sign it; on Cardano it produces a witness.
A Vault owner on a hardware wallet signs, creates, executes and rejects orders with the prepareHardware… methods instead. See the method map.

Prerequisites

If the account runs in strict authentication, pass walletPassword on every signing call. Without it the SDK throws StrictAuthPasswordRequiredError.
Every order method needs the same unlocked wallet session as personal transactions. See Authentication for session unlocking, TTL, and lockout.
Every method that rebuilds a key (createOrder on SOL, signOrder, rejectOrder on SOL and executeOrder) accepts userRef and, when the device share is missing, walletPassword. sdk.runWithUserRef(userRef, fn) sets the ambient user for a whole block if you would rather not thread it through every call.

Method reference

Every method above that touches an order, from createOrder through executeOrder, first checks that the acting wallet still belongs to the account’s current recovery phrase. A wallet whose accessState is archived or access_lost is refused with PermissionDeniedError before any order work happens. Sending the wallet’s own funds is deliberately not gated this way. See Wallet generations.
To price an execution before you commit to it, use estimateFee with the ExecOrder type:
See Multisig Network Fees.

Lifecycle

Order.status is typed EOrderStatus, whose members are exactly:

Order shape

Instruction types

createOrder takes a method: OrderMethodType plus instructions: OrderInstruction[]. OrderInstruction is a loose bag; the SDK reads only the fields the chosen method needs:
OrderMethodType covers every method any chain accepts: transfers (native, erc20, spl, trc20, ada_native, ada_token, xrp_native, xrp_asset), owner and threshold changes, and the XRP trust-line operations. Use the constant rather than a string literal, since some methods exist in more than one casing for historical reasons.

Cardano

A Cardano order carries a single instruction, not an array. For a token transfer, pass the policy id as tokenAddress and the asset name as symbol, which is mandatory there.

XRP

An XRP order also carries a single instruction. method: 'xrp_native' and method: 'native' are equivalent. XRP vaults support at most 8 signers, and an owner update above that is rejected before any request is made.

Creating orders

createSendOrder, the simple path

It looks the vault up to learn its chainType, validates to against that chain, picks the method for you (native with no token; otherwise erc20 on EVM, spl on SOL, trc20/trc on TRON by address prefix, asset on XRP), builds a one-element instruction list, and delegates to createOrder. It throws InvalidInputError for a token transfer on a chain it cannot map (Unsupported chain for token transfer).

createOrder, full control

CreateOrderOutput is { order: Order; proposalHash?: string }. proposalHash is populated on Solana only, with the multisigPda.

createSettingsOrder, owners and threshold

The diff against multisig.owners / multisig.threshold decides the method. See the change-method table on the Multisig Vaults page. No change throws InvalidInputError: No changes detected in multisig configuration.
Bitcoin and Cardano vaults have no settings orders, because their owner set and threshold are fixed in the script at creation.

Signing

What differs per chain

signOrder is one call everywhere, but the cost and the effect differ: In every case the SDK checks what it is about to sign against what the order declares before the key is reconstructed. See below.
Cardano: pass the order with multisig populated. A Cardano transaction pays the recipient and returns the remainder to the vault, and the SDK needs the vault address to tell those two outputs apart. It will not fetch that address itself: the backend supplied the transaction body, so letting it also declare which output is “change” would defeat the check. Without it, signing fails with “ADA order carries no vault address”.multisig is optional on Order because the paginated list omits it. Read the order through getOrderById, drop order from the input and let the SDK fetch it, or merge in the vault you already hold:

Signing safety

Before the private key is touched, signOrder checks the payload about to be signed against what the order declares. A disagreement throws SignatureIntentMismatchError; see Errors for the message shapes and Preflight for the full set of checks that run at signing time on every chain. Treat this error as a security event, not a transient failure, and do not retry it. For a simulation of what an order would actually do on chain, run preflightOrder first. It returns null when no check covers the chain or method, so gate on preflightBlocksSigning(result, isRunning) rather than on truthiness.

Rejecting

rejectOrder resolves to the resulting Order. walletAddress and the vault id are required. A rejection missing either fails immediately, before any request.

Executing

On EVM and Solana, fund the acting owner’s personal wallet. On Tron, Bitcoin, Cardano and XRP, fund the vault. See Multisig Fees.

Chain-specific extras

Solana: retrying a failed activation

Creating a Solana order takes two steps: the order is registered, then activated on chain. An order can therefore exist with its activation incomplete. Pass orderIdToActivate on createOrder to re-run only the activation for such an order instead of creating a new one.

Cancelling every pending order on an EVM vault

Rejecting an EVM order creates a counter-order at the same nonce; executing that counter-order invalidates every pending order sharing that nonce. There is no separate “cancel all”.

Deleting an order record

deleteOrder removes the order record. It does not affect anything on chain; use rejectOrder for that. The server deletes only an order that is still created or proposed; for any other status the call fails with an ApiError.

Reading orders

getOrders defaults to page: 1, limit: 20.
The two read methods are easy to mix up. getOrders takes a multisig id and returns that vault’s page of orders; getOrderById takes an order id and returns one order.

History

Both return TxHistoryCombinedResponse:
Personal wallet history (getWalletHistory) returns a different shape:

Organization orders

Every order method takes walletScope. With walletScope: 'organization' the same call operates on an org-owned vault instead of a personal one; the request and response shapes are identical. See Organization Vaults.

Complete flow

multisig.threshold is a string on MultisigsItem, so coerce it before comparing.

Next

Multisig Vaults

Creating and activating the vault an order runs on.

Multisig Network Fees

Who pays at each lifecycle step, per chain.

Preflight

Simulate before you collect a signature.

Errors

SignatureIntentMismatchError and the rest of the taxonomy.
Last modified on October 27, 2026