BernuviaBernuvia

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.

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 v2

Verified code

Receives 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.

Solidity 0.8.36 with viaIR, optimizer at 200 runs and EVM cancun, built on OpenZeppelin 5.6.1: AccessControl with two-step admin handover, ReentrancyGuard, Pausable, SafeERC20 and EIP-712.

Network
Polygon · 137
License
MIT
Compiler
Solidity 0.8.36

Address

0x9d285aA8a5b24df5eB058D9350dbe33645cd23b5
View on Polygonscan

Membership billing · SubscriptionCollector v2

Verified code

Charges the seller membership in USDC with caps set on-chain: at most once per period and always to the treasury.

Network
Polygon · 137
License
MIT
Compiler
Solidity 0.8.36

Address

0xF9f95934fd272481fa205d3B030B5156Ce62A21c
View on Polygonscan

USDC · Circle

Third-party contract

The currency of every purchase: Circle's native USDC on Polygon.

Network
Polygon · 137

Address

0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
View on Polygonscan

Read the code, don't take our word

Both contracts have their source code published and verified on the explorer: what runs on the network is exactly what you can read.

  • An exact match between the published code and the deployed one.
  • MIT license: anyone can read it, copy it and review it.
  • The same compiler and the same libraries in both contracts.

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.

No arbitrary destinations

The money of a purchase can only go to the seller, minus the fee, which is credited to the treasury, or back to the buyer. The contract admits no other destination.

Everyone withdraws their own

Payments are credited and each party withdraws when they choose. A blocked address cannot jam anyone else's payouts.

The dispute belongs to the buyer

Only the buyer opens a dispute, only the buyer withdraws it and only the buyer closes it when the deadline passes. The seller has no on-chain action over it: they put their side in the case file. And it can only be opened before the automatic release expires, so nobody reopens a purchase that is already closed.

Withdrawing a dispute does not stretch the clock

Whoever withdraws their dispute can reopen it while the original deadline is still alive, and that deadline is not renewed: it is inherited. Each purchase allows at most three openings, so nobody can freeze the money by opening and closing disputes in a loop.

The fee never comes out of your share

In a dispute the fee is the smaller of two numbers: the fee on the amount, or whatever the seller keeps. If the refund is total, the fee is zero.

Signed, single-use quotes

Every price is signed with EIP-712, carries its issue time and its expiry, and works only once.

Audit

The escrow contract went through an adversarial audit before going to mainnet, and a second review with the contracts already in production. That second review produced the version that holds the money today.

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 and a funds-conservation invariant over random operations.
  • A second review with twelve independent lenses across four rounds, this time against the deployed contracts.
  • Conservation invariants checked against a shadow model that redoes the accounting on the side and has to match to the cent.
  • Three adversarial lenses over the current version's code before deploying it, with their proofs of concept turned into regression tests.

The numbers

662

automated Hardhat cases, spread across 109 files

105

proofs of concept turned into regression tests

1,600

random operations against the shadow model

15

tests of the membership billing contract

Platform security

Off-chain, what protects your account and your downloads.

  • Two-step verification, plus an extra code for sensitive actions: a withdrawal from the panel 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 your email, your password or your two-step verification.
  • 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 of a file hosted by Bernuvia shows the SHA-256 fingerprint the server computes, or says it isn't available yet.

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.