Skip to main content
The combos channel sends every module, neg-risk, combinatorial, bridge, and migration position event from the BinaryModule, the NegRiskModule, the AutoRedeemer, and the combinatorial market contracts. We decode each one and send it after the transaction is confirmed on-chain.
Plain CTF base-layer moves are on positions. Settlement events (resolution, pauses) are on resolution. ERC-1155 transfers are on transfers. Combinatorial setup (CombinatorialConditionPrepared) is on lifecycle.

Subscribe

{
  "action": "subscribe",
  "id": "s1",
  "channel": "combos"
}
With no filters, you get every confirmed combos event from all markets.

Filters

FilterTypeRequiredDescription
walletsstring[]NoHex addresses (0x…). Keeps events where a listed address is a participant.
market_idsstring[]NoCondition/market IDs as hex strings. Keeps events for those markets.
token_idsstring[]NoToken/position IDs as decimal strings. Keeps events for the listed positions.
market_ids and token_ids are one axis. min_usd is ignored here. Module and combinatorial events use compact bytes31/bytes29 ids and position ids, so market matching here is coarser than on trading. See Filters for the combination rule.

Events

This channel sends all twenty-five module, combinatorial, bridge, and migration events. See Onchain Data for the part each event plays.

Redemptions

Eventdata.typeDescription
RedemptionredemptionAn AutoRedeemer redemption. Tracks automatic position settlement by position id.
BinaryRedemptionbinary_redemptionA BinaryModule redemption. Tracks binary market position settlement by condition id.
NegRiskRedemptionneg_risk_redemptionA NegRiskModule redemption. Tracks neg-risk position settlement by condition id.
PositionRedeemedposition_redeemedA position redeemed through a module. Carries the initiator, position id, recipient, amount, and payout.

NegRisk conversions

Eventdata.typeDescription
CollateralPositionsConvertedcollateral_positions_convertedA NegRisk collateral swap between outcome positions. Tracks risk moving across neg-risk structures.
NegRiskPositionsConvertedneg_risk_positions_convertedA NegRisk position swap at the adapter layer. Tracks risk moving across neg-risk token structures.
PositionConvertedposition_convertedA position converted inside the NegRisk module. Carries the initiator, event id, recipient, condition index, and amount.

Module position ops

Eventdata.typeDescription
ModulePositionsMergedmodule_positions_mergedPositions merged inside a module. Carries the initiator, condition id, recipient, and amount.
ModulePositionsSplitmodule_positions_splitPositions split inside a module. Carries the initiator, condition id, two recipients, and amount.
HorizontalMergehorizontal_mergeA NegRisk horizontal merge across outcomes. Turns a full set of outcome positions back into collateral in an event.
HorizontalSplithorizontal_splitA NegRisk horizontal split across outcomes. Turns collateral into a full set of outcome positions in an event.

Combinatorial

Eventdata.typeDescription
SplitOnConditionsplit_on_conditionA split for just one condition in a combinatorial market. Carries parent and child condition ids and amount.
MergedOnConditionmerged_on_conditionA merge for just one condition in a combinatorial market. Carries parent and child condition ids and amount.
ConvertedToYesBasketconverted_to_yes_basketPositions turned into a yes basket. Carries the user, full condition id, and amount.
MergedFromYesBasketmerged_from_yes_basketPositions merged out of a yes basket. Carries the user, full condition id, and amount.
ExtractedextractedPositions taken out of a combinatorial structure. Carries the user, full and reduced condition ids, residual condition id, and amount.
InjectedinjectedPositions put into a combinatorial structure. Carries the user, full and reduced condition ids, residual condition id, and amount.
CompressedcompressedPositions compressed in the combinatorial module. Combines many positions into one token.
CombinatorialWrappedcombinatorial_wrappedPositions wrapped in the combinatorial module. Carries the user, underlying position id, new combinatorial position id, and amount.
CombinatorialUnwrappedcombinatorial_unwrappedPositions unwrapped in the combinatorial module. Carries the user, combinatorial position id, underlying position id, and amount.

Bridge and migration

Eventdata.typeDescription
PositionMigratedposition_migratedA position moved across module versions. Carries the sender, condition id, position id, outcome index, and amount.
MigrationResolvedmigration_resolvedA migration resolved. Carries both condition ids, legacy payouts, and v2 result numerators.
BridgePositionMintedbridge_position_mintedA bridge position minted. Carries the recipient address, position id, and amount.
BridgePositionsBurnedbridge_positions_burnedBridge positions burned on the source side. Carries arrays of position ids and amounts.
LegacyCollateralSettledlegacy_collateral_settledLegacy collateral settled during migration. Carries the legacy token, vault address, and amount.

Payloads

