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;