# PARE for agents

PARE splits a tokenized stock on Robinhood Chain into two ERC-20s: the share (**pToken**, e.g. pSPY) and every dividend it pays until maturity (**yToken**, e.g. ySPY). One stock token in, one pToken and one yToken out; merge one of each and the stock token comes back, free. The pToken trades below the stock and becomes a full share at maturity, so its discount is a fixed rate. The yToken's price is the market's forecast of the dividends.

Everything below is public, needs no key, and can be read or executed by a program. Site: https://parestocks.com · X: @PareStocks · Docs for humans: https://parestocks.com/docs

## Chain

- Robinhood Chain, chain id **4663**, EVM (Arbitrum Orbit).
- Public RPC: `https://rpc.mainnet.chain.robinhood.com` (or `POST https://parestocks.com/api/rpc/4663`, same JSON-RPC, keyed on our side).
- Explorer: https://robinhoodchain.blockscout.com. Every PARE contract is verified there.
- Dollars on this chain: USDG `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` (6 decimals). ETH is the gas token.

## Live series (maturity 31 Dec 2027 00:00 UTC)

| Series | Stock token | Vault (split / merge) | pToken | yToken |
|---|---|---|---|---|
| SPY | `0x117cc2133c37B721F49dE2A7a74833232B3B4C0C` | `0xa0f77015E46e45c1A12B73466A08711a28Dac1A7` | `0x1d0d084ee243eC25876547E69Ca54A499E253ac9` | `0x679041CAcbD0df4B88D911fBAd328606ce7905E3` |
| PFE | `0x7066A64c24e4206CD62E83bf198c1E7EB361F51e` | `0x1aC9599B91973A3d5d75F7594a47382223FEC0F5` | `0x2574d6E64bC2c4326cB35d8a2B2126FD300a7F79` | `0xCb0A7254D6e106F4A8Ba3a25b3a35460be76B5b7` |
| AAPL | `0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9` | `0x131179E65Ab5C0538f5191920233Fd9Dc31930d1` | `0xa674f5Ac6c5b89A64b631378a8f5703804F18aa7` | `0x9a3A1A05504953537E2a4ff1a4C19675edB06204` |
| QQQ | `0xD5f3879160bc7c32ebb4dC785F8a4F505888de68` | `0xAb8e536C9E7c76C1045EDEb6096e9B37B26B4372` | `0xadA9e22Cba6D1802d06400E883f5b4d663a85853` | `0xd38489A01e807282d2D5616Bbde7E697BA70BAdD` |

pTokens and yTokens are 18-decimal ERC-20s, minted one raw unit per raw unit of stock token deposited. `GET /api/series?series=pfe` returns the same addresses plus live vault state, so read that rather than hardcoding.

## Read (JSON, no key, cached 30 s)

