Connect Wallet
Program # treasure_hunt_v010.aleo
Program ID
treasure_hunt_v010.aleo
Deploy Time
2023-12-14 03:49:27
Deploy Fee
22.406
Block Height
Times Called
83,109
  • 1
    
program treasure_hunt_v010.aleo;

record Piece:
    owner as address.private;
    amount as u64.private;
    ix as u32.private;

record AuditMint:
    owner as address.private;
    minter as address.private;
    amount as u64.private;
    ix as u32.private;

record AuditJoin:
    owner as address.private;
    joiner as address.private;
    amount as u64.private;
    ix as u32.private;

record PieceStake:
    owner as address.private;
    amount as u64.private;
    challenger as address.private;
    opponent as address.private;
    staker as address.private;
    ix as u32.private;

record PieceClaim:
    owner as address.private;
    amount as u64.private;
    claimer as address.private;
    message_1 as field.private;
    message_2 as field.private;
    message_3 as field.private;
    message_4 as field.private;
    message_5 as field.private;
    challenger as address.private;
    opponent as address.private;
    ix as u32.private;

record ClaimSignature:
    owner as address.private;
    sig as signature.private;
    amount as u64.private;
    game_multisig as address.private;
    challenger as address.private;
    opponent as address.private;
    ix as u32.private;

record JointPieceTimeClaim:
    owner as address.private;
    amount as u64.private;
    time_claimer_address as address.private;
    state_updater_address as address.private;
    message_1 as field.private;
    message_2 as field.private;
    message_3 as field.private;
    message_4 as field.private;
    message_5 as field.private;
    game_multisig as address.private;
    challenger as address.private;
    opponent as address.private;
    block_ht as u32.private;
    ix as u32.private;

record PieceJointStake:
    owner as address.private;
    amount as u64.private;
    time_claimer_address as address.private;
    state_updater_address as address.private;
    block_ht as u32.private;
    ix as u32.private;

record JointPieceState:
    owner as address.private;
    amount as u64.private;
    time_claimer_address as address.private;
    state_updater_address as address.private;
    message_1 as field.private;
    message_2 as field.private;
    message_3 as field.private;
    message_4 as field.private;
    message_5 as field.private;
    challenger as address.private;
    opponent as address.private;
    game_multisig as address.private;
    ix as u32.private;

record JointPieceWinner:
    owner as address.private;
    amount as u64.private;
    time_claimer_address as address.private;
    state_updater_address as address.private;
    challenger as address.private;
    opponent as address.private;
    game_multisig as address.private;
    winner as address.private;
    ix as u32.private;

record Game:
    owner as address.private;
    challenger_commit as field.private;
    opponent_answer as field.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    game_multisig as address.private;
    game_state as field.private;
    ix as u32.private;

record GameReqNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    ix as u32.private;

record WaitingAcceptanceNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    ix as u32.private;

record StakeRenegedNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    renege_address as address.private;
    ix as u32.private;

record ChallengerWagerNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    ix as u32.private;

record OpponentWagerNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    ix as u32.private;

record WaitingRevealNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    ix as u32.private;

record RevealAnswerNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    opponent_answer as field.private;
    ix as u32.private;

record GameFinishReqNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    challenger_answer as field.private;
    opponent_answer as field.private;
    winner as address.private;
    loser as address.private;
    ix as u32.private;

record GameFinishedNotification:
    owner as address.private;
    game_multisig as address.private;
    game_state as field.private;
    your_turn as boolean.private;
    total_pot as u64.private;
    challenger_address as address.private;
    opponent_address as address.private;
    winner as address.private;
    loser as address.private;
    ix as u32.private;

struct Message:
    field_1 as field;
    field_2 as field;
    field_3 as field;
    field_4 as field;
    field_5 as field;

record Answer:
    owner as address.private;
    challenger_address as address.private;
    opponent_address as address.private;
    game_multisig as address.private;
    amount as u64.private;
    nonce as field.private;
    answer as field.private;
    message_1 as field.private;
    message_2 as field.private;
    message_3 as field.private;
    message_4 as field.private;
    message_5 as field.private;
    ix as u32.private;

record RevealAnswer:
    owner as address.private;
    challenger_address as address.private;
    opponent_address as address.private;
    game_multisig as address.private;
    amount as u64.private;
    nonce as field.private;
    answer as field.private;
    sig as signature.private;
    ix as u32.private;

