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
| Chain | Address |
|---|---|
| Arbitrum One | 0x88E32F…89Da5 |
| Base mainnet | 0xCC258a…454F |
Purpose
Holds MOR deposits for tool invocations; releases payment to the tool provider after the off-chain relayer signs settleInvoice().
Flow
- Caller calls
payInvoice()→ MOR transfers from caller to escrow. - Off-chain tool execution (out of band).
- 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(signssettleInvoicecalls; cron-driven worker at relayer.hypnex.xyz) - Treasury: see
TREASURY_POLICY.md
SDK
See hypnex-forge for TypeScript and Python wrappers.
See also
ForgeToolRegistry— tool listing (Phase 1)- Architecture overview — settlement flow diagrams