Contracts
Everything is deployed permissionlessly and verifiable on-chain. Currently targeting Arc (chain 5042).
Slice contracts
| Contract | Address | Role |
|---|---|---|
| VaultFactory | 0x9ABDd9Ba9C8Cb77e8676141c5bDa18fD107beD7D | Creates one vault per pool, keeps the registry, deploys fee routers. |
| VaultDeployer | 0x32F0b8964B51E157Fb58AdF33fdA228Cf16476AF | Holds the vault creation bytecode so the factory stays under the 24KB contract size limit. |
Live vaults
No vaults deployed yet, or still loading from the chain.
Arc and Uniswap
Slice only ever calls two of these at runtime: the Uniswap PoolManager and the USDC ERC-20 interface. Both carry identical bytecode on Arc mainnet and testnet.
| Contract | Address | Used by Slice |
|---|---|---|
| USDC (ERC-20) | 0x3600000000000000000000000000000000000000 | Yes — the reward and quote currency. |
| Uniswap v4 PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 | Yes — vaults hold liquidity here directly. |
| StateView | 0xF3334192D15450CdD385c8B70e03f9A6bD9E673b | No — reference only. |
| PositionManager | 0x6049c9a0e26405C0985f9E3685C87d0aE917f82B | No — mainnet only, absent on testnet. |
| UniversalRouter | 0x4fcA4a51Ab4F23A7447b3284fBd7D73289A89Fb1 | No — mainnet only, absent on testnet. |
Which pools Slice works with
Slice attaches to a Uniswap v4 pool, not to a launchpad. It does not care which platform created the token — if the launch put the token into a v4 pool quoted in USDC, a vault can be created for it permissionlessly. On Arc that covers most launchpads, because v4 plus USDC is the default shape.
createVault carries no access control, so anyone can list any qualifying pool and anyone can then stake in it — list one from the app if the pool you want is not already there. Listing a pool gives the lister no rights over the resulting vault: owner, treasury and fee recipient are set by the factory, identically for every vault it creates. The four requirements below are enforced in the vault's constructor, not by a reviewer.| Requirement | Why |
|---|---|
| A Uniswap v4 pool | Vaults hold liquidity in the PoolManager directly. A platform running its own AMM is not supported. |
| Quoted in USDC | The 6-decimal ERC-20 at 0x3600…0000. Rewards are denominated in it, and native-currency pools are rejected. |
| Already initialized | Otherwise the vault creator would get to pick the starting price on the first deposit. |
| No exit-blocking hook | Rejected at creation if the hook can intercept a withdrawal — see below. |
Hooks
v4 lets a pool attach a hook, and launchpads use them for taxes, fee splits and buybacks. Slice allows those. What it refuses is a hook that could stand between a staker and their money.
A hook's permissions are encoded in the low bits of its address, so this is checkable before a vault ever holds anything. Vault creation reverts with HookMayBlockExit if the hook implements any remove-liquidity callback, or can return a delta on add or remove. Those could revert a withdrawal or skim it — on a vault other people deposit into, that is a trap rather than a fee.
- Allowed: swap hooks — taxes, dynamic fees, dividends, buybacks. The worst they do is make the vault's own fee conversion less efficient.
- Allowed: hooks that gate adding liquidity. Deposits may fail, which is an annoyance, not a way to strand principal.
- Refused: anything that runs on removal, or returns a delta on add or remove.
What each role can do
- Anyone — create a vault for any USDC pool, create a fee router, poke, harvest, compound, collect protocol fees to the treasury, deposit, withdraw, claim.
- Vault owner — adjust the protocol fee (max 10%), the stream and compound split, and the price deviation band (max 5%). Cannot move user funds or pause anything.
- Router creator — configure triggers, change the injection recipient, and withdraw unspent budget. Cannot touch the vault or anyone else's position.
Source
Contracts are written in Solidity 0.8.26 against Uniswap v4 core. See the security model for the testing approach, including the fork suite that runs against live Arc.