BetSwirl BNB Chain

betswirl-bnb · BNB Smart Chain

The first subgraph stopgap nest: BetSwirl on-chain games on BNB Smart Chain, whose subgraph no indexer serves since 2026-09-17. Answers every field BetSwirl's own SDK queries over Graph-dialect GraphQL, exactly, and refuses the rest by name.

statusavailable
categoryOther
tier3
complexitymedium
discoveryfixed addresses

What it indexes

Each event becomes a decoded SQL table.

PlaceBet, Roll, BetRefunded, AddToken, SetHouseEdge, SetAffiliateHouseEdge, AllocateHouseEdgeAmount, GameConfigAdded

Retired 2026-10-07: no users, hosted endpoint off. Hand-ported from deployment Qmd5oqyojVx5wWSFuWfKz3YVLPHdE3KU5458Qqq3SVeGEB: rules read from the deployed WASM, checked against 32,257 bets from raw chain logs with zero differences. GraphQL needs the nuthatch-graph download (4.11.0+); history needs a BNB archive endpoint, or seed it from the public mirror. Handback: docs/stopgap/betswirl-bnb.md in nuthatch-org/nuthatch.

Run it yourself

The nest is a git repository: ABIs, views and a manifest. One command scaffolds a local copy, and nuthatch dev in it backfills and follows the chain against your own RPC.

nuthatch init --from https://github.com/nuthatch-org/betswirl-bnb-nest

Source: nuthatch-org/betswirl-bnb-nest.

Published data

We run this nest and publish its sealed segments to the public mirror, each stored under the hash of its contents. The figures are what the mirror listed on 2026-11-11, when this page was built; Play reads the mirror as it is now.

tables89
segments260
rows sealed383,472
sealed through block74,528,151
datasetf00657c71f08fbf5c0badbfe236aaa467960d865380be29dff40abae84786c31
views from nuthatch-org/betswirl-bnb-nest at 92d6588

Query it in your tab →

Authored views

The nest’s own SQL over its event tables, as published. Open one to read it.

