ava_approve_execute
Human-in-the-loop approve: the one call that actually settles a plan from ava_copilot_turn. It is gated by the bound mandate's status and constraints and by server-side policy limits, and it CAN REFUSE (e.g. mandate paused/cancelled, a policy violation, a stale preview hash); a refusal means no funds moved and no success receipt was written, only a refusal record. Testnet mode settles against simulated balances and returns a receipt + before/after balances, never a real chain. Mainnet mode signs with the caller's own Turnkey wallet and submits for real where a venue is live, and fails closed everywhere else, so it never claims a fill it cannot show. Call ava_list_venues for which routes are live rather than assuming; that tool reads the same registry this one enforces, so it cannot drift from what will actually execute. NEVER call without explicit user confirmation of the previewed quote.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default testnet. Live is fail-closed without a submit path. | |
| portal | Yes | Portal slug matching the pending plan (e.g. sui) | |
| userId | Yes | Same userId used on ava_copilot_turn / portfolio | |
| executionId | Yes | executionId from actions[].type === approve_execute on the prior copilot turn | |
| previewHash | No | previewHash from ava_preview_tx. Binds the signature to the artifact the human reviewed; a stale hash fails before signing. |