LogoLogo
HomeTelegram
  • Welcome to Opus
  • Introduction
    • ▸ What is Opus?
      • Overview of the product
      • Vision: Automation layer for the decentralized web
      • Key verticals
      • EIP-7702
  • ▸ How Opus Works
    • Browser-based architecture (no install)
    • EIP-7702 session-based automation
    • AI agent decision-making process
    • Smart contract interaction layer
  • ⚙️ Architecture
    • ▸ System Overview
      • High-level architecture diagram
    • ▸ EIP-7702 Integration
      • Comparison vs EIP-4337 / traditional EOAs
    • ▸ Smart Contract Design
      • Core contracts:
      • Contract architecture diagrams
      • Gas considerations
  • ⚡ Use Cases
    • ▸ DeFi Automation
    • ▸ NFT Trading
    • ▸ DAO Governance
  • 🛠️ Getting Started
    • ▸ dApp Walkthrough
      • Getting Started with Opus dApp
      • Logs and automation history
  • 🧪 Developers
    • ▸ API Access
      • Endpoints for task creation, monitoring, retrieval
      • Auth via wallet signatures
    • ▸ Custom Strategies
      • DSL (Domain Specific Language) or JSON schema explanation
      • Writing your own task logic
    • ▸ Contract ABIs & Events
      • ABI snippets with examples
      • Event logs used by the platform
  • 🔐 Security & Audits
    • ▸ EIP-7702 Session Key Risks
      • Threat model
      • Session revocation mechanism
      • Time-bound delegation logic
Powered by GitBook
On this page
Export as PDF
  1. ⚙️ Architecture
  2. ▸ Smart Contract Design

Core contracts:

AutomationRegistry.sol

struct Task {
    address owner;
    bytes conditionData;
    bytes actionData;
    uint256 createdAt;
    bool active;
}

mapping(uint256 => Task) public tasks;

function registerTask(bytes calldata condition, bytes calldata action) external returns (uint256) {
    uint256 taskId = nextTaskId++;
    tasks[taskId] = Task(msg.sender, condition, action, block.timestamp, true);
    emit TaskCreated(taskId, msg.sender);
    return taskId;
}

StrategyExecutor.sol

function execute(uint256 taskId) external {
    Task memory task = registry.getTask(taskId);
    require(conditionChecker.check(task.conditionData), "Condition not met");
    (bool ok, ) = address(this).call(task.actionData);
    require(ok, "Execution failed");
    emit TaskExecuted(taskId);
}

ConditionChecker.sol

function check(bytes calldata data) external view returns (bool) {
    (uint256 currentPrice, uint256 triggerBelow) = abi.decode(data, (uint256, uint256));
    return currentPrice < triggerBelow;
}
Previous▸ Smart Contract DesignNextContract architecture diagrams

Last updated 13 days ago