bs_placementviews/10-bs-placement.sql
views/10-bs-placement.sql
-- Every PlaceBet, as the arguments the mapping's _createBet receives.
CREATE VIEW bs_placement AS
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Dice' AS game_id, NULL AS config_id, CAST(p."cap" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "dice_v1__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Dice' AS game_id, NULL AS config_id, CAST(p."cap" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "dice_v2__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Dice' AS game_id, NULL AS config_id, CAST(p."cap" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "dice_v3__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Dice' AS game_id, NULL AS config_id, CAST(p."cap" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "dice_v4__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Dice' AS game_id, NULL AS config_id, CAST(p."cap" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "dice_v4_5__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, receiver AS bettor, p.token, p.affiliate AS affiliate,
       p.amount AS amount, CAST(p."betCount" AS VARCHAR) AS bet_count, p."stopLoss" AS stop_loss, p."stopGain" AS stop_gain,
       'Dice' AS game_id, NULL AS config_id, CAST(p."cap" AS VARCHAR) AS input_value, p."chargedVRFCost" AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "dice_v5__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'CoinToss' AS game_id, NULL AS config_id, CASE WHEN p."face" = 'true' THEN '1' ELSE '0' END AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "coin_toss_v1__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'CoinToss' AS game_id, NULL AS config_id, CASE WHEN p."face" = 'true' THEN '1' ELSE '0' END AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "coin_toss_v2__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'CoinToss' AS game_id, NULL AS config_id, CASE WHEN p."face" = 'true' THEN '1' ELSE '0' END AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "coin_toss_v3__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'CoinToss' AS game_id, NULL AS config_id, CASE WHEN p."face" = 'true' THEN '1' ELSE '0' END AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "coin_toss_v4__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'CoinToss' AS game_id, NULL AS config_id, CASE WHEN p."face" = 'true' THEN '1' ELSE '0' END AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "coin_toss_v4_5__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, receiver AS bettor, p.token, p.affiliate AS affiliate,
       p.amount AS amount, CAST(p."betCount" AS VARCHAR) AS bet_count, p."stopLoss" AS stop_loss, p."stopGain" AS stop_gain,
       'CoinToss' AS game_id, NULL AS config_id, CASE WHEN p."face" = 'true' THEN '1' ELSE '0' END AS input_value, p."chargedVRFCost" AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "coin_toss_v5__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       '0' AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Roulette' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "roulette_v1__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Roulette' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "roulette_v2__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Roulette' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "roulette_v2_5__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, receiver AS bettor, p.token, p.affiliate AS affiliate,
       p.amount AS amount, CAST(p."betCount" AS VARCHAR) AS bet_count, p."stopLoss" AS stop_loss, p."stopGain" AS stop_gain,
       'Roulette' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, p."chargedVRFCost" AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "roulette_v3__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Keno' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "keno_v1__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, "user" AS bettor, p.token, '0x0000000000000000000000000000000000000000' AS affiliate,
       p.amount AS amount, '1' AS bet_count, '0' AS stop_loss, '0' AS stop_gain,
       'Keno' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, '0' AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "keno_v1_5__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, receiver AS bettor, p.token, p.affiliate AS affiliate,
       p.amount AS amount, CAST(p."betCount" AS VARCHAR) AS bet_count, p."stopLoss" AS stop_loss, p."stopGain" AS stop_gain,
       'Keno' AS game_id, NULL AS config_id, CAST(p."numbers" AS VARCHAR) AS input_value, p."chargedVRFCost" AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "keno_v2__place_bet" p
UNION ALL
SELECT CAST(p.id AS VARCHAR) AS id, receiver AS bettor, p.token, p.affiliate AS affiliate,
       p.amount AS amount, CAST(p."betCount" AS VARCHAR) AS bet_count, p."stopLoss" AS stop_loss, p."stopGain" AS stop_gain,
       NULL AS game_id, CAST(p."configId" AS BIGINT) AS config_id, CAST(p."configId" AS VARCHAR) AS input_value, p."chargedVRFCost" AS charged_vrf_fees,
       p.address AS game_address, CAST(p.block_timestamp AS BIGINT) AS ts, p.tx_hash, CAST(p.block_number AS BIGINT) * 1000000 + CAST(p.log_index AS BIGINT) AS pos
FROM "weighted_game_v1__place_bet" p;
bs_house_edge, bs_affiliate_house_edgeviews/11-bs-house-edge.sql
views/11-bs-house-edge.sql
-- Every write of GameToken.houseEdge, keyed as the mapping keys it: by gameId string, not by contract.
CREATE VIEW bs_house_edge AS
SELECT 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v1__set_house_edge" e
UNION ALL
SELECT 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v2__set_house_edge" e
UNION ALL
SELECT 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v3__set_house_edge" e
UNION ALL
SELECT 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v4__set_house_edge" e
UNION ALL
SELECT 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v4_5__set_house_edge" e
UNION ALL
SELECT 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v5__set_house_edge" e
UNION ALL
SELECT 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v1__set_house_edge" e
UNION ALL
SELECT 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v2__set_house_edge" e
UNION ALL
SELECT 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v3__set_house_edge" e
UNION ALL
SELECT 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v4__set_house_edge" e
UNION ALL
SELECT 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v4_5__set_house_edge" e
UNION ALL
SELECT 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v5__set_house_edge" e
UNION ALL
SELECT 'Roulette' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "roulette_v1__set_house_edge" e
UNION ALL
SELECT 'Roulette' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "roulette_v2__set_house_edge" e
UNION ALL
SELECT 'Roulette' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "roulette_v2_5__set_house_edge" e
UNION ALL
SELECT 'Roulette' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "roulette_v3__set_house_edge" e
UNION ALL
SELECT 'Keno' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "keno_v1__set_house_edge" e
UNION ALL
SELECT 'Keno' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "keno_v1_5__set_house_edge" e
UNION ALL
SELECT 'Keno' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "keno_v2__set_house_edge" e
UNION ALL
SELECT w.game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "weighted_game_v1__set_house_edge" e
CROSS JOIN (VALUES ('Wheel'), ('Plinko'), ('Mines'), ('Diamonds'), ('Slide'), ('Slot'), ('CUSTOM_WEIGHTED_GAME')) AS w(game_id);

-- AffiliateGameToken.houseEdge writes. A zero affiliate never gets an AffiliateGameToken.
CREATE VIEW bs_affiliate_house_edge AS
SELECT e.affiliate, 'Dice' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "dice_v5__set_affiliate_house_edge" e WHERE e.affiliate <> '0x0000000000000000000000000000000000000000'
UNION ALL
SELECT e.affiliate, 'CoinToss' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "coin_toss_v5__set_affiliate_house_edge" e WHERE e.affiliate <> '0x0000000000000000000000000000000000000000'
UNION ALL
SELECT e.affiliate, 'Roulette' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "roulette_v3__set_affiliate_house_edge" e WHERE e.affiliate <> '0x0000000000000000000000000000000000000000'
UNION ALL
SELECT e.affiliate, 'Keno' AS game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "keno_v2__set_affiliate_house_edge" e WHERE e.affiliate <> '0x0000000000000000000000000000000000000000'
UNION ALL
SELECT e.affiliate, w.game_id, e.token, CAST(e."houseEdge" AS INTEGER) AS house_edge, CAST(e.block_number AS BIGINT) * 1000000 + CAST(e.log_index AS BIGINT) AS pos
FROM "weighted_game_v1__set_affiliate_house_edge" e
CROSS JOIN (VALUES ('Wheel'), ('Plinko'), ('Mines'), ('Diamonds'), ('Slide'), ('Slot'), ('CUSTOM_WEIGHTED_GAME')) AS w(game_id)
WHERE e.affiliate <> '0x0000000000000000000000000000000000000000';
bs_resolutionviews/12-bs-resolution.sql
views/12-bs-resolution.sql
-- Every Roll and BetRefunded, as the arguments _rollBet and _refundBet receive. A resolution only
-- touches a bet that already exists, which bs_applied decides.
CREATE VIEW bs_resolution AS
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v1__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v2__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v3__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v4__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v4_5__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r.receiver AS r_user, r.token AS r_token, '0' AS amount,
       r."totalBetAmount" AS total, r.payout, string_to_array(replace(replace(replace(trim(r.rolled, '[]'), 'true', '1'), 'false', '0'), '"', ''), ',') AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v5__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CASE WHEN r.rolled = 'true' THEN '1' ELSE '0' END) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v1__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CASE WHEN r.rolled = 'true' THEN '1' ELSE '0' END) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v2__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CASE WHEN r.rolled = 'true' THEN '1' ELSE '0' END) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v3__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CASE WHEN r.rolled = 'true' THEN '1' ELSE '0' END) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v4__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CASE WHEN r.rolled = 'true' THEN '1' ELSE '0' END) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v4_5__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r.receiver AS r_user, r.token AS r_token, '0' AS amount,
       r."totalBetAmount" AS total, r.payout, string_to_array(replace(replace(replace(trim(r.rolled, '[]'), 'true', '1'), 'false', '0'), '"', ''), ',') AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v5__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v1__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v2__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v2_5__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r.receiver AS r_user, r.token AS r_token, '0' AS amount,
       r."totalBetAmount" AS total, r.payout, string_to_array(replace(replace(replace(trim(r.rolled, '[]'), 'true', '1'), 'false', '0'), '"', ''), ',') AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v3__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "keno_v1__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r."user" AS r_user, r.token AS r_token, r.amount AS amount,
       r.amount AS total, r.payout, make_array(CAST(r.rolled AS VARCHAR)) AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "keno_v1_5__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r.receiver AS r_user, r.token AS r_token, '0' AS amount,
       r."totalBetAmount" AS total, r.payout, string_to_array(replace(replace(replace(trim(r.rolled, '[]'), 'true', '1'), 'false', '0'), '"', ''), ',') AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "keno_v2__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'roll' AS kind, r.receiver AS r_user, r.token AS r_token, '0' AS amount,
       r."totalBetAmount" AS total, r.payout, string_to_array(replace(replace(replace(trim(r.rolled, '[]'), 'true', '1'), 'false', '0'), '"', ''), ',') AS rolled, r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "weighted_game_v1__roll" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v1__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v2__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v3__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v4__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v4_5__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "dice_v5__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v1__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v2__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v3__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v4__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v4_5__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "coin_toss_v5__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v1__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v2__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v2_5__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       r.amount AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "roulette_v3__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "keno_v1__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "keno_v1_5__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "keno_v2__bet_refunded" r
