OracleSplitEscrow

oraclesplitescrow · conditional-settlement · 1132 B runtime · funds-movement

scores

source

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract OracleSplitEscrow {
    address public immutable recipientA;
    address public immutable recipientB;
    address public immutable verifier;
    bool public settled;

    constructor(address _recipientA, address _recipientB, address _verifier) {
        recipientA = _recipientA;
        recipientB = _recipientB;
        verifier = _verifier;
    }

    receive() external payable {}

    function settle(bytes calldata data) external {
        require(!settled, "already settled");
        settled = true;

        (bool ok, bytes memory ret) = verifier.staticcall(data);
        require(ok && ret.length == 32, "invalid verifier response");

        bool releaseToA = abi.decode(ret, (uint256)) != 0;
        address target = releaseToA ? recipientA : recipientB;
        (bool sent,) = target.call{value: address(this).balance}("");
        require(sent, "transfer failed");
    }
}