2.5 KiB
2.5 KiB
Export State Machine (exportToMainnet)
Purpose: Precise state machine for the export path from Chain 138 to Ethereum Mainnet, including failure handling and queued intents while CCIP is not live.
States
| State | Description |
|---|---|
| DISABLED | exportsEnabled == false; no CCIP send allowed. |
| IDLE | Ready; caps OK; may accept exportToMainnet() call. |
| PENDING_CAP_CHECK | Validating per-tx, daily, and hourly caps. |
| PENDING_CCIP_SEND | Calling CCIPWETH9Bridge.sendCrossChain. |
| QUEUED | Intent recorded; CCIP not live or simulation mode. |
| FAILED | Revert or recorded failure; cooldown applies. |
| COMPLETED | Export message accepted by CCIP. |
Diagram
stateDiagram-v2
direction LR
DISABLED: exportsEnabled = false
IDLE: Ready, caps OK
PENDING_CAP_CHECK: Check per-tx/daily/hourly
PENDING_CCIP_SEND: Call CCIPWETH9Bridge
QUEUED: Intent recorded, CCIP not live
FAILED: Revert / record failure
COMPLETED: Export sent
[*] --> DISABLED
DISABLED --> IDLE: exportsEnabled = true
IDLE --> PENDING_CAP_CHECK: exportToMainnet() called
PENDING_CAP_CHECK --> FAILED: Caps exceeded
PENDING_CAP_CHECK --> PENDING_CCIP_SEND: Caps OK
PENDING_CCIP_SEND --> QUEUED: CCIP not live / simulation
PENDING_CCIP_SEND --> FAILED: Send revert
PENDING_CCIP_SEND --> COMPLETED: Message accepted
QUEUED --> PENDING_CCIP_SEND: Retry when live
FAILED --> IDLE: After cooldown / admin reset
COMPLETED --> IDLE: Reset counters as needed
Failure handling
- On revert from CCIP or CCIPWETH9Bridge: transition to FAILED.
- Optional persistent intent (amount, recipient) for retry when CCIP is live.
- Cooldown (e.g.
cooldownBlocks) before next attempt from FAILED → IDLE. - Admin may reset FAILED state after investigation.
Queued intents
- While
exportsEnabled == false, bot or executor may record "intent to export X WETH9" on-chain (e.g. single slot or small queue) or off-chain. - When
exportsEnabledis set true, process queue (or sweep in next daily run). - Implemented: StrategyExecutor138 provides a single-slot intent queue:
recordExportIntent(token, amount)— callable by KEEPER whenexportsEnabled == false; stores one pending intent (overwrites any previous).processPendingIntent(deadline)— callable by KEEPER whenexportsEnabled == true; executes the pending intent (same path asexportToMainnet) and clears the slot.