UNION ALL
SELECT CAST(r.id AS VARCHAR) AS id, 'refund' AS kind, CAST(NULL AS VARCHAR) AS r_user, CAST(NULL AS VARCHAR) AS r_token,
       '0' AS amount, r.amount AS total, r.amount AS payout, CAST(NULL AS VARCHAR[]) AS rolled,
       r.tx_hash, CAST(r.block_timestamp AS BIGINT) AS ts, CAST(r.block_number AS BIGINT) * 1000000 + CAST(r.log_index AS BIGINT) AS pos
FROM "weighted_game_v1__bet_refunded" r;
bs_config, bs_placed, bs_appliedviews/13-bs-placed.sql
views/13-bs-placed.sql
-- Placements with the weighted game's gameId resolved from the config as of the bet
-- (handleWeightedGamePlaceBetV1 falls back to CUSTOM_WEIGHTED_GAME when the config is missing).
CREATE VIEW bs_config AS
SELECT CAST(c."configId" AS BIGINT) AS config_id,
       CASE CAST(c."gameId" AS BIGINT) WHEN 1 THEN 'Wheel' WHEN 2 THEN 'Plinko' WHEN 3 THEN 'Mines' WHEN 4 THEN 'Diamonds' WHEN 5 THEN 'Slide' WHEN 6 THEN 'Slot' ELSE 'CUSTOM_WEIGHTED_GAME' END AS game_id,
       CAST(c."gameId" AS VARCHAR) AS weighted_game_id, c.weights, c.multipliers,
       CAST(c.block_timestamp AS BIGINT) AS ts, CAST(c.block_number AS BIGINT) * 1000000 + CAST(c.log_index AS BIGINT) AS pos
FROM "weighted_game_v1__game_config_added" c;

-- Burrmill computes a view referenced twice in one statement once only when it holds an aggregate,
-- so this and bs_applied are written as GROUP BYs: every view below reads them without a rescan.
CREATE VIEW bs_placed AS
WITH cfg AS (
  SELECT CAST(w.block_number AS BIGINT) * 1000000 + CAST(w.log_index AS BIGINT) AS bet_pos, max(c.pos) AS cfg_pos
  FROM "weighted_game_v1__place_bet" w JOIN bs_config c ON c.config_id = CAST(w."configId" AS BIGINT) AND c.pos < CAST(w.block_number AS BIGINT) * 1000000 + CAST(w.log_index AS BIGINT)
  GROUP BY 1
)
SELECT p.id, p.bettor, p.token, p.affiliate, p.amount, p.bet_count, p.stop_loss, p.stop_gain,
       COALESCE(p.game_id, c.game_id, 'CUSTOM_WEIGHTED_GAME') AS game_id, p.config_id, p.input_value,
       p.charged_vrf_fees, p.game_address, p.ts, p.tx_hash, p.pos
FROM bs_placement p LEFT JOIN cfg ON cfg.bet_pos = p.pos LEFT JOIN bs_config c ON c.pos = cfg.cfg_pos;