record Key:
    owner as address.private;
    seed as field.private;
    amount as u64.private;
    challenger as address.private;
    opponent as address.private;
    game_multisig as address.private;
    ix as u32.private;

function mint_pieces:
    input r0 as u64.private;
    input r1 as address.private;
    cast r1 r0 0u32 into r2 as Piece.record;
    cast aleo16hf8hfpwasnn9cf7k2c0dllc56nn7qt547qxgvgwu6pznw4trvqsx68kls r1 r0 1u32 into r3 as AuditMint.record;
    output r2 as Piece.record;
    output r3 as AuditMint.record;

function join_pieces:
    input r0 as Piece.record;
    input r1 as Piece.record;
    assert.eq self.caller self.signer;
    is.eq r0.owner self.signer into r2;
    assert.eq r2 true;
    is.eq r1.owner self.signer into r3;
    assert.eq r3 true;
    gt r0.amount 0u64 into r4;
    assert.eq r4 true;
    gt r1.amount 0u64 into r5;
    assert.eq r5 true;
    add r0.amount r1.amount into r6;
    cast self.signer r6 0u32 into r7 as Piece.record;
    add r0.amount r1.amount into r8;
    cast aleo16hf8hfpwasnn9cf7k2c0dllc56nn7qt547qxgvgwu6pznw4trvqsx68kls self.signer r8 32u32 into r9 as AuditJoin.record;
    output r7 as Piece.record;
    output r9 as AuditJoin.record;

function propose_game:
    input r0 as Piece.record;
    input r1 as u64.private;
    input r2 as address.private;
    input r3 as address.private;
    input r4 as address.private;
    input r5 as address.private;
    input r6 as field.private;
    input r7 as field.private;
    input r8 as field.private;
    input r9 as field.private;
    input r10 as field.private;
    input r11 as signature.private;
    input r12 as field.private;
    input r13 as field.private;
    input r14 as field.private;
    assert.eq self.caller self.signer;
    is.eq r13 0field into r15;
    is.eq r13 1field into r16;
    or r15 r16 into r17;
    assert.eq r17 true;
    cast r12 into r18 as scalar;
    commit.bhp256 r13 r18 into r19 as field;
    gt r1 0u64 into r20;
    assert.eq r20 true;
    gte r0.amount r1 into r21;
    assert.eq r21 true;
    assert.eq r0.owner self.signer;
    cast r5 r1 r2 r6 r7 r8 r9 r10 r3 r4 6u32 into r22 as PieceClaim.record;
    cast r2 r11 r1 r5 r3 r4 7u32 into r23 as ClaimSignature.record;
    cast r5 r1 r3 r4 r3 3u32 into r24 as PieceStake.record;
    sub r0.amount r1 into r25;
    cast r2 r25 0u32 into r26 as Piece.record;
    cast r4 r14 r1 r3 r4 r5 30u32 into r27 as Key.record;
    cast r6 r7 r8 r9 r10 into r28 as Message;
    sign_verify r11 r3 r28 into r29;
    assert.eq true r29;
    cast r3 r3 r4 r5 r1 r12 r13 r6 r7 r8 r9 r10 26u32 into r30 as Answer.record;
    add r1 r1 into r31;
    cast r4 r5 1field true r31 r3 r4 17u32 into r32 as GameReqNotification.record;
    add r1 r1 into r33;
    cast r3 r5 1field false r33 r3 r4 18u32 into r34 as WaitingAcceptanceNotification.record;
    add r1 r1 into r35;
    cast r5 r19 123field r35 r3 r4 r5 1field 16u32 into r36 as Game.record;
    output r22 as PieceClaim.record;
    output r24 as PieceStake.record;
    output r23 as ClaimSignature.record;
    output r26 as Piece.record;
    output r30 as Answer.record;
    output r27 as Key.record;
    output r36 as Game.record;
    output r32 as GameReqNotification.record;
    output r34 as WaitingAcceptanceNotification.record;

