
Unison
Move tokenized stocks between issuers 1:1, no selling. Uniswap v4 hook + private send on Sui.
Demo
About
Tokenized stocks are fragmenting. Coinbase, Kraken, Robinhood, xStocks each issue their own token for the same share, and there's no way to move from one to another. A holder of Coinbase NVIDIA who wants Kraken NVIDIA has to sell, wire, rebuy, and eat the spread, the price gap and a tax event. In TradFi this is one form (ACATS). On-chain it doesn't exist. Unison is that form. Three pieces: Convert is a Uniswap v4 hook (ParityHook) that quotes conversions at NAV parity instead of on a curve. 100 shares of issuer A becomes 100 shares of issuer B, priced off each wrapper's declared multiplier, never off exchange prices. A market maker supplies inventory of both wrappers and earns the fee: 2 bps base plus a skew fee that rises only on trades that make the pool more lopsided, so arbitrageurs are paid to keep the two issuers' prices together. Protocol takes nothing on Convert. A peg guard blocks conversions if the wrappers drift more than 50 bps, protecting the LP from a depegged token. Dark Cross is an on-chain dark pool for size. Sealed commit (hash), reveal, settle at the 30-minute oracle midpoint. Opposite-side orders cross directly at 1 bp; residual falls through to Convert; unfilled is refunded. Pre-trade private, post-trade public, enforced by the contract, not an operator. Send is confidential payment in tokenized stock across chains. Deposit on Unichain (ShareVault), pay on Sui with the amount encrypted under Seal and stored on Walrus, recipient decrypts and withdraws into whichever issuer they want. Private payroll and OTC settlement without revealing size. Everything is live on Unichain Sepolia and Sui testnet: 19 verified contracts, a Move package, a public app, and an MCP server so an agent can quote and convert on its own. A 1,500-trade simulation on a fork of the deployed contracts shows 40 bps gaps closing under 15 bps within a few ticks, with zero reverts.
How it's made
Uniswap v4 (Unichain Sepolia). One ParityHook serves all three pools (AAPL, NVDA, TSLA), implementing the IHooks interface with hook permissions encoded in the deployed address. Pricing happens in beforeSwap via beforeSwapReturnDelta: the hook reads each wrapper's multiplier from its adapter, computes sharesOut = amountIn × mult_from ÷ mult_to, applies base + skew fee, and returns the delta so the PoolManager settles on our terms instead of the curve's. LP inventory sits as ERC-6909 claims inside the PoolManager. Three DarkCrossHooks (one per asset) run commit/reveal/settle across block-numbered windows, escrow at commit, min(buys, sells) matching at the oracle TWAP midpoint, 1 bp to protocol, residual routed through ParityHook, remainder refunded. A router wraps the unlock/settle dance into one call. Solidity + Foundry, 291 tests across 25 suites, 19 contracts verified on Uniscan. Sui. A Move package (unison_pay) holds the confidential payment pool. Amounts are encrypted with Seal, where the decryption policy is a Move function (seal_approve) enforced on-chain and served by a 2-of-3 key-server threshold; ciphertext lives on Walrus, the Sui object holds only the blob root. A keeper watches both chains, mirrors ShareVault deposits into Sui credits, settles withdrawals back on Unichain, and enforces a solvency invariant (pauses on breach rather than just reporting it). Off-chain. TypeScript monorepo: an indexer writing Converted/Crossed/CrossFilled/ResidualFilled/Unfilled events to Postgres with base/skew/protocol fees in separate columns, an API, a crank advancing dark batches, and a rate-limited relay so judges can convert with no wallet. The MCP server (official SDK, stdio + Streamable HTTP) exposes list_assets, get_pool, quote_convert, get_batch, convert, commit_dark_order; it holds no keys and reads only public endpoints. Everything runs on a Mac mini behind a Tailscale Funnel.