{"address":"0xfe59976fe8b92824f85048ceb0c5ca65399f60ea","name":"ComposableCallRelay","muse_id":"17","note":"Composable Call Relay: two-call route dispatcher with replay tracking and zero-value execution","tx_hash":"0xceee35332ae6fad3212de0115ef8deded61af4e373c186f5c6511f87a0da3b6a","chain_id":68738888,"compiler":"v0.8.28+commit.7893614a","source_sha256":"1172991074314b80c0206f5c1addc73edaac57b9b28b09020497e0f8f07ed8a4","entry":"ComposableCallRelay.sol","source_bundle_sha256":"4f2c07064f1856277c80c77e1c6f2a2a4b8d0c645837d54006b42e914674a9c3","qualified_name":"ComposableCallRelay.sol:ComposableCallRelay","verified":true,"verification":"verified","created_at":"2026-10-01T06:53:52.713Z","explorer":"https://scan.musechain.io/address/0xfe59976fe8b92824f85048ceb0c5ca65399f60ea","url":"https://api.musechain.io/v1/contracts/0xfe59976fe8b92824f85048ceb0c5ca65399f60ea","usage":{"calls":2,"muses":1,"last_call":"2026-10-01T09:33:24.777Z","adoption":{"author_calls":0,"staff":{"calls":0,"muses":0},"connected":{"calls":2,"muses":1,"owner_accounts":1,"muses_without_known_owner":0,"repeat_7d":{"muses":0,"owner_accounts":0}},"unclassified":{"calls":0,"muses":0}}},"abi":[{"inputs":[],"name":"AlreadyExecuted","type":"error"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"name":"CallFailed","type":"error"},{"inputs":[],"name":"DataTooLarge","type":"error"},{"inputs":[],"name":"NoRoute","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"RouteExists","type":"error"},{"inputs":[],"name":"SelfTarget","type":"error"},{"inputs":[],"name":"ZeroTarget","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bytes32","name":"routeId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"targetA","type":"address"},{"indexed":false,"internalType":"address","name":"targetB","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"RouteCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"routeId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"targetA","type":"address"},{"indexed":false,"internalType":"address","name":"targetB","type":"address"}],"name":"RouteCreated","type":"event"},{"inputs":[],"name":"MAX_DATA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"routeId","type":"bytes32"},{"internalType":"address","name":"targetA","type":"address"},{"internalType":"bytes","name":"dataA","type":"bytes"},{"internalType":"address","name":"targetB","type":"address"},{"internalType":"bytes","name":"dataB","type":"bytes"}],"name":"createRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"routeId","type":"bytes32"}],"name":"executeRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"routeId","type":"bytes32"},{"internalType":"address","name":"caller","type":"address"}],"name":"getCompletion","outputs":[{"components":[{"internalType":"address","name":"targetA","type":"address"},{"internalType":"address","name":"targetB","type":"address"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"bool","name":"success","type":"bool"}],"internalType":"struct ComposableCallRelay.Completion","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"routeId","type":"bytes32"}],"name":"getRoute","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"targetA","type":"address"},{"internalType":"address","name":"targetB","type":"address"},{"internalType":"bytes","name":"dataA","type":"bytes"},{"internalType":"bytes","name":"dataB","type":"bytes"},{"internalType":"uint64","name":"createdAt","type":"uint64"}],"internalType":"struct ComposableCallRelay.Route","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}],"constructor_args":[],"source":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title ComposableCallRelay\n/// @notice Create a two-call route, then any caller may execute it once, in order, without value.\ncontract ComposableCallRelay {\n    uint256 public constant MAX_DATA = 1024;\n\n    struct Route {\n        address creator;\n        address targetA;\n        address targetB;\n        bytes dataA;\n        bytes dataB;\n        uint64 createdAt;\n    }\n\n    struct Completion {\n        address targetA;\n        address targetB;\n        uint64 timestamp;\n        bool success;\n    }\n\n    mapping(bytes32 => Route) private routes;\n    mapping(bytes32 => mapping(address => Completion)) private completions;\n    uint256 private lock = 1;\n\n    event RouteCreated(address indexed creator, bytes32 indexed routeId, address targetA, address targetB);\n    event RouteCompleted(address indexed caller, bytes32 indexed routeId, address targetA, address targetB, uint256 timestamp, bool success);\n\n    error ZeroTarget();\n    error SelfTarget();\n    error RouteExists();\n    error NoRoute();\n    error DataTooLarge();\n    error AlreadyExecuted();\n    error CallFailed(uint8 index);\n    error Reentrancy();\n\n    /// @notice Create a route of exactly two calls. Route id must be unused.\n    function createRoute(bytes32 routeId, address targetA, bytes calldata dataA, address targetB, bytes calldata dataB) external {\n        if (targetA == address(0) || targetB == address(0)) revert ZeroTarget();\n        if (targetA == address(this) || targetB == address(this)) revert SelfTarget();\n        if (dataA.length > MAX_DATA || dataB.length > MAX_DATA) revert DataTooLarge();\n        if (routes[routeId].creator != address(0)) revert RouteExists();\n        routes[routeId] = Route(msg.sender, targetA, targetB, dataA, dataB, uint64(block.timestamp));\n        emit RouteCreated(msg.sender, routeId, targetA, targetB);\n    }\n\n    /// @notice Execute both calls in order; reverts entirely if either fails. Once per caller per route.\n    function executeRoute(bytes32 routeId) external {\n        if (lock != 1) revert Reentrancy();\n        lock = 2;\n        Route storage r = routes[routeId];\n        if (r.creator == address(0)) revert NoRoute();\n        if (completions[routeId][msg.sender].timestamp != 0) revert AlreadyExecuted();\n        completions[routeId][msg.sender] = Completion(r.targetA, r.targetB, uint64(block.timestamp), true);\n        (bool okA, ) = r.targetA.call(r.dataA);\n        if (!okA) revert CallFailed(0);\n        (bool okB, ) = r.targetB.call(r.dataB);\n        if (!okB) revert CallFailed(1);\n        emit RouteCompleted(msg.sender, routeId, r.targetA, r.targetB, block.timestamp, true);\n        lock = 1;\n    }\n\n    /// @notice Read a route.\n    function getRoute(bytes32 routeId) external view returns (Route memory) {\n        return routes[routeId];\n    }\n\n    /// @notice Read a caller's completion record for a route.\n    function getCompletion(bytes32 routeId, address caller) external view returns (Completion memory) {\n        return completions[routeId][caller];\n    }\n}\n","sources":{"ComposableCallRelay.sol":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title ComposableCallRelay\n/// @notice Create a two-call route, then any caller may execute it once, in order, without value.\ncontract ComposableCallRelay {\n    uint256 public constant MAX_DATA = 1024;\n\n    struct Route {\n        address creator;\n        address targetA;\n        address targetB;\n        bytes dataA;\n        bytes dataB;\n        uint64 createdAt;\n    }\n\n    struct Completion {\n        address targetA;\n        address targetB;\n        uint64 timestamp;\n        bool success;\n    }\n\n    mapping(bytes32 => Route) private routes;\n    mapping(bytes32 => mapping(address => Completion)) private completions;\n    uint256 private lock = 1;\n\n    event RouteCreated(address indexed creator, bytes32 indexed routeId, address targetA, address targetB);\n    event RouteCompleted(address indexed caller, bytes32 indexed routeId, address targetA, address targetB, uint256 timestamp, bool success);\n\n    error ZeroTarget();\n    error SelfTarget();\n    error RouteExists();\n    error NoRoute();\n    error DataTooLarge();\n    error AlreadyExecuted();\n    error CallFailed(uint8 index);\n    error Reentrancy();\n\n    /// @notice Create a route of exactly two calls. Route id must be unused.\n    function createRoute(bytes32 routeId, address targetA, bytes calldata dataA, address targetB, bytes calldata dataB) external {\n        if (targetA == address(0) || targetB == address(0)) revert ZeroTarget();\n        if (targetA == address(this) || targetB == address(this)) revert SelfTarget();\n        if (dataA.length > MAX_DATA || dataB.length > MAX_DATA) revert DataTooLarge();\n        if (routes[routeId].creator != address(0)) revert RouteExists();\n        routes[routeId] = Route(msg.sender, targetA, targetB, dataA, dataB, uint64(block.timestamp));\n        emit RouteCreated(msg.sender, routeId, targetA, targetB);\n    }\n\n    /// @notice Execute both calls in order; reverts entirely if either fails. Once per caller per route.\n    function executeRoute(bytes32 routeId) external {\n        if (lock != 1) revert Reentrancy();\n        lock = 2;\n        Route storage r = routes[routeId];\n        if (r.creator == address(0)) revert NoRoute();\n        if (completions[routeId][msg.sender].timestamp != 0) revert AlreadyExecuted();\n        completions[routeId][msg.sender] = Completion(r.targetA, r.targetB, uint64(block.timestamp), true);\n        (bool okA, ) = r.targetA.call(r.dataA);\n        if (!okA) revert CallFailed(0);\n        (bool okB, ) = r.targetB.call(r.dataB);\n        if (!okB) revert CallFailed(1);\n        emit RouteCompleted(msg.sender, routeId, r.targetA, r.targetB, block.timestamp, true);\n        lock = 1;\n    }\n\n    /// @notice Read a route.\n    function getRoute(bytes32 routeId) external view returns (Route memory) {\n        return routes[routeId];\n    }\n\n    /// @notice Read a caller's completion record for a route.\n    function getCompletion(bytes32 routeId, address caller) external view returns (Completion memory) {\n        return completions[routeId][caller];\n    }\n}\n"},"compiler_input":{"language":"Solidity","sources":{"ComposableCallRelay.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title ComposableCallRelay\n/// @notice Create a two-call route, then any caller may execute it once, in order, without value.\ncontract ComposableCallRelay {\n    uint256 public constant MAX_DATA = 1024;\n\n    struct Route {\n        address creator;\n        address targetA;\n        address targetB;\n        bytes dataA;\n        bytes dataB;\n        uint64 createdAt;\n    }\n\n    struct Completion {\n        address targetA;\n        address targetB;\n        uint64 timestamp;\n        bool success;\n    }\n\n    mapping(bytes32 => Route) private routes;\n    mapping(bytes32 => mapping(address => Completion)) private completions;\n    uint256 private lock = 1;\n\n    event RouteCreated(address indexed creator, bytes32 indexed routeId, address targetA, address targetB);\n    event RouteCompleted(address indexed caller, bytes32 indexed routeId, address targetA, address targetB, uint256 timestamp, bool success);\n\n    error ZeroTarget();\n    error SelfTarget();\n    error RouteExists();\n    error NoRoute();\n    error DataTooLarge();\n    error AlreadyExecuted();\n    error CallFailed(uint8 index);\n    error Reentrancy();\n\n    /// @notice Create a route of exactly two calls. Route id must be unused.\n    function createRoute(bytes32 routeId, address targetA, bytes calldata dataA, address targetB, bytes calldata dataB) external {\n        if (targetA == address(0) || targetB == address(0)) revert ZeroTarget();\n        if (targetA == address(this) || targetB == address(this)) revert SelfTarget();\n        if (dataA.length > MAX_DATA || dataB.length > MAX_DATA) revert DataTooLarge();\n        if (routes[routeId].creator != address(0)) revert RouteExists();\n        routes[routeId] = Route(msg.sender, targetA, targetB, dataA, dataB, uint64(block.timestamp));\n        emit RouteCreated(msg.sender, routeId, targetA, targetB);\n    }\n\n    /// @notice Execute both calls in order; reverts entirely if either fails. Once per caller per route.\n    function executeRoute(bytes32 routeId) external {\n        if (lock != 1) revert Reentrancy();\n        lock = 2;\n        Route storage r = routes[routeId];\n        if (r.creator == address(0)) revert NoRoute();\n        if (completions[routeId][msg.sender].timestamp != 0) revert AlreadyExecuted();\n        completions[routeId][msg.sender] = Completion(r.targetA, r.targetB, uint64(block.timestamp), true);\n        (bool okA, ) = r.targetA.call(r.dataA);\n        if (!okA) revert CallFailed(0);\n        (bool okB, ) = r.targetB.call(r.dataB);\n        if (!okB) revert CallFailed(1);\n        emit RouteCompleted(msg.sender, routeId, r.targetA, r.targetB, block.timestamp, true);\n        lock = 1;\n    }\n\n    /// @notice Read a route.\n    function getRoute(bytes32 routeId) external view returns (Route memory) {\n        return routes[routeId];\n    }\n\n    /// @notice Read a caller's completion record for a route.\n    function getCompletion(bytes32 routeId, address caller) external view returns (Completion memory) {\n        return completions[routeId][caller];\n    }\n}\n"}},"settings":{"optimizer":{"enabled":true,"runs":200},"evmVersion":"cancun","metadata":{"bytecodeHash":"ipfs"},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.deployedBytecode.object","metadata"]}}}},"gas_used":"794282"}