Integration proposal · 7 September 2026
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
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.
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
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.
Evidence
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.
| Call | Result |
|---|---|
| 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
ecrecover missesgetMessageHash(bytes) returns the hash to signAsk 2 — smaller
destinationAddress on POST /v1/payment-linkPaymentLinkData — it just isn't accepted on writeWhat Capxul brings