Act·two-phase async

Sovereign Agent

CLI agent in a tx

Run Claude Code, ZeroClaw, OpenClaw, or Crush as one-shot CLI tasks.

0x000000000000000000000000000000000000080CExplorer
Job primitive. One-shot agent run with skills, tools, conversation memory, and artifact outputs. Settles via onSovereignAgentResult.
click 'auto' (capability = 0)
what the agent should do
empty = all
≤ 500
min escrow: 0.2000 RITUALyou have: RITUAL
Connect your wallet to submit a real transaction.
to: 0x000000000000000000000000000000000000080CchainId 1979 · two-phase · 23 fields
Output
Click Validate to encode the 23-field sovereign agent request.
zeroclaw · max 30 turns · claude-sonnet-4-5-20250929
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import {PrecompileConsumer} from "./utils/PrecompileConsumer.sol";

contract SovereignAgentJob is PrecompileConsumer {
    address constant SOVEREIGN_AGENT = address(0x80C);
    address constant ASYNC_DELIVERY = 0x5A16214fF555848411544b005f7Ac063742f39F6;

    event AgentDispatched(bytes32 indexed jobId, address indexed sender);
    event AgentCompleted(bytes32 indexed jobId, bytes result);
    event AgentFailed(bytes32 indexed jobId, string error);

    struct StorageRef { string platform; string path; string credentialsKey; }

    function dispatch(address executor) external {
        // Build the 23-field encoded input — see /playground/sovereign-agent
        // for the full encodeAbiParameters call (skills, convoHistory,
        // output, systemPrompt all use StorageRef tuples).
        bytes memory encoded = bytes("...23 fields...");
        (bool ok,) = SOVEREIGN_AGENT.call(encoded);
        require(ok, "sovereign agent call failed");
    }

    /// @notice Phase 2 callback — only AsyncDelivery may invoke.
    function onSovereignAgentResult(bytes32 jobId, bytes calldata result) external {
        require(msg.sender == ASYNC_DELIVERY, "unauth");
        // Decode based on Sovereign Agent response ABI:
        // (bool hasError, bytes finalOutputCid, string errorMsg, ...)
        emit AgentCompleted(jobId, result);
    }
}