Every frame wraps the event in the standard envelope (type, id, channel, confirmed, data) shown on Frames. Below, each block is the data object for one event — its type discriminator plus every field the ABI decodes. A full frame looks like:
{
  "type": "event",
  "id": "s1",
  "channel": "combos",
  "confirmed": true,
  "data": {
    "type": "neg_risk_redemption",
    "from": "0x…",
    "conditionId": "0x…",
    "…": "…"
  }
}
Module events use compact ids: conditionId is bytes31 and eventId is bytes29 (not the bytes32 used on trading and base-layer channels). Position ids and amounts are uint256, serialized as 0x… hex.

Redemptions

redemption

Redemption on the AutoRedeemer. An automatic position settlement, keyed by position id.
{ "type": "redemption", "from": "0x…", "positionId": "0x…", "payout": "0x…" }
FieldSolidity typeDescription
typestringredemption.
fromaddress (hex)Address that redeemed the position.
positionIduint256 (hex)Position id redeemed.
payoutuint256 (hex)Collateral paid out.

binary_redemption

BinaryRedemption on the BinaryModule. A binary-market position settled, keyed by condition id.
{
  "type": "binary_redemption",
  "from": "0x…",
  "conditionId": "0x…",
  "payout": "0x…"
}
FieldSolidity typeDescription
typestringbinary_redemption.
fromaddress (hex)Address that redeemed the position.
conditionIdbytes32 (hex)Condition being redeemed.
payoutuint256 (hex)Collateral paid out.

neg_risk_redemption

NegRiskRedemption on the NegRiskModule. A neg-risk position settled, keyed by condition id.
{
  "type": "neg_risk_redemption",
  "from": "0x…",
  "conditionId": "0x…",
  "payout": "0x…"
}
FieldSolidity typeDescription
typestringneg_risk_redemption.
fromaddress (hex)Address that redeemed the position.
conditionIdbytes32 (hex)Condition being redeemed.
payoutuint256 (hex)Collateral paid out.

position_redeemed

PositionRedeemed on a module. A position redeemed through a module, with the initiator, recipient, and amounts.
{
  "type": "position_redeemed",
  "initiator": "0x…",
  "positionId": "0x…",
  "recipient": "0x…",
  "amount": "0x…",
  "payout": "0x…"
}
FieldSolidity typeDescription
typestringposition_redeemed.
initiatoraddress (hex)Address that started the redemption.
positionIduint256 (hex)Position id redeemed.
recipientaddress (hex)Address that received the payout.
amountuint256 (hex)Position amount redeemed.
payoutuint256 (hex)Collateral paid out.

NegRisk conversions

collateral_positions_converted

PositionsConverted on the NegRiskCtfCollateralAdapter. A collateral swap between outcome positions, with the amount out.
{
  "type": "collateral_positions_converted",
  "initiator": "0x…",
  "marketId": "0x…",
  "indexSet": "0x…",
  "amount": "0x…",
  "amountOut": "0x…"
}
FieldSolidity typeDescription
typestringcollateral_positions_converted.
initiatoraddress (hex)Address that converted the positions.
marketIdbytes32 (hex)Neg-risk market the conversion is in.
indexSetuint256 (hex)Index set of the outcomes converted.
amountuint256 (hex)Amount converted in.
amountOutuint256 (hex)Amount produced by the conversion.

neg_risk_positions_converted

