Security
Security model
Every Portuna product follows the same rules: your keys stay with you, funds move only to your addresses, and the code that moves them is small, verifiable and immutable. Below is how Portuna Sweep keeps them.
Our three rules
- 01
Your keys stay with you
We never create or hold the keys to your addresses. You sign in your own HSM, KMS or MPC; we never see a key.
- 02
Funds go only where you allow
To an address written into an immutable contract, or with your signature on a specific operation. Anyone can check the code, and it has no admin keys.
- 03
Pay per success, less than today
You pay only for operations that succeed, priced against a published benchmark you can check. Our fee never makes an operation cost more than it does you today.
Products
Portuna Sweep
The first product. Your keys, your hot wallet, your gas wallet: three small contracts that can do one thing and cannot be changed.
Non-custodial
Deposit keys never leave your custody. A deposit address signs one thing: an EIP-7702 authorization that puts your delegate's code on it, on one chain. You sign it in your own HSM, KMS or MPC; we never see the key.
Funds go from the deposit address straight to your hot wallet, inside the batch transaction. They never pass through an address of ours.
The key keeps working: you can send from a deposit address as before, and revoke the delegation at any time to turn it back into a plain address.
Three small contracts
Immutable, ownerless, without upgrades or admin roles. Each partner gets its own batcher and delegates, so no contract of ours touches two partners.
-
SweepFactory
Shared and ownerless; the same address on every chain. It deploys a partner's batcher and delegates, always for the caller's own gas wallet.
-
SweepBatcher
Yours. Accepts batches only from your gas wallet and walks the deposits one by one: a failing address is skipped and reported, the batch goes through.
-
SweepDelegate
The code on your deposit addresses, one per hot wallet. It does one thing: send a token or the native coin to the hot wallet written into its bytecode, when your batcher asks.
Who can do what
| Who | Can | Cannot |
|---|---|---|
| You | Everything you could before: the deposit keys are yours. Revoke the delegation at any time. | — |
| Our relayer | Send batches of your sweeps from your gas wallet. | Send funds anywhere but your hot wallet. |
| Us, as a company | Decide when a batch goes out. | Change your hot wallet: it is part of the delegate's code. |
| Someone with your gas wallet's key | Sweep your deposits early — into your own hot wallet — and spend the gas wallet's balance. | Take funds from deposit addresses or from your hot wallet. |
| Anyone else, other partners included | Nothing: the delegate obeys only your batcher. | Trigger, redirect or block your sweeps. |
Verify before you sign
All contracts are created with CREATE2, so an address is a hash of the creator, the salt and the full creation code — bytecode and constructor arguments. Change a single byte and the address changes. If the address computed from the open code matches the one on-chain and there is code there, it is exactly that code, with exactly your hot wallet and gas wallet.
verify-delegate, part of the Go and TypeScript SDKs, does it in one command before any deposit signs: it computes the factory, your batcher and your delegate, checks their code on-chain and compares the delegate with the one the API returned.
Factory on the testnets
- Sepolia 0x66f63A7246dF0eD76098dD95ad0F53d8e7bed456
- BSC testnet 0x66f63A7246dF0eD76098dD95ad0F53d8e7bed456
The address changes with any change of the code; the mainnet address will be published at launch.
Gas wallet keys
Gas wallet keys live in a separate signing service, the only component that can sign. The API servers never see them.
The signer signs only transactions to the shared factory, to your own batcher and to the one address your fees are settled to. It stays within per-network gas caps and a daily budget per gas wallet, and keeps a journal of every signature and refusal. Even a full compromise of the API servers could only burn gas within that budget — never move funds from deposits or your hot wallet.
Before mainnet
The contracts' source code will be published, and every mainnet deployment verified on Etherscan and Sourcify.
Report a vulnerability
Found a weakness? Write to us before disclosing it publicly. We answer every report.
support@portuna.exampleTry it on testnet today
Self-serve on Sepolia and BSC testnet. Mainnet access opens soon — tell us about your volumes and we'll get you ready.