A trigger is the condition under which a commitment becomes executable. fillr supports three variants.
JupiterRoutable
Fill as soon as Jupiter has a route. The most common choice. Set min_liquidity_usd as a soft floor — this is guidance for keepers, not an on-chain enforced bound. The real enforcement happens in execute_commitment via min_fill and max_price: if Jupiter finds a route but it's too thin, the on-chain checks reject the swap.
| use when | You want to buy as early as possible — typically right at launch. |
| on-chain enforces | Nothing trigger-specific. Min fill + max price are still enforced. |
| field | min_liquidity_usd: u64 — informational; for keeper UIs. |
TimeOnly
Fill at or after a specific Unix timestamp. Useful for unlocks where you know exactly when liquidity goes live and don't want to depend on Jupiter's indexer noticing — the keeper executes the instant time has passed regardless of routing latency.
| use when | There's a known launch timestamp and you want guaranteed timing. |
| on-chain enforces | Reverts with TriggerNotReached if now < unlock_ts. |
| field | unlock_ts: i64 — Unix seconds. |
TimeOnly does not check Jupiter routability. If you set a timestamp and Jupiter doesn't have a route at that time, the keeper's attempt fails — the commitment remains active until a route exists.JupiterRoutableAfter
Both conditions ANDed. Time has passed AND Jupiter is routable. The strongest constraint — fill only when both are true.
| use when | You know the launch time but want to avoid filling on a pre-launch test pool with thin liquidity. |
| on-chain enforces | Reverts with TriggerNotReached if now < earliest_ts. |
| fields | min_liquidity_usd: u64 + earliest_ts: i64 |
What the program actually enforces
The trigger gate is an early-revert in execute_commitment. The load-bearing enforcement is the post-CPI bounds check: regardless of trigger, the program reads the buyer's target-ATA balance after the Jupiter swap completes and reverts if either tokens_received < min_fill or effective_price > max_price. The trigger field is ordering — it can't open you up to a bad fill.