Skip to main content

On 9 October 2026 the Commodity Futures Trading Commission published two documents about the word “swap”. One of them, RIN 3038-AF82, is a notice of proposed rulemaking that would write event contracts based on sports, politics, cultural and weather events expressly into the swap definition. It is a proposal. Comments run for thirty days after it hits the Federal Register, and then the Commission decides.

The other one, RIN 3038-AF81, is an interim final rule. It takes effect the day it publishes, and it does the opposite job: it carves casino-style gambling products out of the swap definition altogether. Chairman Michael S. Selig summarised it in six words in the press release: “Casino-style gambling products are not derivatives.”

Almost all of the coverage went to the jurisdictional fight, which is fair enough, because that fight is enormous and we have written about it here before. Two federal appeals courts gave opposite answers to the same question, 39 states and the District of Columbia filed an amicus brief at the Supreme Court on 7 October in Flaherty v. KalshiEX, and this interim final rule is the Commission trying to settle the part of it that threatens its own turf.

That is not what interested me. What interested me is the operative text, because buried in it is the word raffles, and because across 24,044 words of the two documents combined, the word random appears zero times.

TL;DR

  • The CFTC’s interim final rule (RIN 3038-AF81) excludes “casino-style gambling products” from the swap definition, and its operative text names bingo, pool wagering, lotteries and raffles by hand.
  • The exclusion turns on two tests the Commission names itself: a Provider Test (are you licensed as a gaming operator under State or Tribal law) and a Product Test (does the thing trade multilaterally). Neither asks how the outcome is produced.
  • The Commission’s stated reason gambling is not a derivative is that “customers must accept the price set by the house”, and that the odds are “set by a licensed gaming operator acting as principal”. That is precisely the property a verifiable random function removes.
  • The word “random” appears 0 times in the 24,044 words of the two documents. So do “provably”, “blockchain” and “smart contract”. “Licensed” and its variants appear 20 times.
  • We measured a live Base lottery contract against the Commission’s own test: 10 owner-privileged functions, every one of them bounded on chain, the entire odds structure declared constant, and the function that turns randomness into winning numbers declared pure. The distinction the Commission asks commenters to find already compiles.

What the rule actually says

The interim final rule adds paragraph (7) to the definition of Swap in 17 CFR 1.3. The operative text is short enough to read in full, and worth it:

(i) The term swap as used in section 1a(47) of the Commodity Exchange Act does not include an agreement, contract, or transaction that:

(A) is offered or entered into by a person that is licensed or otherwise authorized to offer gambling or gaming products, or accept wagers, under the law of a State or the law of a federally recognized Indian tribe pursuant to the Indian Gaming Regulatory Act (25 U.S.C. § 2701 et seq.), is acting within the scope of that license or authorization, and such agreement, contract, or transaction is regulated as gaming or gambling under applicable State or Tribal law; and (B) is not traded on a board of trade, an organized exchange, a swap execution facility, or any other market in which trades are executed multilaterally or subject to individual negotiation.

The Commission calls prong (A) the Provider Test and prong (B) the Product Test. Read them again and notice what they are made of. Prong (A) is a question about paperwork: do you hold a licence, are you inside its scope, does a state regulator treat this as gambling. Prong (B) is a question about market structure: is this thing executed multilaterally or individually negotiated. Satisfy both and you are not a swap.

Then paragraph (ii) lists illustrations, and the third one is where on-chain gaming gets named without being noticed:

(C) Other Licensed Games of Chance. Any agreement, contract, or transaction in which a licensed operator accepts a wager in connection with any other game of chance (such as bingo, pool wagering, lotteries, and raffles).

Raffles. The thing this platform runs. Written into federal regulatory text on 9 October 2026, with a qualifier doing all of the load-bearing work: licensed operator. Every illustration in paragraph (ii) carries the same qualifier. A licensed sportsbook. A licensed casino operator. A licensed operator. The exclusion is not a description of a kind of game. It is a description of a kind of company.

Why the Commission says a wager is not a derivative

The preamble is more revealing than the rule. The Commission has to explain why a bet on a coin landing heads is structurally different from a swap, and the answer it reaches for, twice, is discretion over the price.

First, on tradability:

…subject to negotiation; rather, customers must accept the price set by the house. Because of these dynamics, gambling products are not inherently tradeable, which is a strong indicator that these products are not swaps or any other kind of derivative within the Commission’s jurisdiction.

Then, explaining the Product Test:

…whereas State and Tribal gaming regulation typically concerns bets or wagers in which the odds or “line” are set by a licensed gaming operator acting as principal with its customers on a bilateral basis.

And the companion proposal, arguing the other direction for event contracts, completes the picture:

…these participants support price discovery based on shifting supply and demand rather than odds manually adjusted by a bookmaker.