-- Resolutions that reached a bet: the placement current at the resolution's position.
CREATE VIEW bs_applied AS
WITH j AS (
  SELECT r.*, p.pos AS placement_pos, p.bettor, p.token AS p_token, p.bet_count
  FROM bs_resolution r JOIN bs_placed p ON p.id = r.id AND p.pos < r.pos
), m AS (
  SELECT pos, max(placement_pos) AS placement_pos FROM j GROUP BY pos
)
SELECT j.* FROM j JOIN m ON m.pos = j.pos AND m.placement_pos = j.placement_pos;
bs_payout_multiplierviews/14-bs-payout-multiplier.sql
views/14-bs-payout-multiplier.sql
-- Bet.payoutMultiplier for a roll, as graph-node computes payout.toBigDecimal() / totalBetAmount.toBigDecimal().
CREATE VIEW bs_payout_multiplier AS
WITH n AS (
  SELECT pos, (CASE WHEN length(payout) <= 34 THEN payout ELSE (CASE WHEN length(payout) > 34 AND substr(payout, 35, 1) >= '5'
  THEN (CASE WHEN rtrim(substr(payout, 1, 34), '9') = '' THEN '1' || repeat('0', length(substr(payout, 1, 34)))
  ELSE substr(rtrim(substr(payout, 1, 34), '9'), 1, length(rtrim(substr(payout, 1, 34), '9')) - 1)
    || chr(ascii(substr(rtrim(substr(payout, 1, 34), '9'), length(rtrim(substr(payout, 1, 34), '9')), 1)) + 1)
    || repeat('0', length(substr(payout, 1, 34)) - length(rtrim(substr(payout, 1, 34), '9'))) END) ELSE substr(payout, 1, 34) END) || repeat('0', length(payout) - 34) END) AS p, (CASE WHEN length(total) <= 34 THEN total ELSE (CASE WHEN length(total) > 34 AND substr(total, 35, 1) >= '5'
  THEN (CASE WHEN rtrim(substr(total, 1, 34), '9') = '' THEN '1' || repeat('0', length(substr(total, 1, 34)))
  ELSE substr(rtrim(substr(total, 1, 34), '9'), 1, length(rtrim(substr(total, 1, 34), '9')) - 1)
    || chr(ascii(substr(rtrim(substr(total, 1, 34), '9'), length(rtrim(substr(total, 1, 34), '9')), 1)) + 1)
    || repeat('0', length(substr(total, 1, 34)) - length(rtrim(substr(total, 1, 34), '9'))) END) ELSE substr(total, 1, 34) END) || repeat('0', length(total) - 34) END) AS t FROM bs_applied WHERE kind = 'roll'
), q AS (
  SELECT pos, p, CASE WHEN p = '0' OR t = '0' THEN NULL ELSE nuthatch_mul_div(p, '1' || repeat('0', 140), t) END AS q FROM n
), s AS (
  SELECT pos, p, q, (CASE WHEN length(q) > 100 AND substr(q, 101, 1) >= '5'
  THEN (CASE WHEN rtrim(substr(q, 1, 100), '9') = '' THEN '1' || repeat('0', length(substr(q, 1, 100)))
  ELSE substr(rtrim(substr(q, 1, 100), '9'), 1, length(rtrim(substr(q, 1, 100), '9')) - 1)
    || chr(ascii(substr(rtrim(substr(q, 1, 100), '9'), length(rtrim(substr(q, 1, 100), '9')), 1)) + 1)
    || repeat('0', length(substr(q, 1, 100)) - length(rtrim(substr(q, 1, 100), '9'))) END) ELSE substr(q, 1, 100) END) AS s100 FROM q
), m AS (
  SELECT pos, p, q, s100, (CASE WHEN length(s100) > 34 AND substr(s100, 35, 1) >= '5'
  THEN (CASE WHEN rtrim(substr(s100, 1, 34), '9') = '' THEN '1' || repeat('0', length(substr(s100, 1, 34)))
  ELSE substr(rtrim(substr(s100, 1, 34), '9'), 1, length(rtrim(substr(s100, 1, 34), '9')) - 1)
    || chr(ascii(substr(rtrim(substr(s100, 1, 34), '9'), length(rtrim(substr(s100, 1, 34), '9')), 1)) + 1)
    || repeat('0', length(substr(s100, 1, 34)) - length(rtrim(substr(s100, 1, 34), '9'))) END) ELSE substr(s100, 1, 34) END) AS m34 FROM s
), e AS (
  SELECT pos, p, rtrim(m34, '0') AS mant,
         CAST(length(q) - 140 + (length(s100) - least(length(q), 100)) + (length(m34) - least(length(s100), 34)) AS BIGINT) AS ex
  FROM m
)
SELECT pos, CASE
  WHEN p = '0' THEN '0'
  WHEN mant IS NULL THEN NULL
  WHEN ex >= length(mant) THEN mant || repeat('0', CAST(ex - length(mant) AS INT))
  WHEN ex > 0 THEN substr(mant, 1, CAST(ex AS INT)) || '.' || substr(mant, CAST(ex + 1 AS INT))
  ELSE '0.' || repeat('0', CAST(-ex AS INT)) || mant