PositionsConverted on the NegRiskAdapter. A neg-risk position swap at the adapter layer.
{
  "type": "neg_risk_positions_converted",
  "stakeholder": "0x…",
  "marketId": "0x…",
  "indexSet": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringneg_risk_positions_converted.
stakeholderaddress (hex)Address that converted the positions.
marketIdbytes32 (hex)Neg-risk market the conversion is in.
indexSetuint256 (hex)Index set of the outcomes converted.
amountuint256 (hex)Amount converted.

position_converted

PositionConverted on the NegRiskModule. A position converted inside the module, keyed by event id and condition index.
{
  "type": "position_converted",
  "initiator": "0x…",
  "eventId": "0x…",
  "recipient": "0x…",
  "conditionIndex": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringposition_converted.
initiatoraddress (hex)Address that converted the position.
eventIdbytes29 (hex)Module event the conversion is in.
recipientaddress (hex)Address that received the result.
conditionIndexuint256 (hex)Index of the condition converted.
amountuint256 (hex)Amount converted.

Module position ops

module_positions_merged

PositionsMerged on a module. Positions merged inside a module, keyed by condition id.
{
  "type": "module_positions_merged",
  "initiator": "0x…",
  "conditionId": "0x…",
  "recipient": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringmodule_positions_merged.
initiatoraddress (hex)Address that merged the positions.
conditionIdbytes31 (hex)Module condition id.
recipientaddress (hex)Address that received the merge.
amountuint256 (hex)Amount merged.

module_positions_split

PositionsSplit on a module. Positions split inside a module, into two recipients.
{
  "type": "module_positions_split",
  "initiator": "0x…",
  "conditionId": "0x…",
  "recipient0": "0x…",
  "recipient1": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringmodule_positions_split.
initiatoraddress (hex)Address that split the positions.
conditionIdbytes31 (hex)Module condition id.
recipient0address (hex)First recipient of the split.
recipient1address (hex)Second recipient of the split.
amountuint256 (hex)Amount split.

horizontal_merge

HorizontalMerge on the NegRiskModule. A full set of outcome positions merged back into collateral across an event.
{
  "type": "horizontal_merge",
  "initiator": "0x…",
  "eventId": "0x…",
  "recipient": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringhorizontal_merge.
initiatoraddress (hex)Address that merged the positions.
eventIdbytes29 (hex)Module event the merge is in.
recipientaddress (hex)Address that received the merge.
amountuint256 (hex)Amount merged.

horizontal_split

HorizontalSplit on the NegRiskModule. Collateral split into a full set of outcome positions across an event.
{
  "type": "horizontal_split",
  "initiator": "0x…",
  "eventId": "0x…",
  "recipient": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringhorizontal_split.
initiatoraddress (hex)Address that split the positions.
eventIdbytes29 (hex)Module event the split is in.
recipientaddress (hex)Address that received the split.
amountuint256 (hex)Amount split.

Combinatorial

split_on_condition

SplitOnCondition on the combinatorial module. A split on one condition inside a combinatorial market.
{
  "type": "split_on_condition",
  "user": "0x…",
  "parentConditionId": "0x…",
  "childYesConditionId": "0x…",
  "childNoConditionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringsplit_on_condition.
useraddress (hex)Address that split the position.
parentConditionIdbytes31 (hex)Parent condition being split.
childYesConditionIdbytes31 (hex)Child condition for the yes branch.
childNoConditionIdbytes31 (hex)Child condition for the no branch.
amountuint256 (hex)Amount split.

merged_on_condition

MergedOnCondition on the combinatorial module. A merge on one condition inside a combinatorial market.
{
  "type": "merged_on_condition",
  "user": "0x…",
  "parentConditionId": "0x…",
  "childYesConditionId": "0x…",
  "childNoConditionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringmerged_on_condition.
useraddress (hex)Address that merged the position.
parentConditionIdbytes31 (hex)Parent condition being merged.
childYesConditionIdbytes31 (hex)Child condition for the yes branch.
childNoConditionIdbytes31 (hex)Child condition for the no branch.
amountuint256 (hex)Amount merged.

converted_to_yes_basket

ConvertedToYesBasket on the combinatorial module. Positions turned into a yes basket.
{
  "type": "converted_to_yes_basket",
  "user": "0x…",
  "fullConditionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringconverted_to_yes_basket.
useraddress (hex)Address that converted the position.
fullConditionIdbytes31 (hex)Full combinatorial condition id.
amountuint256 (hex)Amount converted.

merged_from_yes_basket

MergedFromYesBasket on the combinatorial module. Positions merged out of a yes basket.
{
  "type": "merged_from_yes_basket",
  "user": "0x…",
  "fullConditionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringmerged_from_yes_basket.
useraddress (hex)Address that merged the position.
fullConditionIdbytes31 (hex)Full combinatorial condition id.
amountuint256 (hex)Amount merged.

extracted

Extracted on the combinatorial module. Positions taken out of a combinatorial structure, leaving a residual.
{
  "type": "extracted",
  "user": "0x…",
  "fullConditionId": "0x…",
  "reducedConditionId": "0x…",
  "residualConditionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringextracted.
useraddress (hex)Address that extracted the position.
fullConditionIdbytes31 (hex)Full condition before extraction.
reducedConditionIdbytes31 (hex)Condition after the extracted leg is removed.
residualConditionIdbytes31 (hex)Residual condition left behind.
amountuint256 (hex)Amount extracted.

injected

Injected on the combinatorial module. Positions put into a combinatorial structure — the inverse of extracted.
{
  "type": "injected",
  "user": "0x…",
  "fullConditionId": "0x…",
  "reducedConditionId": "0x…",
  "residualConditionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringinjected.
useraddress (hex)Address that injected the position.
fullConditionIdbytes31 (hex)Full condition after injection.
reducedConditionIdbytes31 (hex)Condition before the injected leg is added.
residualConditionIdbytes31 (hex)Residual condition combined in.
amountuint256 (hex)Amount injected.

compressed

Compressed on the combinatorial module. Many positions combined into one token.
{
  "type": "compressed",
  "user": "0x…",
  "oldPositionId": "0x…",
  "newPositionId": "0x…",
  "amount": "0x…",
  "positionAmount": "0x…",
  "collateralOut": "0x…"
}
FieldSolidity typeDescription
typestringcompressed.
useraddress (hex)Address that compressed the positions.
oldPositionIduint256 (hex)Position id being compressed.
newPositionIduint256 (hex)Resulting compressed position id.
amountuint256 (hex)Amount compressed.
positionAmountuint256 (hex)Resulting position amount.
collateralOutuint256 (hex)Collateral released by the compression.

combinatorial_wrapped

Wrapped on the combinatorial module. A position wrapped into a combinatorial position token.
{
  "type": "combinatorial_wrapped",
  "user": "0x…",
  "underlyingPositionId": "0x…",
  "combinatorialPositionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringcombinatorial_wrapped.
useraddress (hex)Address that wrapped the position.
underlyingPositionIduint256 (hex)Underlying position id wrapped.
combinatorialPositionIduint256 (hex)Resulting combinatorial position id.
amountuint256 (hex)Amount wrapped.

combinatorial_unwrapped

Unwrapped on the combinatorial module. A combinatorial position token unwrapped back to its underlying — the inverse of combinatorial_wrapped.
{
  "type": "combinatorial_unwrapped",
  "user": "0x…",
  "combinatorialPositionId": "0x…",
  "underlyingPositionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringcombinatorial_unwrapped.
useraddress (hex)Address that unwrapped the position.
combinatorialPositionIduint256 (hex)Combinatorial position id unwrapped.
underlyingPositionIduint256 (hex)Resulting underlying position id.
amountuint256 (hex)Amount unwrapped.

Bridge and migration

position_migrated

PositionMigrated on a module. A position moved across module versions.
{
  "type": "position_migrated",
  "from": "0x…",
  "conditionId": "0x…",
  "positionId": "0x…",
  "outcomeIndex": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringposition_migrated.
fromaddress (hex)Address whose position migrated.
conditionIdbytes31 (hex)Module condition id.
positionIduint256 (hex)Position id migrated.
outcomeIndexuint256 (hex)Outcome index within the condition.
amountuint256 (hex)Amount migrated.

migration_resolved

MigrationResolved on a module. A migration resolved, with both condition ids, the legacy payouts, and v2 result numerators.
{
  "type": "migration_resolved",
  "conditionId": "0x…",
  "legacyConditionId": "0x…",
  "legacyPayout0": "0x…",
  "legacyPayout1": "0x…",
  "result0": "0x…",
  "result1": "0x…"
}
FieldSolidity typeDescription
typestringmigration_resolved.
conditionIdbytes31 (hex)v2 condition id.
legacyConditionIdbytes32 (hex)Matching legacy condition id.
legacyPayout0uint256 (hex)Legacy payout numerator for outcome 0.
legacyPayout1uint256 (hex)Legacy payout numerator for outcome 1.
result0uint256 (hex)v2 result numerator for outcome 0.
result1uint256 (hex)v2 result numerator for outcome 1.

bridge_position_minted

BridgePositionMinted on a module. A bridge position minted on the destination side.
{
  "type": "bridge_position_minted",
  "to": "0x…",
  "positionId": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringbridge_position_minted.
toaddress (hex)Address that received the position.
positionIduint256 (hex)Position id minted.
amountuint256 (hex)Amount minted.

bridge_positions_burned

BridgePositionsBurned on a module. Bridge positions burned on the source side. The positionIds and amounts arrays line up index for index.
{
  "type": "bridge_positions_burned",
  "positionIds": ["0x…", "0x…"],
  "amounts": ["0x…", "0x…"]
}
FieldSolidity typeDescription
typestringbridge_positions_burned.
positionIdsuint256[] (hex)Position ids burned.
amountsuint256[] (hex)Amount burned per id, in the same order.

legacy_collateral_settled

LegacyCollateralSettled on a module. Legacy collateral settled during migration.
{
  "type": "legacy_collateral_settled",
  "legacyToken": "0x…",
  "vault": "0x…",
  "amount": "0x…"
}
FieldSolidity typeDescription
typestringlegacy_collateral_settled.
legacyTokenaddress (hex)Legacy collateral token settled.
vaultaddress (hex)Vault the collateral settled to.
amountuint256 (hex)Amount settled.

Pending feed

Set confirmed: false on your subscribe to get the pending feed of this channel — the same payload shape for pending transactions sent to the BinaryModule, NegRiskModule, AutoRedeemer, and combinatorial contracts, before they are in a block. Pending events are guesses. A transaction can be dropped, replaced, or reverted. See Mempool for the full frame shape and how to handle it.
{
  "action": "subscribe",
  "id": "pending",
  "channel": "combos",
  "confirmed": false
}
Last modified on July 5, 2026