So there is a single axis running through both documents, and it is who moves the price. One end: a bookmaker adjusts the line by hand, acting as principal against you, and you take it or leave it. That is gambling, that is the states’ business, that is not a swap. The other end: a multilateral market discovers the price from supply and demand. That is a derivative, that is the CFTC’s business, that is a swap.

It is a coherent axis. It is also, for our purposes, an axis with exactly two labelled ends and nothing in between, because both ends assume a human being somewhere with a hand on the dial.

The third answer

Here is the unasked half. There is a third possible answer to “who moves the price”, and it is nobody, and it is not a rhetorical flourish. It is a deployment artefact with an address.

When a raffle’s odds are a compile-time constant in a contract whose bytecode is verified, and the winner is selected by a function that is mathematically incapable of reading the operator’s state, nobody is setting the line. Not because the operator is virtuous, not because an auditor signed something last year, but because the code that could do it was never written and the deployed bytecode is public.

Neither test sees that. The Provider Test asks for a licence number. The Product Test asks about execution venue. A provably fair draw fails the Provider Test the moment it has no state gaming licence, and it is not really a multilateral market either, so the Product Test is satisfied almost by accident. The one property that can actually be checked by a stranger is the one property that carries no weight anywhere in the analysis.

You do not have to take my reading of the emphasis. Count the vocabulary. Across the two documents, stripped of their repeated cover banner, there are 24,044 words. “Random” appears 0 times. “Provably” appears 0 times. “Blockchain” appears 0 times. “Smart contract” appears 0 times. “Verify” and its variants appear twice, both in the proposal and neither about a game: one asks whether a city hitting 97 degrees has measurable financial consequences, the other cites studies on what a college football win does to a university’s revenue. “Licen-” appears 20 times.

That is not a gotcha. The CFTC was not writing about us and had no reason to. It is a measurement of where the category boundaries of US derivatives law currently sit, and the answer is that they sit on licensure and venue, and not on verifiability.

Running the Commission’s test against live code

Abstract arguments about provable fairness are cheap, so here is the test applied to something deployed. Lotto39 at 0xE7B38Fd0DD070CEaD9c3A17EF0eEA5F39f3BD4E0 is a five-number lottery running on Base. It is not ours. We pulled it out of the VRF coordinator’s logs while measuring fulfilment races last week, and it is useful here precisely because we have no relationship with whoever runs it. Sourcify holds an exact match on both runtime and creation bytecode, verified 6 October 2026, solc 0.8.25, one source file, 1,586 lines.

The Commission’s question is whether the odds are “set by a licensed gaming operator acting as principal”. So: can the operator set the odds?

Every number that defines the game is declared constant, which in Solidity means it is baked into the bytecode and there is no storage slot to write:

  • TICKET_PRICE = 3,000,000, which is 3.00 USDC at six decimals
  • MIN_NUMBER = 1, MAX_NUMBER = 39, NUMBERS_TO_DRAW = 5, so the top prize is one chance in 575,757
  • FIRST_PRIZE_PERCENT = 50 and SECOND_PRIZE_PERCENT = 8 of the pool
  • THIRD_PRIZE = 100 USDC and FOURTH_PRIZE = 6 USDC, fixed
  • MAX_TICKETS_PER_ROUND = 1,500 and ROUND_DURATION = 7,200 seconds

We read all of those back off Base through base-rpc.publicnode.com rather than trusting the source file, and every one matched. The contract was on round 132 at the time of reading, its callback gas limit was 250,000, it pulls five random words with three confirmations, and its coordinator is 0xd5D517aBE5cF79B7e95eC98dB0f0277788aFF634, the Chainlink VRF 2.5 coordinator that serves Base.

The function that converts the oracle’s answer into winning numbers is declared internal pure. That is the whole argument in two keywords. A pure function cannot read contract storage, cannot read the owner, cannot read the block, cannot read anything except its own arguments. The compiler enforces it. Whoever controls this contract could not bias a draw towards a particular ticket without deploying different code at a different address, and anyone can see the address.

There is one wrinkle worth naming rather than hiding. That pure function reduces each 256-bit random word with a modulo against a shrinking range, 39 down to 35, which is textbook modulo bias. It is also the kind of bias that cannot reach a draw at this scale: the skew from folding 2 to the power of 256 into 39 buckets sits around 1 part in 10 to the power of 75, which is some seventy orders of magnitude below the chance of the oracle itself failing. Worth knowing it is there. Not worth losing sleep over.

Then there is the owner surface. The contract has exactly ten functions gated by onlyOwner, and here is all of them:

  • setCallbackGasLimit, bounded on chain to between 200,000 and 2,500,000
  • pause and unpause
  • manualExecuteDraw, which reverts unless canDraw() is true, which requires the VRF answer to have already arrived and the round not to have been drawn
  • retryRandomnessRequest, which reverts with RandomnessAlreadyReceived if an answer is in hand
  • continueDistribution and continueWinnerCount, batch crank handles for paying out
  • injectFunds
  • withdrawExcessFunds, which first calls checkFundSafety() and reverts if the requested amount exceeds the balance over and above committed prize pools
  • manualTransitionToNextRound

