Skip to main content
SafeSend combines Cardinal’s pre-transaction risk decision with a delayed ERC-20 settlement path. It gives the sender a cancellation window before the transfer becomes releasable.
SafeSend currently operates as a connected testnet flow using MetaMask, Arbitrum Sepolia, test USDC, the Protection API, and a SafeSend testnet contract path. It is not presented as audited mainnet settlement.

Why SafeSend exists

A standard token transfer becomes difficult or impossible to reverse once confirmed. SafeSend introduces two protection points:
  1. The Protection API evaluates the complete transaction intent before token approval or contract execution.
  2. The SafeSend contract holds the ERC-20 tokens until a future release time, allowing the sender to cancel while the transfer remains pending.

Protected flow

The Protection API call must happen before any token approval or SafeSend contract transaction.

Pilot environment

Contract addresses, ABIs, token addresses, fee configuration, and supported mainnet deployments will be published only after they are verified for the relevant environment.

Protection decision

SafeSend uses the recommended_action returned by POST /api/check-transaction.
If the Protection API is unavailable, SafeSend must show a real error. A connected integration must never silently fall back to mock data or a default ALLOW.
Re-run the check if the sender, recipient, network, token, amount, contract, approval amount, permissions, or release configuration changes.

Transfer lifecycle

A SafeSend transfer has four contract states: A transfer can move only from Pending to Cancelled or Released. A cancelled or released transfer cannot be processed again.

Create a transfer

The contract requires:
  • A non-zero recipient address
  • A non-zero ERC-20 token address
  • An amount greater than zero
  • A release time later than the current block timestamp
  • Sufficient token allowance and balance
The full amount is transferred from the sender into the SafeSend contract. The contract records the sender, recipient, token, total amount, calculated fee, release time, and Pending status.

Approval sequence

Do not request an unlimited approval by default. The frontend should clearly show the token, amount, recipient, release time, fee preview, network, and contract destination before either wallet prompt.

Cancel a transfer

Cancellation succeeds only when:
  • The transfer exists
  • Its status is Pending
  • The caller is the original sender
  • The current block timestamp is earlier than releaseTime
On cancellation, the status becomes Cancelled and the full locked amount is returned to the sender.
The sender cannot cancel after the release time has been reached. Applications should show the on-chain release time rather than relying only on a local countdown.

Release a transfer

Release succeeds only when the transfer exists, remains Pending, and its release time has been reached. Anyone may call the release function after that time. This allows settlement to be triggered by the recipient, sender, or an authorised automation service without giving that caller control over the destination or amount. On release:
The fee is transferred to the configured fee recipient and the remaining amount is transferred to the recorded recipient.

Read transfer details

The returned transfer contains: Use the contract response as the source of truth when showing transfer status.

Preview the fee

The contract calculates the fee in basis points:
The active pilot fee configuration is environment-specific. Read it from the verified deployment rather than hardcoding an illustrative rate.

Contract events

Partner applications can index the first three events to keep transfer histories synchronised, but should confirm current state with getSafeSend.

Application safeguards

  • Bind every protection verdict to the exact transaction intent that was checked.
  • Never continue from BLOCK.
  • Require explicit acknowledgement for REVIEW.
  • Verify the wallet network before every approval and contract call.
  • Display addresses in full or provide an unambiguous expansion and copy action.
  • Display token decimals correctly and avoid floating-point arithmetic.
  • Wait for confirmed transactions before updating the final status.
  • Prevent duplicate submission while a wallet request is pending.
  • Treat contract reads as the source of truth for cancellation and release eligibility.
  • Keep Protection API credentials on a trusted backend.

Current production boundary

Before mainnet use, Cardinal must publish and verify the intended network deployment, proxy and implementation addresses, ABI, supported tokens, active fee policy, monitoring process, external security review status, and production incident controls.

Protection API

Review the risk decision that must run before SafeSend.

Implementation status

See what is live, in testing, and planned.