Integration proposal · 7 September 2026

Capxul × Moove

Moove Receive as a deposit rail into Safe-based business treasuries. One change on the Moove side unlocks it. Everything on the Capxul side is already live on chain.

Diagram 1 · Architecture

The money path we want to build

A business raises an invoice in Capxul. Capxul mints a Moove payment link. The payer settles in any asset on any chain, Moove's routing converts it, and the funds land in that business's Safe on Base. No custody hop, no intermediate wallet.

MOOVE.XYZ ROUTE SETTLE MINT LINK DEPOSIT SEEN PAYER Anyone, any wallet 16,000 assets · 37 chains API Payment Link POST /v1/payment-link ROUTING Swap + bridge one transaction SAFE Business treasury Safe v1.4.1 · Base CAPXUL Invoice + reconciliation mints link · correlates deposit LEGEND CAPXUL SAFE — DESTINATION MOOVE HTTP API OBSERVED ON CHAIN

Everything above works today except one step — Moove has no way to point a payment link at an address that isn't a key.

Diagram 2 · Flowchart

The change we're asking for

A Safe has no private key, so it cannot produce a signature ecrecover accepts. EIP-1271 is the standard answer: ask the contract instead. The coral path is the addition — roughly fifteen lines, and it gives Moove every smart account at once, not just ours.

NO YES NO YES YES NO Register a wallet Recover the signer ecrecover(hash, sig) Matches the claimed address? Address has contract code? Ask the contract isValidSignature(hash, sig) Returns 0x1626ba7e ? Wallet registered Rejected LEGEND THE ADDITION — CONTRACT ACCOUNTS EXISTING PATH — KEY-BASED WALLETS

Evidence

Our side is already done

Capxul Safes are Safe v1.4.1 with the Safe4337Module as fallback handler, which inherits CompatibilityFallbackHandler — so EIP-1271 is live today. These are real eth_call results against a deployed Capxul Safe on Base Sepolia, 0xb547dcbc82fc83913d85ad58f0d763c37c52da2d.

CallResult
VERSION()1.4.1
getOwners()[0x7e59e34131031247666c2d9d0e4c316e6de1d0dc] — a single owner EOA that can sign
domainSeparator()0x707af710fbae0bdbcb9e35e59f037b1f53f597728648d3099fa6f150f0c0d70b
getMessageHash(bytes)0x37774d668c72931c5f060604cb0ff6010b95c5e07e19cb3de7a02b2d55507ff1
isValidSignature(…)reverts “Hash not approved” — the function exists and executed

An empty signature reached Safe's own checkSignatures and reverted there. A Safe without EIP-1271 would revert with no data at all.

Ask 1 — preferred

Accept contract accounts

  • A wallet-registration endpoint that falls back to EIP-1271 when ecrecover misses
  • Gives Moove Safe, Coinbase Smart Wallet, Argent and every ERC-4337 account at once
  • Note: Safe validates its own EIP-712-wrapped hash. getMessageHash(bytes) returns the hash to sign

Ask 2 — smaller

An optional destination

  • Accept destinationAddress on POST /v1/payment-link
  • The field already exists on PaymentLinkData — it just isn't accepted on write
  • Needs no signature: proof of ownership is for spending, not for receiving

What Capxul brings

Distribution, not another wallet

  • Business treasuries on Safe, addresses derived from email
  • A routing engine that already integrates one aggregator — Chainrails, KYB complete
  • Moove Receive becomes a deposit rail, and Moove Send a payout rail when it ships