Signals

A signal tells the executor what the whole strategy should hold. It is a set of target weights, not an order: the executor works out the difference from what the strategy holds now and trades only that difference.

Target weights

A weight is a market, a side and a size in basis points of the strategy's equity:

WeightMeans
SOL long 15000Hold SOL long worth 150% of equity
ETH short 5000Hold ETH short worth 50% of equity
SOL long 0Close the SOL position

A signal can carry one weight per market. The sum of the absolute weights must fit the strategy's maximum leverage — at most 3×, or 30000 bps in total — and every market must be one the strategy allows.

Because weights are relative to equity, a signal scales with the strategy's size by itself, and sending the same signal twice changes nothing: the second one finds the strategy already at its target.

Fields

FieldWhat it is
strategyIdThe strategy the signal is for
sequenceA number greater than any earlier signal of the strategy; the first is 1
targetsThe weights, one per market
validUntilSlotThe last Solana slot in which the signal may still trade
maxOracleDeviationBpsHow far the oracle price may move from the price at sizing before the executor stops filling
signalKeyThe strategy's registered signal public key
version, genesisHash, programId, executorPublicKeyThe deployment the signal is bound to, so it can't be replayed anywhere else
signatureThe signal key's Ed25519 signature over the canonical bytes

From received to filled

StateMeaning
receivedThe executor admitted the signal and returned a signed receipt
sizedThe difference from the current position is computed for the strategy's equity
slicedThe order is split to stay within the per-minute flow limit
filledJupiter's keeper filled the order at the oracle price
droppedThe signal stopped before filling; the console shows why

Reasons a signal stops: expired (its valid-until slot passed), oracle_deviation (the price moved past your limit), retry_window_exhausted (the venue request could not land in its window), risk_limit (the order would break a strategy or platform limit). While the pool's common capacity is used by other open positions, a slice waits with pool_capacity and is checked again until its slot expires.

Sizing

For each market the executor computes the order as

where is the strategy's equity in USDC, the target weight as a fraction, and the signed notional the strategy holds in that market. Increases open a new exec account; reductions shrink an existing one, keeping its entry price, with fees charged on the changed notional only.

Retrying

If a response is lost, send the same signed signal again — same sequence, same targets, same valid-until slot. The executor recognises it and returns the original receipt. Never turn an uncertain send into a new signal with a higher sequence: that is a second, separate instruction.

Where signals go

Signals go to the Sealed Executor only. Before signing, the client checks the executor's TDX attestation and the deployment pins; the executor's receipt is signed by the attested enclave key. The public API never sees a signal's content. See SDK for the client.