function challenger_renege_stake:
    input r0 as WaitingAcceptanceNotification.record;
    input r1 as PieceStake.record;
    input r2 as PieceClaim.record;
    input r3 as signature.private;
    assert.eq self.caller self.signer;
    assert.eq r1.owner r2.owner;
    assert.eq r1.challenger r2.challenger;
    assert.eq r1.opponent r2.opponent;
    assert.eq r1.amount r2.amount;
    cast r2.message_1 r2.message_2 r2.message_3 r2.message_4 r2.message_5 into r4 as Message;
    sign_verify r3 r2.claimer r4 into r5;
    assert.eq true r5;
    cast r2.claimer r2.amount 0u32 into r6 as Piece.record;
    cast r0.challenger_address r0.game_multisig 0field false r0.total_pot r0.challenger_address r0.opponent_address r0.challenger_address 19u32 into r7 as StakeRenegedNotification.record;
    cast r0.opponent_address r0.game_multisig 0field false r0.total_pot r0.challenger_address r0.opponent_address r0.challenger_address 19u32 into r8 as StakeRenegedNotification.record;
    output r6 as Piece.record;
    output r7 as StakeRenegedNotification.record;
    output r8 as StakeRenegedNotification.record;

function submit_wager:
    input r0 as Piece.record;
    input r1 as Key.record;
    input r2 as GameReqNotification.record;
    input r3 as field.private;
    input r4 as field.private;
    input r5 as field.private;
    input r6 as field.private;
    input r7 as field.private;
    input r8 as signature.private;
    assert.eq self.caller self.signer;
    gt r0.amount 0u64 into r9;
    assert.eq r9 true;
    div r2.total_pot 2u64 into r10;
    gte r0.amount r10 into r11;
    assert.eq r11 true;
    div r2.total_pot 2u64 into r12;
    cast r2.game_multisig r12 self.signer r3 r4 r5 r6 r7 r2.challenger_address r2.opponent_address 6u32 into r13 as PieceClaim.record;
    cast self.signer r8 r12 r2.game_multisig r2.challenger_address r2.opponent_address 7u32 into r14 as ClaimSignature.record;
    cast r2.game_multisig r12 r2.challenger_address r2.opponent_address r2.opponent_address 3u32 into r15 as PieceStake.record;
    sub r0.amount r12 into r16;
    cast self.signer r16 0u32 into r17 as Piece.record;
    cast r2.challenger_address r2.game_multisig 2field false r2.total_pot r2.challenger_address r2.opponent_address 20u32 into r18 as ChallengerWagerNotification.record;
    cast r2.opponent_address r2.game_multisig 2field true r2.total_pot r2.challenger_address r2.opponent_address 21u32 into r19 as OpponentWagerNotification.record;
    output r13 as PieceClaim.record;
    output r15 as PieceStake.record;
    output r14 as ClaimSignature.record;
    output r17 as Piece.record;
    output r18 as ChallengerWagerNotification.record;
    output r19 as OpponentWagerNotification.record;

function opponent_renege_stake:
    input r0 as WaitingAcceptanceNotification.record;
    input r1 as PieceStake.record;
    input r2 as PieceClaim.record;
    input r3 as signature.private;
    assert.eq self.caller self.signer;
    assert.eq r1.owner r2.owner;
    assert.eq r1.challenger r2.challenger;
    assert.eq r1.opponent r2.opponent;
    assert.eq r1.amount r2.amount;
    cast r2.message_1 r2.message_2 r2.message_3 r2.message_4 r2.message_5 into r4 as Message;
    sign_verify r3 r2.claimer r4 into r5;
    assert.eq true r5;
    cast r2.claimer r2.amount 0u32 into r6 as Piece.record;
    cast r0.challenger_address r0.game_multisig 0field false r0.total_pot r0.challenger_address r0.opponent_address r0.opponent_address 19u32 into r7 as StakeRenegedNotification.record;
    cast r0.opponent_address r0.game_multisig 0field false r0.total_pot r0.challenger_address r0.opponent_address r0.opponent_address 19u32 into r8 as StakeRenegedNotification.record;
    output r6 as Piece.record;
    output r7 as StakeRenegedNotification.record;
    output r8 as StakeRenegedNotification.record;