| Endpoint | What you get |
|---|---|
| `GET /api/rates` | Per series: `px` (stock per pToken), `discount`, `fixed` (annualised return to maturity), `py` (stock per yToken), `dividendsToMaturity`, `impliedDividendYield` (the market's dividend forecast, simple annual), `maturity`, `years`, `synced`. |
| `GET /api/oracle` · `?token=pfe` | The dividend oracle: per stock token, the live and scheduled multiplier, cumulative `dividendIndex` and `splitFactor`, and `isSynced`. **If `isSynced` is false, treat every price for that stock as stale.** |
| `GET /api/markets` | Every Uniswap v3 pool the app trades through: address, fee tier, `sqrtPriceX96`, tick, liquidity and token balances. |
| `GET /api/market` · `?id=pspy` | The Morpho Blue lending market for pSPY / USDG: lent, borrowed, utilisation, borrow and lend APY, LLTV, oracle price. |
| `GET /api/history?series=pfe` · `all` · `&format=csv` · `&from=2026-09-20` | **Backtesting.** Daily UTC closes since the pools opened: `px`, `fixed`, `py`, `dividendsToMaturity`, `impliedDividendYield`, with the trade count each close rests on. |
| `GET /api/pool?series=pfe` · `&pair=stock` · `&pair=yt` | One pool's full price history (every swap, with timestamps), state now, and every LP position. |
| `GET /api/series?series=spy` | Vault and accountant state for one series. |
| `GET /api/rh-tokens` | Every Robinhood stock token on the chain, with market cap, whether it pays a dividend, and whether PARE covers it. |
| `GET /api/read?to=0x…&data=0x…` | One `eth_call`, result as JSON. |
| `GET /api/tx?hash=0x…` | What a transaction did, with the revert reason decoded if it failed. |
| `GET /api/liq?tokens=0x…,0x…` | USD liquidity of any stock tokens against USDG and WETH. |

The OpenAPI description is at https://parestocks.com/openapi.json.

## Act (on-chain, from any wallet)

All contracts are plain Solidity with no permission lists. Amounts are in the token's own decimals.

**Split.** `approve(vault, amount)` on the stock token, then `vault.split(uint256 amount)`. Mints `amount` pToken and `amount` yToken to the caller, less a 10 bps fee taken from the deposit. Open until maturity, subject to the series' deposit cap.

**Merge.** `vault.merge(uint256 amount)` burns `amount` pToken and `amount` yToken and returns `amount` stock token. No fee, never paused.

**After maturity.** `vault.settle()` (anyone, once, strictly after maturity and only once the accountant has classified every change up to it), then `vault.redeemPT(amount)` pays one share per pToken and `vault.redeemYT(amount)` pays the banked dividends per yToken, less 5% of the dividend growth. `previewRedeemPT` / `previewRedeemYT` are views.

**Trade.** Ordinary Uniswap v3 on Robinhood Chain. SwapRouter `0xCaf681a66D020601342297493863E78C959E5cb2`, NonfungiblePositionManager `0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3`. Each series has a pToken/stock pool on the 0.05% tier and a yToken/stock pool on the 1% tier; pPFE also has a pPFE/USDG pool. Pool addresses come from `/api/markets`. Pools are thin: quote before you trade and set slippage.

**Borrow.** Morpho Blue `0x9D53d5E3bd5E8d4Cbfa6DB1ca238AEA02E651010`, market id `0xd255e25cbab14a13292a127be2bce3f5c9a0fe620e4537d5bbc54daf5309458b`: collateral pSPY, loan USDG, LLTV 62.5%. `supplyCollateral`, `borrow`, `repay`, `withdrawCollateral` as on any Morpho market. Morpho refuses borrows while the oracle is not synced.

**Fees, complete list.** Split: 10 bps of the deposit. Redeem yToken at maturity: 5% of the dividend growth. Merge, redeem pToken, transfers: nothing. Pool swaps pay the pool's Uniswap fee to its LPs.

## How to price things

- `pToken + yToken = 1 stock token`, enforced by free merge. If the two pools sum above par, split and sell; below par, buy both and merge.
- Fixed rate on the share: `(1 / px) ^ (1 / years) − 1`.
- Market dividend forecast: `py / years` (simple annual), or `(1 − px) / years` when the yToken pool is empty.
- A stock token's dividends arrive as a rise in its on-chain multiplier, not as a transfer. The accountant at `/api/oracle` tells dividends from stock splits; use `dividendIndex` for accrued dividends and `splitFactor` for share count.

## Rules of the road

- Nothing here is custodial and nothing needs an API key. Reads are cached 30 seconds; do not poll faster.
- Check `isSynced` (per stock, in `/api/oracle`) before you price, split or borrow. While it is false, prices are stale by design.
- The contracts were reviewed by Pashov Audit Group (September 2026, two reviews); the reports are at https://parestocks.com/audit.
- Not investment advice. Stock tokens are issued by Robinhood and are not available everywhere.

Questions or a listing you want covered: the form at https://parestocks.com/oracle#request, or @PareStocks.
