Skip to main content
Cardinal Programmable Escrow is an on-chain settlement model for buyers and sellers handling higher-value or irreversible digital-asset transactions. Funds are locked in the escrow contract rather than a Cardinal-controlled operating wallet.
The escrow contracts implement meaningful settlement functionality, but production launch and external security hardening are still underway. Cardinal does not currently claim that these contracts are externally audited or ready for unrestricted mainnet use.

Implemented contract models

Cardinal currently has two separate ERC-20 escrow implementations: Milestone schedules, per-escrow custom policies, appeals, a production arbitrator network, and DAO governance are product roadmap layers and are not described here as live contract functionality.

Protected settlement flow

If any transaction detail changes, repeat the protection check before requesting a new approval or contract call.

Participants and authority

The dispute resolver can direct disputed funds to either counterparty, and the upgrader can authorise a new implementation. Production deployments require verified role owners, multisignature controls, monitoring, documented procedures, and independent security review.

Escrow lifecycle

Terminal Released and Refunded escrows cannot be processed again.

Create and fund escrow

The buyer calls createEscrow. The contract requires:
  • A non-zero seller address
  • A non-zero ERC-20 token address
  • An amount greater than zero
  • An acceptance deadline later than the current block timestamp
  • Sufficient token balance and allowance
The contract transfers the full amount from the buyer, records the fee for that escrow, and creates it with Created status.
Do not request unlimited token approval by default.

Seller acceptance

Only the recorded seller can accept, and acceptance must occur on or before acceptanceDeadline. Acceptance changes the status to Accepted and stamps a releaseDeadline using the contract’s current release-window configuration. The release window is bounded on-chain between one hour and 30 days. An escrow already accepted keeps its recorded release deadline if the global release-window setting later changes.

Buyer release

Only the buyer can release an Accepted escrow. The buyer may release before or after the recorded deadline, provided the escrow has not moved into dispute or another terminal state. On release:
The fee is transferred to the configured fee recipient and the remaining amount is transferred to the recorded seller.

Refund before acceptance

Only the buyer can refund, and only while the escrow remains Created. The full locked amount returns to the buyer and no settlement fee is charged. Once the seller accepts, the buyer must use release or dispute rather than the pre-acceptance refund path.

Seller claim after timeout

Only the seller can claim, and only when:
  • The escrow remains Accepted
  • The release deadline has passed
  • Neither party moved it into dispute
This prevents an unresponsive buyer from leaving an accepted, undisputed escrow locked indefinitely.

Raise a dispute

The buyer or seller may dispute an Accepted escrow on or before the release deadline. The status becomes Disputed, preventing buyer release and timed seller claim. Dispute creation moves no funds and remains callable while the contract is paused. This preserves the parties’ ability to stop settlement during the release window.

Resolve a dispute

Only the configured dispute resolver can resolve a Disputed escrow. The current contract uses one resolver address. A production deployment should point that authority to an approved multisignature or controlled resolver system rather than an undocumented personal key.

Read escrow details

Use this contract response as the source of truth for UI state and available actions.

Fees

The stored fee is charged only on settlement to the seller. A refund returns the full escrow amount to the buyer. The active commercial rate is deployment- and pilot-specific. Applications must read verified configuration rather than hardcoding an illustrative percentage.

Multisig Escrow

The separate Multisig Escrow contract supports higher-value ERC-20 settlement requiring a configurable threshold of authorised approvers.
Implemented methods include: An approver cannot approve the same escrow twice. The contract prevents reducing the approver set below the active threshold.
The current Multisig Escrow uses a global authorised approver set and global release threshold. Do not describe it as a buyer-selected panel, milestone engine, or per-escrow approval policy.

Contract events

Applications can index events for history and notifications, but should confirm the current state through the contract before offering an action.

Application safeguards

  • Run the Protection API before token approval and escrow funding.
  • Bind the verdict to the exact buyer, seller, network, token, amount, deadline, and contract.
  • Never continue from BLOCK.
  • Require explicit acknowledgement for REVIEW.
  • Verify network, proxy address, implementation address, token address, and ABI for the selected environment.
  • Display the active fee and every deadline before wallet confirmation.
  • Use on-chain timestamps rather than only local countdowns.
  • Read contract state before release, refund, claim, dispute, or resolution.
  • Prevent duplicate wallet submissions.
  • Keep API credentials and administrative keys out of frontend code.
  • Wait for confirmed transactions before displaying a terminal status.

Current production boundary

Before unrestricted mainnet use, Cardinal must complete and publish the intended deployment configuration, verified proxy and implementation addresses, ABI, supported tokens, fee policy, role owners, dispute operating policy, monitoring and incident procedures, and external security review status.

Protection API

Run the required risk decision before escrow funding.

SafeSend

Review the delayed cancellable transfer flow.