END AS multiplier
FROM e;
bs_freebetviews/15-bs-freebet.sql
views/15-bs-freebet.sql
-- handleFreebetPlacedV1: the latest PlaceFreeBet for a bet that exists marks it a freebet.
CREATE VIEW bs_freebet AS
WITH hit AS (
  SELECT CAST(f."betId" AS VARCHAR) AS id, p.pos AS placement_pos, CAST(f."freeBetId" AS VARCHAR) AS freebet_id,
         CAST(f.block_number AS BIGINT) * 1000000 + CAST(f.log_index AS BIGINT) AS pos, row_number() OVER (PARTITION BY CAST(f.block_number AS BIGINT) * 1000000 + CAST(f.log_index AS BIGINT) ORDER BY p.pos DESC) AS rn
  FROM "freebet_v1__place_free_bet" f
  JOIN bs_placed p ON p.id = CAST(f."betId" AS VARCHAR) AND p.pos < CAST(f.block_number AS BIGINT) * 1000000 + CAST(f.log_index AS BIGINT)
)
SELECT id, placement_pos, freebet_id FROM (
  SELECT h.*, row_number() OVER (PARTITION BY h.placement_pos ORDER BY h.pos DESC) AS rn2 FROM hit h WHERE h.rn = 1
) x WHERE rn2 = 1;
bs_betviews/16-bs-bet.sql
views/16-bs-bet.sql
-- One row per Bet entity: the latest placement of each id, with houseEdge as _createBet read it. A
-- resolution reaches that placement exactly when it comes after it, so bs_applied needs no window here.
CREATE VIEW bs_bet AS
WITH lp AS (
  SELECT id, max(pos) AS pos FROM bs_placed GROUP BY id
), l AS (
  SELECT p.* FROM bs_placed p JOIN lp ON lp.pos = p.pos
), ge AS (
  SELECT l.pos, max(e.pos) AS edge_pos
  FROM l JOIN bs_house_edge e ON e.game_id = l.game_id AND e.token = l.token AND e.pos < l.pos GROUP BY l.pos
), ae AS (
  SELECT l.pos, max(e.pos) AS edge_pos
  FROM l JOIN bs_affiliate_house_edge e ON e.affiliate = l.affiliate AND e.game_id = l.game_id AND e.token = l.token AND e.pos < l.pos
  GROUP BY l.pos
), res AS (
  SELECT a.id, max(a.pos) AS last_pos, max(CASE WHEN a.kind = 'roll' THEN a.pos END) AS roll_pos,
         max(CASE WHEN a.amount <> '0' THEN a.pos END) AS amount_pos, bool_or(a.kind = 'refund') AS refunded
  FROM bs_applied a JOIN lp ON lp.id = a.id AND lp.pos = a.placement_pos GROUP BY a.id
)
SELECT l.id, l.game_id AS "gameId", l.game_address AS "gameAddress", l.bettor AS "user",
       l.game_id || '-' || l.token AS "gameToken", l.affiliate, l.input_value AS "inputValue",
       COALESCE(amt.amount, l.amount) AS "betAmount", l.bet_count AS "betCount", l.stop_loss AS "stopLoss",
       l.stop_gain AS "stopGain",
       CAST(CASE WHEN a.house_edge > 0 THEN a.house_edge WHEN g.house_edge > 0 THEN g.house_edge ELSE 0 END AS INTEGER) AS "houseEdge",
       l.ts AS "betTimestamp", res.id IS NOT NULL AS resolved, COALESCE(res.refunded, false) AS refunded,
       l.charged_vrf_fees AS "chargedVRFFees", l.tx_hash AS "betTxnHash", fb.id IS NOT NULL AS "isFreebet",
       fb.freebet_id AS "freebetId", last.total AS "totalBetAmount", last.payout,
       CASE WHEN last.kind = 'refund' THEN '1' ELSE pm.multiplier END AS "payoutMultiplier",
       last.tx_hash AS "rollTxnHash", roll.rolled, last.ts AS "rollTimestamp", l.pos AS bs_pos
FROM l
LEFT JOIN ge ON ge.pos = l.pos
LEFT JOIN bs_house_edge g ON g.game_id = l.game_id AND g.token = l.token AND g.pos = ge.edge_pos
LEFT JOIN ae ON ae.pos = l.pos
LEFT JOIN bs_affiliate_house_edge a ON a.affiliate = l.affiliate AND a.game_id = l.game_id AND a.token = l.token AND a.pos = ae.edge_pos
LEFT JOIN res ON res.id = l.id
LEFT JOIN bs_applied last ON last.pos = res.last_pos
LEFT JOIN bs_payout_multiplier pm ON pm.pos = res.last_pos
LEFT JOIN bs_applied roll ON roll.pos = res.roll_pos
LEFT JOIN bs_applied amt ON amt.pos = res.amount_pos
LEFT JOIN bs_freebet fb ON fb.id = l.id AND fb.placement_pos = l.pos;
betviews/20-bet.sql
views/20-bet.sql
-- The Bet entity. Columns are the schema's field names; Bet.consumedNativeVRFFees,
-- consumedLinkVRFFees and kenoBet have no column and are refused by name.
CREATE VIEW bet AS
SELECT id, "gameId", "gameAddress", "user", "gameToken", affiliate, "inputValue", "betAmount", "betCount",
       "stopLoss", "stopGain", "houseEdge", "betTimestamp", resolved, refunded, "chargedVRFFees", "betTxnHash",
       "isFreebet", "freebetId", "totalBetAmount", payout, "payoutMultiplier", "rollTxnHash", rolled, "rollTimestamp"
FROM bs_bet;
userviews/21-user.sql
views/21-user.sql
-- User: every bettor has one (getUser in _createBet). Only id is reproduced.
CREATE VIEW "user" AS SELECT DISTINCT bettor AS id FROM bs_placed;
affiliateviews/22-affiliate.sql
views/22-affiliate.sql
-- Affiliate: getAffiliate creates one for any non-zero affiliate it sees. Only id is reproduced.
CREATE VIEW affiliate AS
SELECT DISTINCT id FROM (
  SELECT affiliate AS id FROM bs_placed
  UNION ALL SELECT affiliate FROM bs_affiliate_house_edge
) WHERE id <> '0x0000000000000000000000000000000000000000';
game_tokenviews/23-game-token.sql
views/23-game-token.sql
-- GameToken, keyed "<gameId>-<token>" as getGameToken keys it. Counters are refused.
CREATE VIEW game_token AS
WITH k AS (
  SELECT game_id, token FROM bs_placed UNION SELECT game_id, token FROM bs_house_edge
), last AS (
  SELECT game_id, token, house_edge, row_number() OVER (PARTITION BY game_id, token ORDER BY pos DESC) AS rn
  FROM bs_house_edge
)
SELECT k.game_id || '-' || k.token AS id, k.token, k.game_id AS game, CAST(COALESCE(l.house_edge, 0) AS INTEGER) AS "houseEdge"
FROM k LEFT JOIN last l ON l.game_id = k.game_id AND l.token = k.token AND l.rn = 1;
weighted_game_bet, weighted_game_configviews/24-weighted.sql
views/24-weighted.sql
-- WeightedGameBet (id = bet id) and WeightedGameConfig (id = configId).
CREATE VIEW weighted_game_bet AS
SELECT DISTINCT id, id AS bet, CAST(config_id AS VARCHAR) AS config FROM bs_placed WHERE config_id IS NOT NULL;

