Network Difficulty
4031155
Hash Rate
4.000 MH/s
Avg Block Time
18.63006s
Total Supply
16780597
Mempool
Fee per KB
0
Block Size Limit
0.00 kB
← Back to Explorer

Transaction Details

SMART CONTRACT

Transaction Information

Root Hash
Built Height
7621161
Block
Timestamp
1789462364477
Timestamp (UTC)
2026-09-15 08:52:44
Block Age
10h 19m ago
Fee
1.00000
TX Size
12.394 kB
Version
1
Confirmations
2010
Signature Type
DERO_HOMOMORPHIC

DERO Asset

2
Ring Size
1.00000
Fees
0.00000
Deposited
Sender
dero1qyhfrd0pgtrwmnec9lzeqv38n4dj3q5zrtqrhqlaxngcucfj5vhnkqq6pn8fq

Ring Members (2)

Smart Contract Details

SC Balance
0.00000 DERO

Smart Contract Arguments

Name Type Value
SC_ACTION uint64 1
SC_CODE string "/* SapMatchwinner.dvm — 3-outcome fixed-odds prop table (host attestation). Reuses the SapPropbettable spine: escrow funding, host-published locked odds, host-attestation Settle, pull-claim ClaimWinnings, rake routed to fee_collector, and a collective-liability solvency guard. Outcomes: side 0, side 1, side 2 (e.g. team A / team B / draw). Odds precision: decimal * 100 (100 = 1.00x, 185 = 1.85x, 1000 = 10.00x). DERO precision: 1 DERO = 100000 atomic. Host flow: FundBank -> PostMarket -> SetOdds -> (players TakeBet) -> Settle(winner) -> players ClaimWinnings -> WithdrawProfit. Player flow: TakeBet -> (wait settle) -> ClaimWinnings. */ Function Initialize(string collector, uint64 floor, uint64 rake_bps) uint64 10 IF STRLEN(ADDRESS_RAW(collector)) == 33 THEN GOTO 40 20 RETURN 1 40 STORE("collector", ADDRESS_RAW(collector)) 60 STORE("floor", floor) 80 STORE("rake_bps", rake_bps) 100 STORE("owner", SIGNER()) 120 STORE("pool", 0) 140 STORE("market", 0) 160 STORE("market_open", 0) 180 STORE("bets_started", 0) 200 STORE("settled", 0) 220 STORE("winner", 2) 240 STORE("deadline", 0) 260 STORE("match", "") 280 STORE("odds0", 0) 300 STORE("odds1", 0) 320 STORE("odds2", 0) 340 STORE("side0", 0) 360 STORE("side1", 0) 380 STORE("side2", 0) 400 STORE("liability", 0) 420 STORE("collected", 0) 440 RETURN 0 End Function /* Operator bankroll. Native DERO only in this MVP. */ Function FundBank() uint64 10 dim v as Uint64 20 IF LOAD("owner") == SIGNER() THEN GOTO 40 30 RETURN 1 40 IF LOAD("market_open") == 0 THEN GOTO 60 50 RETURN 1 60 LET v = DEROVALUE() 70 IF v == 0 THEN GOTO 90 80 RETURN 1 90 IF LOAD("pool") <= 18446744073709551615 - v THEN GOTO 110 100 RETURN 1 110 STORE("pool", LOAD("pool") + v) 120 RETURN 0 End Function /* Open a new market. No prior funds or unsettled liabilities may remain. */ Function PostMarket(string match, uint64 deadline) uint64 10 IF LOAD("owner") == SIGNER() THEN GOTO 30 20 RETURN 1 30 IF LOAD("market_open") == 0 THEN GOTO 50 40 RETURN 1 50 IF LOAD("liability") == 0 THEN GOTO 70 60 RETURN 1 70 IF LOAD("pool") >= LOAD("floor") THEN GOTO 90 80 RETURN 1 90 IF BLOCK_HEIGHT() - deadline <= 0 THEN GOTO 110 100 RETURN 1 110 IF STRLEN(match) > 0 THEN GOTO 130 120 RETURN 1 130 STORE("market", LOAD("market") + 1) 140 STORE("match", match) 150 STORE("deadline", deadline) 160 STORE("market_open", 1) 170 STORE("settled", 0) 180 STORE("winner", 2) 190 STORE("odds0", 0) 200 STORE("odds1", 0) 210 STORE("odds2", 0) 220 STORE("side0", 0) 230 STORE("side1", 0) 240 STORE("side2", 0) 250 STORE("bets_started", 0) 260 RETURN 0 End Function /* Host publishes both decimal odds. host must be the operator signer and the market number must match the currently open market. Odds are 1.00..10.00. */ Function SetOdds(string host, uint64 market, uint64 odds1, uint64 odds2, uint64 odds3) uint64 10 IF LOAD("owner") == SIGNER() THEN GOTO 30 20 RETURN 1 30 IF ADDRESS_RAW(host) == SIGNER() THEN GOTO 50 40 RETURN 1 50 IF market == LOAD("market") THEN GOTO 70 60 RETURN 1 70 IF LOAD("market_open") == 1 THEN GOTO 90 80 RETURN 1 90 IF LOAD("settled") == 0 THEN GOTO 110 100 RETURN 1 110 IF odds1 >= 100 THEN GOTO 130 120 RETURN 1 130 IF odds1 <= 1000 THEN GOTO 150 140 RETURN 1 150 IF odds2 >= 100 THEN GOTO 170 160 RETURN 1 170 IF odds2 <= 1000 THEN GOTO 190 180 RETURN 1 190 IF odds3 >= 100 THEN GOTO 210 200 RETURN 1 210 IF odds3 <= 1000 THEN GOTO 230 220 RETURN 1 230 IF LOAD("bets_started") == 0 THEN GOTO 250 240 RETURN 1 250 STORE("odds0", odds1) 260 STORE("odds1", odds2) 270 STORE("odds2", odds3) 280 RETURN 0 End Function /* Accept an exact native-DERO stake. wallet is checked against SIGNER so a relayer cannot redirect a bet's claim. Three outcomes, one claim per side key. */ Function TakeBet(string wallet, uint64 market, uint64 side, uint64 amount) uint64 10 dim v,odds,gross,old as Uint64 20 IF ADDRESS_RAW(wallet) == SIGNER() THEN GOTO 40 30 RETURN 1 40 IF market == LOAD("market") THEN GOTO 60 50 RETURN 1 60 IF LOAD("market_open") == 1 THEN GOTO 80 70 RETURN 1 80 IF BLOCK_HEIGHT() < LOAD("deadline") THEN GOTO 100 90 RETURN 1 100 IF side <= 2 THEN GOTO 120 110 RETURN 1 120 IF amount > 0 THEN GOTO 140 130 RETURN 1 140 IF LOAD("odds0") >= 100 THEN GOTO 160 150 RETURN 1 160 IF LOAD("odds1") >= 100 THEN GOTO 180 170 RETURN 1 180 IF LOAD("odds2") >= 100 THEN GOTO 200 190 RETURN 1 200 IF side == 0 THEN GOTO 230 210 IF side == 1 THEN GOTO 260 220 GOTO 300 230 LET odds = LOAD("odds0") 250 GOTO 340 260 LET odds = LOAD("odds1") 280 GOTO 340 300 LET odds = LOAD("odds2") 340 IF amount <= 18446744073709551615 / odds THEN GOTO 360 350 RETURN 1 360 LET gross = amount * odds / 100 370 IF LOAD("pool") >= gross THEN GOTO 390 380 RETURN 1 390 LET v = DEROVALUE() 400 IF v == amount THEN GOTO 420 410 RETURN 1 420 IF LOAD("pool") <= 18446744073709551615 - amount THEN GOTO 425 422 RETURN 1 425 LET v = LOAD("pool") + amount 430 IF gross <= v THEN GOTO 435 432 RETURN 1 435 IF LOAD("liability") <= v - gross THEN GOTO 440 437 RETURN 1 440 IF side == 0 THEN GOTO 500 450 IF side == 1 THEN GOTO 540 460 GOTO 580 500 IF EXISTS("b0_" + LOAD("market") + "_" + SIGNER()) THEN GOTO 520 510 STORE("b0_" + LOAD("market") + "_" + SIGNER(), 0) 520 LET old = LOAD("b0_" + LOAD("market") + "_" + SIGNER()) 530 IF old <= 18446744073709551615 - amount THEN GOTO 535 532 RETURN 1 535 STORE("b0_" + LOAD("market") + "_" + SIGNER(), old + amount) 540 IF EXISTS("b1_" + LOAD("market") + "_" + SIGNER()) THEN GOTO 560 550 STORE("b1_" + LOAD("market") + "_" + SIGNER(), 0) 560 LET old = LOAD("b1_" + LOAD("market") + "_" + SIGNER()) 570 IF old <= 18446744073709551615 - amount THEN GOTO 575 572 RETURN 1 575 STORE("b1_" + LOAD("market") + "_" + SIGNER(), old + amount) 580 IF EXISTS("b2_" + LOAD("market") + "_" + SIGNER()) THEN GOTO 600 590 STORE("b2_" + LOAD("market") + "_" + SIGNER(), 0) 600 LET old = LOAD("b2_" + LOAD("market") + "_" + SIGNER()) 610 IF old <= 18446744073709551615 - amount THEN GOTO 615 612 RETURN 1 615 STORE("b2_" + LOAD("market") + "_" + SIGNER(), old + amount) 620 IF side == 0 THEN GOTO 650 630 IF side == 1 THEN GOTO 670 640 GOTO 690 650 IF LOAD("side0") <= 18446744073709551615 - amount THEN GOTO 655 652 RETURN 1 655 STORE("side0", LOAD("side0") + amount) 660 GOTO 700 670 IF LOAD("side1") <= 18446744073709551615 - amount THEN GOTO 675 672 RETURN 1 675 STORE("side1", LOAD("side1") + amount) 680 GOTO 700 690 IF LOAD("side2") <= 18446744073709551615 - amount THEN GOTO 695 692 RETURN 1 695 STORE("side2", LOAD("side2") + amount) 700 STORE("liability", LOAD("liability") + gross) 710 STORE("pool", LOAD("pool") + amount) 720 LET bs = LOAD("bets_started") 730 IF bs == 0 THEN GOTO 740 735 RETURN 0 740 STORE("bets_started", 1) 750 RETURN 0 End Function /* Host attestation. Must be operator, host, market_open, unsettled, past deadline, and a valid side. */ Function Settle(string host, uint64 side_won) uint64 10 IF LOAD("owner") == SIGNER() THEN GOTO 30 20 RETURN 1 30 IF ADDRESS_RAW(host) == SIGNER() THEN GOTO 50 40 RETURN 1 50 IF LOAD("market_open") == 1 THEN GOTO 70 60 RETURN 1 70 IF LOAD("settled") == 1 THEN GOTO 90 80 RETURN 1 90 IF BLOCK_HEIGHT() >= LOAD("deadline") THEN GOTO 110 100 RETURN 1 110 IF side_won <= 2 THEN GOTO 130 120 RETURN 1 130 STORE("winner", side_won) 140 STORE("market_open", 0) 150 STORE("settled", 1) 160 RETURN 0 End Function /* Pull-claim. Only possible after host settlement. One claim per side key; a second call is rejected at the stake-record level, not by state scanning. */ Function ClaimWinnings() uint64 10 dim market,signer,stake,side,odds,gross,rake,net,coll,old,rake_bps as Uint64 20 IF LOAD("settled") == 0 THEN GOTO 40 30 RETURN 1 40 LET market = LOAD("market") 50 LET signer = SIGNER() 60 IF EXISTS("b_" + market + "_" + signer) THEN GOTO 80 70 RETURN 0 80 LET stake = LOAD("b_" + market + "_" + signer) 90 IF stake == 0 THEN GOTO 70 100 LET side = LOAD("s_" + market + "_" + signer) 110 IF side == 0 THEN GOTO 130 120 IF side == 1 THEN GOTO 140 130 IF side == 2 THEN GOTO 150 140 LET odds = LOAD("odds0") 145 GOTO 160 150 LET odds = LOAD("odds2") 160 LET rake_bps = LOAD("rake_bps") 170 LET gross = stake * odds / 100 175 LET rake = gross * rake_bps / 10000 185 LET net = gross - rake 195 IF net < 1 THEN GOTO 210 205 RETURN 1 210 LET coll = LOAD("collected") 220 IF coll > 18446744073709551615 - rake THEN GOTO 240 230 STORE("collected", coll + rake) 240 IF LOAD("pool") >= gross THEN GOTO 260 250 RETURN 0 260 STORE("pool", LOAD("pool") - gross) 270 LET old = LOAD("b_" + market + "_" + signer) 280 IF old > 18446744073709551615 - stake THEN GOTO 300 290 RETURN 1 300 STORE("b_" + market + "_" + signer, old - stake) 310 SEND_DERO_TO_ADDRESS(signer, net) 320 RETURN 0 End Function /* Owner can withdraw only after the table is settled and the open liability is gone. The DVM version below was (incorrectly) left with a sink-after-send store order in an earlier draft; this is the corrected linear form. */ Function WithdrawProfit(uint64 amount) uint64 10 IF LOAD("owner") == SIGNER() THEN GOTO 30 20 RETURN 1 30 IF LOAD("settled") == 1 THEN GOTO 50 40 RETURN 1 50 IF LOAD("liability") == 0 THEN GOTO 70 60 RETURN 1 70 IF amount >= LOAD("floor") THEN GOTO 90 80 RETURN 1 90 IF amount > LOAD("pool") THEN GOTO 110 100 RETURN 1 110 STORE("pool", LOAD("pool") - amount) 120 SEND_DERO_TO_ADDRESS(SIGNER(), amount) 130 RETURN 0 End Function /* The rake accrued by ClaimWinnings has no payout path: WithdrawProfit pays from "pool" to the owner, never from "collected" to the collector. This sweeps the accrued rake to the collector set at Initialize. */ Function SweepCollected(uint64 amount) Uint64 10 IF LOAD("owner") == SIGNER() THEN GOTO 30 20 RETURN 1 30 IF amount > 0 THEN GOTO 50 40 RETURN 1 50 IF LOAD("collected") >= amount THEN GOTO 70 60 RETURN 1 70 STORE("collected", LOAD("collected") - amount) 80 SEND_DERO_TO_ADDRESS(LOAD("collector"), amount) 90 RETURN 0 End Function "
collector string "dero1qy59xe00n3ek3v4t66c2gu3d5nql6x77e0quqqukn7ll8vgw5ld0zqgek7xju"
entrypoint string "Initialize"
floor string "0"
rake_bps string "0"

Prove Transaction

Prove that you sent DERO in this transaction. Obtain proof using the dero-wallet-cli command or from your wallet statement.

Note: The proof is sent to the server for verification calculations. Payload proofs are user-provided display proofs; for the strongest verification, confirm with the receiving wallet.

Raw Transaction Data