function accept_game:
    input r0 as Game.record;
    input r1 as field.private;
    input r2 as PieceStake.record;
    input r3 as PieceClaim.record;
    input r4 as PieceStake.record;
    input r5 as PieceClaim.record;
    input r6 as u32.private;
    assert.eq r0.owner self.signer;
    assert.eq self.caller self.signer;
    is.eq r1 0field into r7;
    is.eq r1 1field into r8;
    or r7 r8 into r9;
    assert.eq r9 true;
    assert.eq r3.owner r2.owner;
    assert.eq r4.owner r2.owner;
    assert.eq r5.owner r2.owner;
    assert.eq r3.amount r2.amount;
    assert.eq r4.amount r2.amount;
    assert.eq r5.amount r2.amount;
    assert.eq r3.challenger r2.challenger;
    assert.eq r4.challenger r2.challenger;
    assert.eq r5.challenger r2.challenger;
    assert.eq r3.opponent r2.opponent;
    assert.eq r4.opponent r2.opponent;
    assert.eq r5.opponent r2.opponent;
    assert.eq r3.claimer r2.challenger;
    assert.eq r5.claimer r4.opponent;
    cast r2.owner r0.total_pot r2.opponent r2.challenger r6 9u32 into r10 as PieceJointStake.record;
    cast r2.owner r0.total_pot r2.opponent r2.challenger r5.message_1 r5.message_2 r5.message_3 r5.message_4 r5.message_5 r2.owner r2.challenger r2.opponent r6 8u32 into r11 as JointPieceTimeClaim.record;
    cast r2.challenger r0.total_pot r2.opponent r2.challenger r3.message_1 r3.message_2 r3.message_3 r3.message_4 r3.message_5 r2.challenger r2.opponent r2.owner 10u32 into r12 as JointPieceState.record;
    cast r0.opponent_address r0.owner 3field false r0.total_pot r0.challenger_address r0.opponent_address 22u32 into r13 as WaitingRevealNotification.record;
    cast r0.challenger_address r0.owner 3field true r0.total_pot r0.challenger_address r0.opponent_address r1 23u32 into r14 as RevealAnswerNotification.record;
    cast r0.owner r0.challenger_commit r1 r0.total_pot r0.challenger_address r0.opponent_address r0.game_multisig 3field 16u32 into r15 as Game.record;
    async accept_game r6 into r16;
    output r10 as PieceJointStake.record;
    output r11 as JointPieceTimeClaim.record;
    output r12 as JointPieceState.record;
    output r13 as WaitingRevealNotification.record;
    output r14 as RevealAnswerNotification.record;
    output r15 as Game.record;
    output r16 as treasure_hunt_v010.aleo/accept_game.future;
finalize accept_game:
    input r0 as u32.public;
    sub block.height 1000u32 into r1;
    gte r0 r1 into r2;
    assert.eq r2 true;
    add block.height 1000u32 into r3;
    lte r0 r3 into r4;
    assert.eq r4 true;

function reveal_answer_game:
    input r0 as RevealAnswerNotification.record;
    input r1 as Answer.record;
    input r2 as JointPieceState.record;
    input r3 as ClaimSignature.record;
    assert.eq r2.state_updater_address self.signer;
    assert.eq self.caller self.signer;
    is.eq r0.opponent_answer r1.answer into r4;
    ternary r4 r1.opponent_address r1.challenger_address into r5;
    is.eq r5 r1.challenger_address into r6;
    ternary r6 r1.opponent_address r1.challenger_address into r7;
    assert.eq r1.owner r1.challenger_address;
    cast r1.message_1 r1.message_2 r1.message_3 r1.message_4 r1.message_5 into r8 as Message;
    sign_verify r3.sig r1.challenger_address r8 into r9;
    assert.eq true r9;
    cast r1.game_multisig r1.challenger_address r1.opponent_address r1.game_multisig r1.amount r1.nonce r1.answer r3.sig 28u32 into r10 as RevealAnswer.record;
    assert.eq r2.owner r3.owner;
    assert.eq r2.state_updater_address r3.owner;
    assert.eq r2.state_updater_address r3.challenger;
    add r3.amount r3.amount into r11;
    assert.eq r2.amount r11;
    assert.eq r2.opponent r3.opponent;
    assert.eq r2.game_multisig r2.game_multisig;
    cast r2.message_1 r2.message_2 r2.message_3 r2.message_4 r2.message_5 into r12 as Message;
    sign_verify r3.sig r2.state_updater_address r12 into r13;
    assert.eq true r13;
    is.eq r5 r2.challenger into r14;
    not r14 into r15;
    is.eq r5 r2.challenger into r16;
    or r15 r16 into r17;
    assert.eq r17 true;
    not r14 into r18;
    not r18 into r19;
    is.eq r5 r2.opponent into r20;
    or r19 r20 into r21;
    assert.eq r21 true;
    cast r2.game_multisig r2.amount r2.time_claimer_address r2.state_updater_address r2.challenger r2.opponent r2.game_multisig r5 12u32 into r22 as JointPieceWinner.record;
    cast r1.opponent_address r1.game_multisig 4field true r2.amount r1.challenger_address r1.opponent_address r1.answer r0.opponent_answer r5 r7 24u32 into r23 as GameFinishReqNotification.record;
    cast r1.challenger_address r1.game_multisig 4field true r2.amount r1.challenger_address r1.opponent_address r1.answer r0.opponent_answer r5 r7 24u32 into r24 as GameFinishReqNotification.record;
    output r10 as RevealAnswer.record;
    output r22 as JointPieceWinner.record;
    output r23 as GameFinishReqNotification.record;
    output r24 as GameFinishReqNotification.record;

