Nests · port of a subgraph
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.
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.
Authored views
The nest’s own SQL over its event tables, as published. Open one to read it.
bs_placementviews/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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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
| table | rows | segments | from block | to 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 |