Skip to content

ForgeEscrow (MRC-60 Phase 3)

Pay-per-call escrow with cron-driven off-chain settlement. Live on Arbitrum One and Base mainnet since 2026-05-09.

Source: registry-contracts/contracts/forge/ForgeEscrow.sol

Deployments

ChainAddress
Arbitrum One0x88E32F…89Da5
Base mainnet0xCC258a…454F

Purpose

Holds MOR deposits for tool invocations; releases payment to the tool provider after the off-chain relayer signs settleInvoice().

Flow

  1. Caller calls payInvoice() → MOR transfers from caller to escrow.
  2. Off-chain tool execution (out of band).
  3. Relayer at relayer.hypnex.xyz runs the scheduled settleInvoice() Worker → MOR moves to provider; protocol fee to Hypnex.

Default split: 90/10 owner / protocol. Provider exit window: 24h self-custody delay.

Functions

payInvoice

solidity
function payInvoice(
    bytes32 toolId,
    uint256 amount,
    bytes32 traceId
) external;

settleInvoice

solidity
function settleInvoice(
    bytes32 traceId,
    address provider,
    uint256 amount,
    bytes calldata signature
) external onlyRelayer;

Signature is verified against the relayer EOA 0x3A63c0…a917.

dispute

solidity
function dispute(bytes32 traceId, string calldata reason) external;

Caller may dispute within disputeWindow (default 24h). Disputed invoices skip auto-settlement and go to manual resolution.

Events

solidity
event InvoicePaid(bytes32 indexed traceId, bytes32 indexed toolId, address indexed payer, uint256 amount);
event InvoiceSettled(bytes32 indexed traceId, address indexed provider, uint256 amount, uint256 fee);
event InvoiceDisputed(bytes32 indexed traceId, string reason);

Operator addresses

  • Relayer EOA: 0x3A63c0…a917 (signs settleInvoice calls; cron-driven worker at relayer.hypnex.xyz)
  • Treasury: see TREASURY_POLICY.md

SDK

See hypnex-forge for TypeScript and Python wrappers.

See also

Released under the MIT License.