Ten levers. Timing, gas, pausing, cranking, and money that is provably surplus to the pool. Not one of them chooses a number, changes a price, or alters a payout ratio. The owner (0x8339025e651391F429535E57c65703fF00B83757) can stop the game and can make it late. It cannot make it crooked.

One honest note about how we proved that

We also fired speculative calls at the contract for functions like setTicketPrice(uint256), setOdds(uint256) and forceWinner(address), expecting them to fail. They did. So did a control call to definitelyNotAFunction(), and so did paused(), which almost certainly exists under a different name. A revert on this contract carries no information: it is what you get for a missing selector and what you get for a failed require. The probe proves nothing on its own, and we are saying so rather than quoting it as evidence.

The absence claim rests on the verified source plus the exact bytecode match, which together are a complete enumeration rather than a sample. That distinction matters more than the result. You cannot audit a casino by playing it, and you cannot audit a contract by poking it either.

The Commission asked the question. It just could not hear the answer.

The best part of the interim final rule is its third request for comment, which is the Commission saying out loud that it knows the line it has drawn is a proxy:

Are there better ways to draw an objective, functional distinction between swaps, on the one hand, and traditional gambling products, on the other hand?

An objective, functional distinction. That is a request for exactly the thing a pure function and a verified bytecode hash provide, and it was published in a document that never uses the word random.

Footnote 43 shows what happens to anything that falls outside the licensed bin. The Commission notes that the exclusion is “non-exclusive” and that other transactions might not be swaps either, then illustrates with two examples: “a casual bet between friends” and “a casino-style sportsbook illegally operating in a State that prohibits gambling”. That is the residual category. A chat between mates, or a crime. There is no third illustration, because the drafters had no reason to imagine a game whose fairness is a property of its deployment rather than its paperwork.

The asymmetry nobody is pricing

Look at the two instruments side by side, because the choice of instrument is itself the story.

The exclusion for licensed operators is an interim final rule. It binds on the day it publishes. The Commission invoked the Administrative Procedure Act’s good-cause exception at 5 U.S.C. 553(b)(B), citing the circuit split, the 39-state amicus brief, Arizona’s pending criminal case against a designated contract market and Minnesota’s attempted statutory ban. Comments are invited, but afterwards, and the rule is already running.

The inclusion of event contracts is a proposal. Thirty days of comment, then a decision, then maybe a final rule.

So on day one the incumbents with state licences got binding certainty and the federally-registered venues got an invitation to write in. Whatever you think of the merits, that is a real difference in legal weight, delivered on the same morning, in two documents issued by the same Secretary. If you are an on-chain game, you got neither, and the comment window on both closes thirty days after Federal Register publication.

What this does and does not mean for on-chain gaming

Nothing here changes what is legal. The swap definition is a jurisdictional boundary, not a permission slip, and an on-chain raffle that was a problem under some state’s gaming law on 8 October is exactly as much of a problem on 12 October. This is not legal advice and I am not your counsel.

It would also be glib to pretend a gaming licence does nothing. Licensing regimes carry self-exclusion registers, dispute resolution, advertising limits, solvency requirements and someone to ring when a payout does not arrive. A verifiable random function provides none of that. It answers one question, narrowly and completely: was the outcome chosen? That is a smaller claim than a licence makes, and as we found when Alberta opened its regulated market, it is also a claim no licensed operator in that market could make.

And the on-chain side is not spotless. Those ten owner functions are bounded, but they are not nothing: the timing lever in retryRandomnessRequest is the one that cost 23 draws on Base a result last week. Discretion over when is real discretion, even when discretion over what is gone.

But that is the point worth taking away. The federal government spent 24,044 words in a single morning sorting every wager in the United States into two bins, and the sorting key was a licence on one side and an order book on the other. The question of whether anybody can check the outcome did not appear, because for the entire history of the activity being regulated, nobody could.

That is the ninety-second unasked half of fairness. Every regulatory taxonomy of gambling ever written begins by identifying who holds the discretion, because the existence of a holder was never in doubt. On-chain gaming’s actual contribution is not cheaper draws or faster payouts. It is an answer that the category system has no cell for: a game where the honest response to “who sets the odds” is a constant in a verified contract, and the honest response to “who picks the winner” is a pure function and an oracle nobody at the table controls.

The Commission asked for an objective, functional distinction. It is already deployed, at 0xd5D517aBE5cF79B7e95eC98dB0f0277788aFF634 and at every contract that calls it, and somebody should put it in the comment file before the thirty days run out.

Satoshie runs provably fair raffles and coinflips on Base, with every outcome drawn by Chainlink VRF and every draw verifiable on chain. The odds are constants. Go and read them.

📷 Photo by dylan nolte on Unsplash

Valentina Ní Críonna

Author Valentina Ní Críonna

More posts by Valentina Ní Críonna