Pair Markets
The Pair Market is the object PairStreet creates: a token, a Pair Instrument, and the infrastructure that connects them. One record holds the relationship; separate ledgers hold the money.
The canonical object
A Pair MarketPair MarketThe canonical pairing of an internet asset with a financial Pair: TOKEN × PAIR INSTRUMENT, plus the Pair Vault, configuration and accounting that connect them. is TOKEN × PAIR INSTRUMENT. The token is a Pump coin on Solana. The Pair InstrumentPair InstrumentThe financial exposure a Pair Market is paired with, such as Tokyo Residential or Swiss Government Debt. A catalog object with a provider, an eligibility policy and a status. is the financial exposure it is paired with. The Pair Market is the record that binds the two and carries everything the Pair needs: a vault, a route, a configuration and an accounting history.
Each Pair Market is one row in the Pair Registry table pair_markets. It is written once, when /api/launch/confirm has verified the launch transaction on-chain (mint and creator present in the transaction, bonding curve account exists). In the same database transaction PairStreet writes the token identity to tokens, the market state to token_markets, and two activity events: TOKEN_CREATED and PAIR_SELECTED.
A Pair Market has exactly one token and exactly one Pair Instrument. The instrument is chosen before the launch is signed and is part of the market’s identity from its first block.
Anatomy
The object has three parts. The token side describes the internet asset and its market. The Pair side describes the financial exposure and what has been delivered against it. The infrastructure underneath is what moves value from one side to the other.
Figure summary: Center: the Pair Market, $TOKYO × TKYRES. Left, token: mint, creator, market, price, market cap, volume, holders. Right, Pair: instrument, provider, asset, Pair Value, settlements, rewards, eligibility. Bottom, Pair infrastructure: vault, router, epochs, accounting. Each field maps to a stored column.
Where each part is stored
Token identity lives in tokens (mint, name, symbol, creator wallet, metadata URI, launch transaction signature). Market data lives in token_markets and is refreshed from Pump bonding-curve accounts, DexScreener and GeckoTerminal. The Pair Market row in pair_markets holds the relationship and a read model of the Pair’s accounting.
The read model is derived, not authoritative. Settlement amounts, purchases, epochs and allocations are written to ledger tables (pair_settlements, pair_purchases, reward_epochs, reward_allocations), and the aggregates on pair_markets are rebuilt from those rows. Accounting documents the invariants.
Lifecycle states
A Pair Market moves through two tracks at once. The token track follows the Pump market: created, bonding, graduated. The Pair track follows the financial Pair: configured, active, settling. The diagram draws them as one path so the order is easy to read.
Hover a state for its meaning.
Figure summary: Happy path: CREATED, BONDING, PAIR CONFIGURED, ACTIVE, then ACTIVE and SETTLING alternate on the settlement cadence. Branches: BONDING to GRADUATED when the curve completes; ACTIVE to PAIR PAUSED, PROVIDER DEGRADED or INSTRUMENT RESTRICTED; PAIR PAUSED, PROVIDER DEGRADED and INSTRUMENT RESTRICTED can lead to DELISTED. Created, bonding, Pair configured and graduated are reached on mainnet today; active and settling activate per instrument route.
On mainnet a launch passes through Created, Bonding and Pair Configured inside one launch confirmation: the instrument is chosen before signing, and the configuration is written with the row. The market then waits in Pair Configured, trading normally, until its instrument’s provider route and its vault custody activate. From Active, a market alternates with Settling on its settlement cadence, hourly by default.
Graduation belongs to the token track. A graduated coin trades on PumpSwap; its Pair is unchanged. The three held states belong to the Pair track and leave token trading open.
States in the data
The conceptual states map onto real enums. The Pair track is stored in pair_markets.status; the token track in token_markets.graduationStatus; settlement progress in pair_settlements.status; instrument health in pair_instruments.status.
| Conceptual state | Stored as | What it means |
|---|---|---|
| CREATED | tokens.launchTxSignature | Launch verified on-chain; TOKEN_CREATED and PAIR_SELECTED emitted. |
| BONDING | graduationStatus: bonding | graduating | Trading on the Pump curve; graduating once bonding progress reaches 75%. |
| GRADUATED | graduationStatus: graduated | Curve complete, trades on PumpSwap; graduatedAt set. |
| PAIR CONFIGURED | status: settlement_disabled | Shown as “Settlement pending”. nextSettlementAt is null until the route activates. |
| ACTIVE | status: active | Eligible for the settlement scheduler when nextSettlementAt is due. |
| SETTLING | pair_settlements.status: scheduled → planning → executing | One settlement in flight; ends completed, failed or cancelled. |
| PAIR PAUSED | status: paused | Settlement held for this market. |
| PROVIDER DEGRADED | pair_instruments.status: provider_unavailable | The router plan carries blockers; the settlement row records them. |
| INSTRUMENT RESTRICTED | instrument_eligibility rules | REGION_RESTRICTED, UNKNOWN_REGION or KYC_REQUIRED for a given viewer. |
| DELISTED | status: closed (instrument: deprecated) | No further settlements for the market. |
pair_markets.status
| Value | Meaning | Settlement scheduler |
|---|---|---|
| pending | Registered; Pair configuration not yet complete. | Skipped |
| active | Route and vault custody active. | Runs when nextSettlementAt is due |
| paused | Settlement held for this market. | Skipped |
| settlement_disabled | Configured and trading; the instrument route has not activated for this market. Mainnet markets register here. | Skipped |
| closed | Retired. History remains readable. | Skipped |
The scheduler selects markets whose status is active and whose nextSettlementAt has passed. Every other status keeps the market out of settlement while its token keeps trading. Settlement describes the run itself, and Failure Modes covers the held states.
token_markets.graduationStatus
bonding while the coin trades on its curve; graduating once bonding progress reaches 75%; graduated when the curve completes and the coin trades on PumpSwap. PairStreet’s trade panel builds bonding-curve trades today; PumpSwap routing for graduated markets is in integration.
Key fields
The Pair Market row is small. Most of it is identity and configuration; the rest is a read model of the Pair’s ledger. The full column list, with types, is in Schemas.
| Field | Holds |
|---|---|
| tokenId, pairInstrumentId | The two sides of the Pair Market. |
| creatorWallet | The launching wallet. |
| pumpLaunchAddress, pumpMarketAddress | The Pump bonding curve, and the PumpSwap pool after graduation. |
| pairVaultAddress | The market’s Pair Vault. Set when its vault custody activates. |
| status, ledgerMode | Lifecycle state; live or development ledger. |
| configuration | Economic sources, reward methodology, cadence, exclusions and fee split (jsonb). |
| pairValueUsd, pairAssetBalanceRaw | Pair Value and the Pair Asset quantity held. |
| pairAssetAcquiredLifetimeUsd, pairAssetAcquiredLifetimeRaw | Everything ever acquired for the market. |
| holderRewardsLifetimeUsd, holderRewardsClaimableUsd, holderRewardsClaimedUsd | Reward totals by state. |
| eligibleHolders, settlementsCount | Counts from the latest epoch and settlement history. |
| nextSettlementAt, lastSettlementAt | Settlement schedule. |
| createdAt, graduatedAt | Timestamps. |
Configuration
configuration fixes how the Pair behaves. Every launch writes the same defaults: the Pair Vault share of creator fees (2,500 bps) and launch economics as economic sources, time-weighted balance as the reward methodology, a 3,600 second settlement cadence, and the creator and liquidity accounts excluded from rewards. The fee split is read back from chain after launch and stored with its status: locked, pending or mismatch.
{
"id": "<pair-market-uuid>",
"tokenId": "<token-uuid>",
"pairInstrumentId": "<tokyo-residential-uuid>",
"creatorWallet": "<creator-wallet>",
"pumpLaunchAddress": "<bonding-curve-address>",
"pumpMarketAddress": null,
"pairVaultAddress": null,
"status": "settlement_disabled",
"ledgerMode": "live",
"configuration": {
"economicSources": [
{ "source": "creator_fees", "bps": 2500 },
{ "source": "launch_economics" }
],
"rewardMethodology": "time_weighted_balance",
"settlementCadenceSec": 3600,
"excludeCreator": true,
"excludeLiquidityAccounts": true,
"excludedWallets": [],
"feeSplit": {
"creatorBps": 5000,
"protocolBps": 2500,
"pairVaultBps": 2500,
"treasury": "5XAwPtXHkA2F68tEj5ZAZePJfJWH4tzGkeQiqK5ggfRg",
"status": "locked",
"sharingConfig": "<fee-sharing-config-pda>",
"checkedAt": "<iso-timestamp>"
}
},
"pairValueUsd": 0,
"settlementsCount": 0,
"nextSettlementAt": null,
"lastSettlementAt": null,
"createdAt": "<iso-timestamp>",
"graduatedAt": null
}The example is the shape of a mainnet Pair Market right after launch: status settlement_disabled, no vault address yet, no settlements, fee split locked. Values in angle brackets are placeholders. How Pairing Works follows the same market from launch to a holder’s claim.