function finish_game:
    input r0 as Game.record;
    input r1 as JointPieceWinner.record;
    input r2 as PieceJointStake.record;
    input r3 as JointPieceTimeClaim.record;
    assert.eq r0.owner self.signer;
    assert.eq self.caller self.signer;
    is.eq r1.winner r0.challenger_address into r4;
    ternary r4 r0.opponent_address r0.challenger_address into r5;
    assert.eq r2.owner r1.owner;
    assert.eq r3.owner r1.owner;
    assert.eq r2.amount r1.amount;
    assert.eq r3.amount r1.amount;
    assert.eq r2.state_updater_address r1.challenger;
    assert.eq r3.challenger r1.challenger;
    assert.eq r2.time_claimer_address r1.opponent;
    assert.eq r3.opponent r1.opponent;
    is.eq r1.winner r2.time_claimer_address into r6;
    not r6 into r7;
    is.eq r1.winner r2.time_claimer_address into r8;
    or r7 r8 into r9;
    assert.eq r9 true;
    not r6 into r10;
    not r10 into r11;
    is.eq r1.winner r2.state_updater_address into r12;
    or r11 r12 into r13;
    assert.eq r13 true;
    cast r1.winner r1.amount 0u32 into r14 as Piece.record;
    cast r0.owner r0.challenger_commit r0.opponent_answer r0.total_pot r0.challenger_address r0.opponent_address r0.game_multisig 5field 16u32 into r15 as Game.record;
    cast r0.challenger_address r0.game_multisig 5field false r0.total_pot r0.challenger_address r0.opponent_address r1.winner r5 25u32 into r16 as GameFinishedNotification.record;
    cast r0.opponent_address r0.game_multisig 5field false r0.total_pot r0.challenger_address r0.opponent_address r1.winner r5 25u32 into r17 as GameFinishedNotification.record;
    output r14 as Piece.record;
    output r15 as Game.record;
    output r16 as GameFinishedNotification.record;
    output r17 as GameFinishedNotification.record;

function finish_game_by_timeout:
    input r0 as Game.record;
    input r1 as PieceJointStake.record;
    input r2 as JointPieceTimeClaim.record;
    input r3 as signature.private;
    assert.eq r0.owner self.signer;
    assert.eq self.caller self.signer;
    cast r0.owner r0.challenger_commit r0.opponent_answer r0.total_pot r0.challenger_address r0.opponent_address r0.game_multisig 6field 16u32 into r4 as Game.record;
    cast r0.challenger_address r0.game_multisig 6field false r0.total_pot r0.challenger_address r0.opponent_address r0.opponent_address r0.challenger_address 25u32 into r5 as GameFinishedNotification.record;
    cast r0.opponent_address r0.game_multisig 6field false r0.total_pot r0.challenger_address r0.opponent_address r0.opponent_address r0.challenger_address 25u32 into r6 as GameFinishedNotification.record;
    assert.eq r1.owner r2.owner;
    assert.eq r1.amount r2.amount;
    assert.eq r1.state_updater_address r2.challenger;
    assert.eq r1.time_claimer_address r2.opponent;
    cast r2.message_1 r2.message_2 r2.message_3 r2.message_4 r2.message_5 into r7 as Message;
    sign_verify r3 r2.time_claimer_address r7 into r8;
    assert.eq true r8;
    cast r2.opponent r2.amount 0u32 into r9 as Piece.record;
    async finish_game_by_timeout r2.block_ht into r10;
    output r9 as Piece.record;
    output r4 as Game.record;
    output r5 as GameFinishedNotification.record;
    output r6 as GameFinishedNotification.record;
    output r10 as treasure_hunt_v010.aleo/finish_game_by_timeout.future;
finalize finish_game_by_timeout:
    input r0 as u32.public;
    add r0 10000u32 into r1;
    gt block.height r1 into r2;
    assert.eq r2 true;


  
@ Copyright Aleo Info 2022 All Rights Reserved