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:
| Weight | Means |
|---|---|
SOL long 15000 | Hold SOL long worth 150% of equity |
ETH short 5000 | Hold ETH short worth 50% of equity |
SOL long 0 | Close 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
| Field | What it is |
|---|---|
strategyId | The strategy the signal is for |
sequence | A number greater than any earlier signal of the strategy; the first is 1 |
targets | The weights, one per market |
validUntilSlot | The last Solana slot in which the signal may still trade |
maxOracleDeviationBps | How far the oracle price may move from the price at sizing before the executor stops filling |
signalKey | The strategy's registered signal public key |
version, genesisHash, programId, executorPublicKey | The deployment the signal is bound to, so it can't be replayed anywhere else |
signature | The signal key's Ed25519 signature over the canonical bytes |
From received to filled
| State | Meaning |
|---|---|
received | The executor admitted the signal and returned a signed receipt |
sized | The difference from the current position is computed for the strategy's equity |
sliced | The order is split to stay within the per-minute flow limit |
filled | Jupiter's keeper filled the order at the oracle price |
dropped | The 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.