Security and transparency
Your money sits in a contract you can read
When you buy on Bernuvia, Bernuvia doesn't hold your USDC: it sits in a public contract on Polygon until the purchase closes. Here are the addresses, what the contract guarantees, the audit it has been through, and the one it hasn't yet, and how to let us know if you find a flaw.
The contracts
Everything runs on Polygon mainnet (chain id 137). Every address links to the explorer, where you can read the code and every transaction.
Escrow contract · MarketplaceEscrow
Verified codeReceives the buyer's payment and holds it until it is released to the seller or refunded. It is the only place where the money of a purchase lives.
Source code verified on Polygonscan (exact match). Solidity 0.8.24, optimizer at 200 runs, built on OpenZeppelin: AccessControl, ReentrancyGuard, Pausable, SafeERC20 and EIP-712.
Address 0x33C6eFD7523821c2AB51d874e440Ac8A0C97f409
Membership billing · SubscriptionCollector
Verified codeCharges the seller membership in USDC with caps set on-chain: the seller sets a maximum price and a period, and the operator can only collect up to that maximum, once per period and always to the treasury. Changing the treasury takes 48 hours.
Source code verified on Polygonscan (exact match, MIT license). It lives in the same repository as the escrow contract, with the same compiler and the same OpenZeppelin base.
Address 0x3860f37D6066AF02811b24FE66D0bd00F693AD21
USDC · Circle
Third-party contractThe currency of every purchase: Circle's native USDC on Polygon. It is not a Bernuvia contract.
Address 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
What the escrow contract guarantees
These rules are not enforced by a Bernuvia server: they are written in the contract, and anyone can check them in the verified code.
The money never passes through Bernuvia
USDC goes from the buyer's wallet straight into the contract. Bernuvia never holds it.
Only two exits
The money of a purchase can only be released to the seller or refunded to the buyer. There is no third way.
Everyone withdraws their own
Payments are credited and each party withdraws when they choose. A blocked address cannot jam anyone else's payouts.
Dispute before release
A dispute can only be opened before the automatic release expires, so nobody can reopen a purchase that is already closed.
A dispute never hangs forever
If a dispute goes 30 days without a resolution, anyone can close it and the contract refunds the buyer in full.
The fee is capped on-chain
The maximum fee is governed in the contract, and every quote must stay below that cap.
Bounded deadlines
The automatic release window is limited in the contract to between 1 hour and 365 days; the buyer and the seller can never be the same address.
Signed, single-use quotes
Every price is signed with EIP-712 and works only once. The review found no way to steal the principal or to reuse a signature.
Audit
The escrow contract went through an internal adversarial audit before going to mainnet. This is exactly what was done and what was found.
Method
- Three independent adversarial reviews, each with its own lens: funds and reentrancy; access control and signatures; state machine and griefing.
- Static analysis with Slither 0.11.5.
- A funds-conservation invariant checked over 250 random operations.
- 18 Hardhat tests, with a regression test for every finding.
Findings
9 findings: 1 critical, 1 high, 3 medium, 2 low and 2 informational. All critical, high and medium ones were fixed before deploying to mainnet; the 2 low ones were mitigated operationally.
The membership billing contract went through its own internal review: 15 tests and 7 findings, all fixed or accepted with a documented rationale.
Platform security
Off-chain, what protects your account and your downloads.
- Two-step verification, plus an extra code for sensitive actions: a withdrawal requires your signature and a code sent to your email.
- MCP and API tokens carry scoped permissions: they can never sign a payment, withdraw funds or change the account.
- The treasury is a multisig wallet.
- Sessions expire after inactivity.
- Security headers on every response: CSP with a per-request nonce, COOP and CORP.
- Every download carries its SHA-256 checksum.
Report a vulnerability
If you find a security flaw, we want to hear it before anyone else. Here is how:
Write to us through the contact form
Put "Security" in the subject and tell us what you found, how to reproduce it and what impact it has.
If you have an account, use the panel's bug report
The "Report a bug" button in the panel reaches the same team and stays tied to your account.
Give us time to fix it
We confirm receipt and tell you when it is fixed. We ask you not to publish it until then.