CREATE VIEW weighted_game_config AS
SELECT id, multipliers, weights, "weightedGameId", "gameId", "creationTimestamp" FROM (
  SELECT CAST(config_id AS VARCHAR) AS id,
         string_to_array(replace(trim(multipliers, '[]'), '"', ''), ',') AS multipliers,
         string_to_array(replace(trim(weights, '[]'), '"', ''), ',') AS weights,
         weighted_game_id AS "weightedGameId", game_id AS "gameId", ts AS "creationTimestamp",
         row_number() OVER (PARTITION BY config_id ORDER BY pos DESC) AS rn
  FROM bs_config
) WHERE rn = 1;
bs_token_added, bs_token_metadataviews/25-token.sql
views/25-token.sql
-- Token creation (getToken in each AddToken handler; V4 only when added) and the metadata the
-- handler copied from Bank.getTokens() at that block.
CREATE VIEW bs_token_added AS
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, a.block_number, 'bank_v1' AS bank FROM "bank_v1__add_token" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, a.block_number, 'bank_v2' AS bank FROM "bank_v2__add_token" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, a.block_number, 'bank_v3' AS bank FROM "bank_v3__add_token" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, a.block_number, 'bank_v3_5' AS bank FROM "bank_v3_5__add_token" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, a.block_number, 'bank_v4' AS bank FROM "bank_v4__add_token" a WHERE a.added = 'true';

CREATE VIEW bs_token_metadata AS
WITH calls AS (
  SELECT 'bank_v1' AS bank, block_number, result FROM "bank_v1_get_tokens" WHERE NOT CAST(reverted AS BOOLEAN)
  UNION ALL
  SELECT 'bank_v2' AS bank, block_number, result FROM "bank_v2_get_tokens" WHERE NOT CAST(reverted AS BOOLEAN)
  UNION ALL
  SELECT 'bank_v3' AS bank, block_number, result FROM "bank_v3_get_tokens" WHERE NOT CAST(reverted AS BOOLEAN)
  UNION ALL
  SELECT 'bank_v3_5' AS bank, block_number, result FROM "bank_v3_5_get_tokens" WHERE NOT CAST(reverted AS BOOLEAN)
  UNION ALL
  SELECT 'bank_v4' AS bank, block_number, result FROM "bank_v4_get_tokens" WHERE NOT CAST(reverted AS BOOLEAN)
), arr AS (
  SELECT a.token, a.pos, c.result, TRY_CAST(nuthatch_uint256('0x' || substr(c.result, 67, 64)) AS BIGINT) AS n
  FROM bs_token_added a JOIN calls c ON c.bank = a.bank AND c.block_number = a.block_number
  -- TRY_CAST: the engine may evaluate this before k.i < arr.n removes the row, and past the array
  -- the word is string data ("ETH" read as an offset), which does not fit a BIGINT.
), el AS (
  SELECT arr.token, arr.pos,
         substr(arr.result, 3 + 2 * (64 + TRY_CAST(nuthatch_uint256('0x' || substr(arr.result, 3 + 64 * (2 + k.i), 64)) AS BIGINT))) AS e
  FROM arr CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31)) AS k(i) WHERE k.i < arr.n
), dec AS (
  SELECT token, pos, e, '0x' || substr(e, 89, 40) AS addr,
         nuthatch_abi_tuple('uint256,address,string', '0x' || e) AS j3,
         nuthatch_abi_tuple('uint256,address,string,string', '0x' || e) AS j4
  FROM el
), parsed AS (
  SELECT token, pos, j3, j4,
         '["' || CAST(CAST(nuthatch_uint256('0x' || substr(e, 1, 64)) AS INTEGER) AS VARCHAR) || '","' || addr || '","' AS head
  FROM dec WHERE addr = token
), named AS (
  SELECT token, pos, head,
         substr(j3, length(head) + 1, length(j3) - length(head) - 2) AS name_json, j4
  FROM parsed
)
SELECT token, pos,
       CAST(substr(head, 3, strpos(head, '","') - 3) AS INTEGER) AS decimals,
       name_json AS name,
       substr(j4, length(head) + length(name_json) + 4, length(j4) - length(head) - length(name_json) - 5) AS symbol
