Your tag knows what you want to be paid in. Product overview and full backend spec for tag-native payment settlement on Robinhood Chain.
On TagioFi, your payment tag carries your preferences. Tell your tag once, “I take 60% SPY, 30% USDG, 10% gold”, and every payment that hits it arrives converted: the tip, the invoice, the salary, the split. Senders send anything; your tag makes sure what lands is what you’d actually keep. Stop receiving money you immediately have to convert. Start receiving the portfolio.
Institutions just proved people want this: the first RWA payroll pilot (Plume × Toku × WisdomTree) let staff take salary in a tokenized money-market fund, but it’s a closed program: one employer, one fund, verified wallets, a payroll vendor in the middle. Wallets solved the buy side (MetaMask × Ondo: swap into 200+ tokenized assets). The receive side, payments that arrive as the asset you want, doesn’t exist anywhere, for anyone.
Robinhood Chain is the only venue where this is trivial to make real: tokenized stocks are native tokens with live Chainlink pricing, and the chain carries an on-chain tag registry, NFT-registered payment tags whose resolver exposes a destination, programmable splits, and a preferred-settlement-asset field that today sits unused. TagioFi is the machine that makes that preference field mean something.
| Closed payroll pilots | Wallet swap features | Fee-drip stock tokens | TagioFi | |
|---|---|---|---|---|
| Who gets paid this way | One company’s staff | Nobody (buy-only) | Passive holders | Anyone with a tag |
| Asset choice | Single fund | n/a | Curated for you | Your mix, your call |
| Works for commerce/invoices | No | No | No | Yes, that’s the point |
“Your paycheck shouldn’t need a second transaction to become your portfolio.”
| Who | Does | Gets |
|---|---|---|
| Earner | Sets a receive-mix on their tag | Every payment auto-builds their book |
| Payer | Pays a tag with whatever they hold | Zero-thought sending |
| Crew / DAO | Split tags + payroll vault | Whole-roster salary-in-assets |
| $TGIO staker | Backs the registry/params | Share of settlement fees |
Bounded settlement fee on converted volume + payroll tiers → open-market $TGIO buyback + staker distribution (80/10/5/5). Same-asset payments are permanently free, the rail grows first, the conversion monetizes.
Stakers back the registry and its parameters and earn a share of settlement fees. The fast path, sent asset equals mixed asset, is a direct transfer with zero fee, hardcoded, forever.
| Phase | Ships |
|---|---|
| 1 | Tag receive-mixes + single-recipient settlement + verified-asset gate |
| 2 | Split tags (per-member mixes) + invoices / pay-links / QR |
| 3 | Payroll vault + $TGIO genesis |
| 4 | Verified-social tag payments + cross-chain pay-in |
Kill/persist: Phase 1 is the claim and a complete product. If conversion volume lags at day 30, lead with the payroll-vault B2B lane and keep the rail as infrastructure.
latestRoundData() × uiMultiplier() sanity (staleness / oraclePaused guarded). A breaching leg safe-settles in USDG with an on-chain notice.[Payer wallet] → pay(tag | linkId, tokenIn, amountIn)
▼
TagRouter.sol
1. resolve(tag) via ITagResolver {owner, destination, splits[], active, expiry}
2. load ReceiveMix(recipientWallet), fallback 100% USDG
3. splits × mix-legs → conversion plan
4. validated swaps (0x/Uniswap) → deliver → Receipt event
Contracts: TagRouter.sol · MixRegistry.sol · PayLinks.sol · RosterVault.sol · TGIO.sol · FeeVault.sol
External: ITagResolver (chain tag standard, read-only)
Off-chain: Bun + Hono + tRPC v11 · Drizzle/Postgres + Timescale · Redis + BullMQ · viem · 0x/Uniswap · Chainlink · canonical RWA registry · 60s tag-resolution cache · Dwellir RPC
// ITagResolver, external standard: getInfo(string tag) → (owner, destination,
// Split[]{wallet,bps}, registeredAt, expiresAt, active)
// MixRegistry.sol, setMix(Leg[]{asset,bps}) Σ=10000, ≤8 legs; every asset checked against
// VerifiedRegistry root; keyed to RECIPIENT WALLET (portable across tags); default 100% USDG;
// asset turning unverified → that leg auto-falls to USDG + Notice.
// TagRouter.sol, pay(tagOrLink, tokenIn, amountIn, minOuts[]): resolve → active/expiry check
// (expired tag reverts, no lapsed-tag hijack) → splits → per-recipient mix legs →
// allowlisted-venue swaps with per-leg slippage caps + Chainlink sanity → transfers →
// Receipt{payer, tagHash, legs, fee}. Atomic or safe-settle; router never retains funds.
// PayLinks.sol, createLink(tag, amount?, memoHash, expiry) → linkId; pay(linkId) binds invoice.
// RosterVault.sol, funder budget + roster{wallet, amountPerCycle}; run() permissionless;
// every payout settles through each member's own mix; pages 200 payouts/tx.
// FeeVault.sol, bounded fee bps (fast path 0) → $TGIO buyback + stakers.
Quote service composes the plan (0x quotes; one swap per distinct output asset across all splits); TagRouter enforces on-chain: venue allowlist, calldata target/selector checks, slippage caps, Chainlink sanity with staleness / oraclePaused guards (violations → USDG safe-settle for that leg). ≤8 mix legs; direct transfers for delivery (payments are 1–5 recipients; roster runs page). Stock Token deliveries record {raw, uiMultiplier} in receipts so balances display correctly across corporate actions.
mixes /* wallet, legs jsonb[{asset,bps}], updatedAt */
receipts /* id, payer, tagHash, recipients jsonb, legs jsonb[{asset, raw, uiMult, px}], feeWei, txHash, ts */ // Timescale
links /* linkId, tagHash, amount?, memoHash, expiry, status, receiptId? */
rosters /* id, funder, members jsonb, budget, cycleLen, nextRunAt, status */
verified /* asset, symbol, authentic, depthUsd, eligible, sampledAt */
tagcache /* tagHash, resolved jsonb, cachedAt */ // 60s TTL
tRPC: payRouter.quote(tag, tokenIn, amount), mixRouter.set/get, linkRouter.create/status, rosterRouter, receiptRouter.history.
Workers: quote-service, roster-runner (+ permissionless trigger), verified-refresher, tag-cache, chain-indexer.
Foundry: atomic-or-safe-settle; zero-residue; splits×mixes matrix (3 recipients, 3 distinct mixes, exact); expired-tag revert; unverified-asset mix revert; slippage breach → USDG + Notice; oracle-paused leg → safe-settle; multiplier-event fixture keeps delivered balances correct.
Quote preview matches execution within tolerance; roster pages 200/tx honoring per-member mixes.
Dev caveats: pin ITagResolver against the deployed registry ABI (read-only; independent of its upgrade path); Chainlink staleness / oraclePaused guards per studio standard; set the initial verified-asset floor from live venue depth at launch.