04 · Security
Security
The useful question is not whether we promise to behave. It is what the contract would let us do if we did not.
Independent audit: none yet. The contract is covered by our own unit tests and by fork tests against the live pools. That is not the same thing as an external review, and we are not going to blur the difference. When a report exists it gets linked here, in full.
What the owner can do
The owner is a single key, held by us. Not a multisig — we would rather tell you that than let you assume otherwise. Ownership transfer is two-step, so it can become a multisig later without redeploying anything or moving a single balance. What that key can do is limited to four things:
- List or delist a Stock Token. Affects which tokens can be bought for new round-ups. Delisting never touches a balance anyone already holds, and never blocks a withdrawal.
- Set the fee, anywhere from zero up to the 5% ceiling the contract enforces.
- Set the treasury address that fees are sent to.
- Sweep a surplus. Only the amount of a token held here above the sum recorded to users — that is, tokens sent to the contract by mistake. The call computes the difference and reverts when there is none.
Ownership transfer is two-step: the current owner nominates, and the new owner has to accept. A typo in an address cannot hand the contract to nobody.
What the owner cannot do
No function exists to
- Move, transfer or seize a user balance
- Pause the contract
- Block, delay or gate a withdrawal
- Change anyone's basket
- Raise the fee above 5%
- Touch what the treasury does not own
And structurally
- The contract is not upgradeable — the code at that address is the code forever
- There is no proxy, no implementation slot and no admin behind one
- Withdrawals do not depend on us being online, solvent or willing
Protections in the swap path
- Minimum output on every leg. Quotes come from the Uniswap QuoterV2 and your slippage tolerance sets the floor. A leg that would fill below it does not fill.
- The credit is measured, not assumed. The contract reads its own balance before and after each buy and records the difference, so a token that delivers less than it claims cannot inflate your recorded holding.
- A deadline on every transaction. A transaction stuck in the mempool expires instead of executing later at a price you never agreed to.
- Reentrancy guard on every function that moves value.
- Paths are checked. Each leg's route must start at the token you are paying with and end at that leg's Stock Token; anything else is rejected rather than executed.
- Fee-on-transfer tokens are refused rather than half-supported: the contract verifies that exactly the expected amount arrived.
Verify it yourself
The contract is verified on Blockscout, which means the explorer independently confirms that the bytecode at that address was produced by the source shown there, with the compiler and settings shown. That is a stronger guarantee than a code listing on a website — including this one.
| Vault address | see Blockscout |
| Compiler | Solidity 0.8.24, optimizer on, 200 runs |
| EVM version | cancun |