Reorg protection
No credit on a single block. A payment climbs Pending → Safe → Finalized, with automatic re-verification up to finality and a manual ReverifyBlock for edge cases.
Eight arms, one job: get the money to you and prove it stayed. A payment is held until the configured finality threshold. That comes with reorg re-verification, idempotent APIs, atomic balances that never go negative, scoped API keys, and 2FA. We are just as clear about what we don't do yet.
Crypto acceptance breaks in specific, boring ways. A block gets re-mined. A retry double-charges. One leaked key opens everything. Each card below is a part Suward already runs in code, not a promise, and you can follow any of them to the detail.
No credit on a single block. A payment climbs Pending → Safe → Finalized, with automatic re-verification up to finality and a manual ReverifyBlock for edge cases.
Send the same create request twice with its Idempotency-Key and you get the same payment back, not a second charge.
Inside Suward, an outbox carries status events from the monitor to cryptopay so a service hiccup can't lose them. You read status by polling the API, not from a webhook.
Each chain sets its own required_confirmations: 12 on Ethereum, 15 on BSC, 128 on Polygon. A fast L2 and a reorg-prone chain don't earn trust at the same pace.
Keys are scoped per project. Rotate the legacy key, or run several named v2 keys and revoke one at a time. Requests are rate-limited.
TOTP two-factor with backup codes, plus organizations, projects, and roles so people see only what their role allows.
Every credit is atomic and stored as Decimal128, split into safe and accepted, and it never drops below zero.
HD addresses across EVM chains, a unique deposit address for every payment. Withdrawals go through operator review today. On-chain auto-payout is on the roadmap.
A chain can quietly rewrite its recent history. A naive listener credits that reverted block and never takes it back. Suward won't. A payment is never accepted on one block. It moves Pending → Safe → Finalized, held until the configured finality threshold for that chain. Reorgs are handled automatically up to finality. For the rare edge case, an operator can re-check any block by hand with ReverifyBlock.
Safe and accepted stay separate. Each is stored as Decimal128, so there's no float drift to reconcile later, and every credit is atomic. If a reorg moves the chain underneath, Suward recomputes the balance from on-chain reality. It never goes negative.
Suward runs HD wallets on EVM. It mints a fresh deposit address for every single payment, which is the simple reason two payments are never confused for one and no address is ever reused. Withdrawals run through an operator flow today. A person confirms the txHash. On-chain auto-payout is on the roadmap, so we won't dress a manual step up as instant.
Legacy keys rotate with RotateAPIKey. The v2 model adds CreateAPIKey and RevokeAPIKey for several named keys per project, each scoped so a leak in one project doesn't reach the others.
An Idempotency-Key on payment creation means a retried request returns the original payment. Build aggressive retries without ever counting a payment twice.
An outbox carries status events from the monitor to cryptopay so they survive a service failure. This is internal plumbing. You get a payment's status by polling the API, because merchant webhooks aren't here yet.
Two-factor uses TOTP plus backup codes. Work is organized into organizations and projects, and roles such as ROLE_OWNER decide who can do what.
Health checks and Prometheus metrics back the service. The status page shows a component-level picture, not a polished uptime number we can't yet stand behind. Company, contacts, and legal documents are linked, not hidden.
No SOC 2 or PCI certificate, because we don't hold one. No claim of feature parity with larger gateways. No instant payout, since withdrawals are reviewed by an operator. No live merchant webhooks yet, so today you poll the API. And our ERC-20 detection reads the transfer() calldata only. That's why we ask payers to send a standard transfer to the unique address. Saying so is the point.
When it reaches the configured finality threshold for its chain, the point where the status reads Finalized. That's per-network: 12 confirmations on Ethereum, 15 on BSC, 128 on Polygon. Until then it sits at Pending or Safe. You hold the goods.
Suward recomputes the balance from on-chain reality. The safe and accepted figures move together, atomically, so your ledger never shows money the chain took back. That's exactly why a single early block is never enough to credit you.
Not yet. Today you poll the payment status through the API, and that response is the source of truth. Webhooks and live SSE events are on the roadmap, marked Soon, and we won't show them as shipped until they are.
API keys are scoped per project. With v2 keys you can run several named keys and revoke just the compromised one with RevokeAPIKey. A freshly created key keeps the integration running. Pair that with TOTP 2FA and roles on the account.