FROM named;
bs_allocation, tokenviews/26-token-entity.sql
views/26-token-entity.sql
-- The Token entity. Counters follow _updateResolveAnalytics (one per roll or refund that reached a
-- bet); the splits follow the bank's AllocateHouseEdgeAmount handlers, which skip a token that does
-- not exist yet. balancesDayDataLength has no column and is refused by name.
CREATE VIEW bs_allocation AS
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, CAST(a.dividend AS DECIMAL(38,0)) AS "dividendAmount", CAST(0 AS DECIMAL(38,0)) AS "bankAmount", CAST(0 AS DECIMAL(38,0)) AS "partnerAmount", CAST(0 AS DECIMAL(38,0)) AS "affiliateAmount", CAST(a.treasury AS DECIMAL(38,0)) AS "treasuryAmount", CAST(a.team AS DECIMAL(38,0)) AS "teamAmount"
FROM "bank_v1__allocate_house_edge_amount" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, CAST(a.dividend AS DECIMAL(38,0)) AS "dividendAmount", CAST(0 AS DECIMAL(38,0)) AS "bankAmount", CAST(a.partner AS DECIMAL(38,0)) AS "partnerAmount", CAST(0 AS DECIMAL(38,0)) AS "affiliateAmount", CAST(a.treasury AS DECIMAL(38,0)) AS "treasuryAmount", CAST(a.team AS DECIMAL(38,0)) AS "teamAmount"
FROM "bank_v2__allocate_house_edge_amount" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, CAST(a.dividend AS DECIMAL(38,0)) AS "dividendAmount", CAST(a.bank AS DECIMAL(38,0)) AS "bankAmount", CAST(a.partner AS DECIMAL(38,0)) AS "partnerAmount", CAST(0 AS DECIMAL(38,0)) AS "affiliateAmount", CAST(a.treasury AS DECIMAL(38,0)) AS "treasuryAmount", CAST(a.team AS DECIMAL(38,0)) AS "teamAmount"
FROM "bank_v3__allocate_house_edge_amount" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, CAST(a.dividend AS DECIMAL(38,0)) AS "dividendAmount", CAST(a.bank AS DECIMAL(38,0)) AS "bankAmount", CAST(a.partner AS DECIMAL(38,0)) AS "partnerAmount", CAST(0 AS DECIMAL(38,0)) AS "affiliateAmount", CAST(a.treasury AS DECIMAL(38,0)) AS "treasuryAmount", CAST(a.team AS DECIMAL(38,0)) AS "teamAmount"
FROM "bank_v3_5__allocate_house_edge_amount" a
UNION ALL
SELECT a.token, CAST(a.block_number AS BIGINT) * 1000000 + CAST(a.log_index AS BIGINT) AS pos, CAST(a.dividend AS DECIMAL(38,0)) AS "dividendAmount", CAST(a.bank AS DECIMAL(38,0)) AS "bankAmount", CAST(0 AS DECIMAL(38,0)) AS "partnerAmount", CAST(a.affiliate AS DECIMAL(38,0)) AS "affiliateAmount", CAST(a.treasury AS DECIMAL(38,0)) AS "treasuryAmount", CAST(a.team AS DECIMAL(38,0)) AS "teamAmount"
FROM "bank_v4__allocate_house_edge_amount" a;

CREATE VIEW token AS
WITH created AS (
  SELECT token, min(pos) AS pos FROM bs_token_added GROUP BY token
), meta AS (
  SELECT token, name, symbol, decimals FROM (
    SELECT m.*, row_number() OVER (PARTITION BY m.token ORDER BY m.pos DESC) AS rn FROM bs_token_metadata m
  ) WHERE rn = 1
), counters AS (
  SELECT CASE WHEN kind = 'roll' THEN r_token ELSE p_token END AS token,
         count(*) AS bet_txn_count, sum(CAST(bet_count AS DECIMAL(38,0))) AS bet_count,
         sum(CASE WHEN CAST(payout AS DECIMAL(38,0)) > CAST(total AS DECIMAL(38,0)) THEN 1 ELSE 0 END) AS win_txn_count,
         count(DISTINCT CASE WHEN kind = 'roll' THEN r_user ELSE bettor END) AS user_count,
         sum(CAST(total AS DECIMAL(38,0))) AS wagered, sum(CAST(payout AS DECIMAL(38,0))) AS paid
  FROM bs_applied GROUP BY 1
), alloc AS (
  SELECT a.token, sum(a."dividendAmount") AS "dividendAmount", sum(a."bankAmount") AS "bankAmount", sum(a."partnerAmount") AS "partnerAmount", sum(a."affiliateAmount") AS "affiliateAmount", sum(a."treasuryAmount") AS "treasuryAmount", sum(a."teamAmount") AS "teamAmount"
  FROM bs_allocation a JOIN created c ON c.token = a.token AND a.pos > c.pos GROUP BY a.token
)
SELECT c.token AS id, COALESCE(m.name, '') AS name, COALESCE(m.symbol, '') AS symbol,
       CAST(COALESCE(m.decimals, 0) AS INTEGER) AS decimals,
       CAST(COALESCE(n.bet_txn_count, 0) AS VARCHAR) AS "betTxnCount",
       CAST(COALESCE(n.bet_count, 0) AS VARCHAR) AS "betCount",
       CAST(COALESCE(n.win_txn_count, 0) AS VARCHAR) AS "winTxnCount",
       CAST(COALESCE(n.user_count, 0) AS VARCHAR) AS "userCount",
       CAST(COALESCE(n.wagered, 0) AS VARCHAR) AS "totalWagered",
       CAST(COALESCE(n.paid, 0) AS VARCHAR) AS "totalPayout",
       CAST(COALESCE(a."dividendAmount", 0) AS VARCHAR) AS "dividendAmount",
       CAST(COALESCE(a."bankAmount", 0) AS VARCHAR) AS "bankAmount",
       CAST(COALESCE(a."partnerAmount", 0) AS VARCHAR) AS "partnerAmount",
       CAST(COALESCE(a."affiliateAmount", 0) AS VARCHAR) AS "affiliateAmount",
       CAST(COALESCE(a."treasuryAmount", 0) AS VARCHAR) AS "treasuryAmount",
       CAST(COALESCE(a."teamAmount", 0) AS VARCHAR) AS "teamAmount"
FROM created c
LEFT JOIN meta m ON m.token = c.token
LEFT JOIN counters n ON n.token = c.token
LEFT JOIN alloc a ON a.token = c.token;

Tables on the mirror

tablerowssegmentsfrom blockto block
dice_v3__place_bet 55,581 34 18,648,543 21,152,983
dice_v3__roll 55,364 34 18,648,543 21,152,983
bank_v2__allocate_house_edge_amount 54,330 32 18,371,391 21,152,983
dice_v2__place_bet 22,831 6 18,371,391 18,696,542
dice_v2__roll 22,739 6 18,371,391 18,696,542
coin_toss_v3__place_bet 14,540 12 18,648,543 21,104,535
coin_toss_v4_5__place_bet 14,528 11 23,088,012 39,436,592
coin_toss_v4_5__roll 14,519 11 23,088,012 39,590,047
coin_toss_v3__roll 14,471 12 18,648,543 21,104,535
bank_v3_5__allocate_house_edge_amount 12,870 12 23,088,012 39,436,592
roulette_v1__place_bet 11,616 9 19,898,178 21,152,983
roulette_v1__roll 11,542 9 19,898,178 21,152,983
bank_v3__allocate_house_edge_amount 7,862 7 21,153,037 25,350,197
dice_v4__place_bet 7,545 7 21,153,037 25,501,916
dice_v4__roll 7,501 7 21,153,037 25,501,916
dice_v4_5__place_bet 7,292 7 23,088,012 43,362,806
dice_v4_5__roll 7,252 7 23,088,012 43,362,806
roulette_v2__place_bet 6,463 6 21,153,037 25,253,063
roulette_v2__roll 6,439 6 21,153,037 25,253,063
roulette_v2_5__roll 4,231 4 23,088,012 36,416,226
roulette_v2_5__place_bet 4,215 4 23,088,012 36,297,124
coin_toss_v2__place_bet 3,287 2 18,371,391 18,607,630
coin_toss_v2__roll 3,278 2 18,371,391 18,607,630
bank_v4__allocate_house_edge_amount 2,037 2 43,701,712 74,528,151
coin_toss_v4__place_bet 2,023 2 21,251,336 24,902,219
coin_toss_v4__roll 2,017 2 21,251,336 24,902,219
dice_v1__place_bet 1,041 1 16,690,152 18,303,074
dice_v1__roll 1,041 1 16,690,152 18,303,074
dice_v5__place_bet 1,006 1 43,701,712 65,070,747
dice_v5__roll 1,006 1 43,701,712 65,070,747
roulette_v3__place_bet 1,002 1 43,701,712 64,449,085
roulette_v3__roll 1,002 1 43,701,712 64,449,085
keno_v1_5__place_bet 1,001 1 35,309,208 37,746,413
bank_v1__add_token 0 0
bank_v1__allocate_house_edge_amount 0 0
bank_v1_get_tokens 0 0
bank_v2__add_token 0 0
bank_v2_get_tokens 0 0
bank_v3__add_token 0 0
bank_v3_5__add_token 0 0
bank_v3_5_get_tokens 0 0
bank_v3_get_tokens 0 0
bank_v4__add_token 0 0
bank_v4_get_tokens 0 0
coin_toss_v1__place_bet 0 0
coin_toss_v1__roll 0 0
coin_toss_v1__set_house_edge 0 0
coin_toss_v2__bet_refunded 0 0
coin_toss_v2__set_house_edge 0 0
coin_toss_v3__bet_refunded 0 0
coin_toss_v3__set_house_edge 0 0
coin_toss_v4__bet_refunded 0 0
coin_toss_v4__set_house_edge 0 0
coin_toss_v4_5__bet_refunded 0 0
coin_toss_v4_5__set_house_edge 0 0
coin_toss_v5__place_bet 0 0
coin_toss_v5__roll 0 0
coin_toss_v5__set_house_edge 0 0
dice_v1__set_house_edge 0 0
dice_v2__bet_refunded 0 0
dice_v2__set_house_edge 0 0
dice_v3__bet_refunded 0 0
dice_v3__set_house_edge 0 0
dice_v4__bet_refunded 0 0
dice_v4__set_house_edge 0 0
dice_v4_5__bet_refunded 0 0
dice_v4_5__set_house_edge 0 0
dice_v5__set_house_edge 0 0
freebet_v1__place_free_bet 0 0
keno_v1__place_bet 0 0
keno_v1__roll 0 0
keno_v1__set_house_edge 0 0
keno_v1_5__bet_refunded 0 0
keno_v1_5__roll 0 0
keno_v1_5__set_house_edge 0 0
keno_v2__place_bet 0 0
keno_v2__roll 0 0
keno_v2__set_house_edge 0 0
roulette_v1__bet_refunded 0 0
roulette_v1__set_house_edge 0 0
roulette_v2__bet_refunded 0 0
roulette_v2__set_house_edge 0 0
roulette_v2_5__bet_refunded 0 0
roulette_v2_5__set_house_edge 0 0
roulette_v3__set_house_edge 0 0
weighted_game_v1__game_config_added 0 0
weighted_game_v1__place_bet 0 0
weighted_game_v1__roll 0 0
weighted_game_v1__set_house_edge 0 0