Contract con_poker_game_controller_v1


Contract Code


  
1 # con_poker_game_controller_v1
2
3 I = importlib
4
5
6 ONE_CARD_POKER = 0
7 BLIND_POKER = 1
8 STUD_POKER = 2
9 HOLDEM_POKER = 3
10 OMAHA_POKER = 4
11 ALL_GAME_TYPES = [ONE_CARD_POKER, BLIND_POKER, STUD_POKER, HOLDEM_POKER, OMAHA_POKER]
12 NO_LIMIT = 0
13 POT_LIMIT = 1
14 ALL_BETTING_TYPES = [NO_LIMIT, POT_LIMIT]
15
16
17 def get_players_and_assert_exists(game_id: str, games: Any) -> dict:
18 players = games[game_id, 'players']
19 assert players is not None, f'Game {game_id} does not exist.'
20 return players
21
22
23 def create_game_id(name: str) -> str:
24 return hashlib.sha3(":".join([name, str(now)]))
25
26
27 @export
28 def add_chips_to_game(game_id: str, amount: float, player: str, games: Any):
29 assert amount > 0, 'Amount must be a positive number'
30 players = get_players_and_assert_exists(game_id, games)
31 assert player in players, 'You do not belong to this game.'
32 games[game_id, player] = (games[game_id, player] or 0.0) + amount
33
34
35 @export
36 def withdraw_chips_from_game(game_id: str, amount: float, player: str, games: Any):
37 assert amount > 0, 'Amount must be a positive number'
38 players = get_players_and_assert_exists(game_id, games)
39 assert player in players, 'You do not belong to this game.'
40 current_chip_count = games[game_id, player]
41 assert current_chip_count >= amount, 'You cannot withdraw more than you have.'
42 games[game_id, player] = current_chip_count - amount
43
44
45 @export
46 def respond_to_invite(game_id: str, accept: bool, player: str, games: Any, players_invites: Any, players_games: Any):
47 player_invites = players_invites[player] or []
48 players = get_players_and_assert_exists(game_id, games)
49 assert player not in players, 'You are already a part of this game.'
50 declined = players_invites[player, 'declined'] or []
51 assert game_id in player_invites or game_id in declined or games[game_id, 'public'], 'You have not been invited to this game.'
52 if game_id in player_invites:
53 player_invites.remove(game_id)
54 players_invites[player] = player_invites
55 players_invites[player, game_id] = accept
56 if accept:
57 if game_id in declined:
58 declined.remove(game_id)
59 players_invites[player, 'declined'] = declined
60 players.append(player)
61 games[game_id, 'players'] = players
62 players_games[player] = (players_games[player] or []) + [game_id]
63 else:
64 if game_id not in declined:
65 declined.append(game_id)
66 players_invites[player, 'declined'] = declined
67
68 @export
69 def decline_all_invites(player: str, players_invites: Any):
70 invites = players_invites[player] or []
71 for invite in invites:
72 players_invites[player, invite] = False
73 players_invites[player] = []
74
75 def send_invite_requests(game_id: str, others: list, players_invites: Any):
76 for other in others:
77 player_invites = players_invites[other] or []
78 player_invites.append(game_id)
79 players_invites[other] = player_invites
80
81 def validate_game_name(name: str):
82 assert name is not None and len(name) > 0, 'Game name cannot be null or empty'
83 assert isinstance(name, str), 'Game name must be a string.'
84 assert len(name) <= 36, 'Game name cannot be longer than 36 characters.'
85 assert all([c.isalnum() or c in ('_', '-') for c in name]), 'Game name has invalid characters. Each character must be alphanumeric, a hyphen, or an underscore.'
86 assert name[0] not in ('-', '_') and name[-1] not in ('-', '_'), 'Game name cannot start or end with a hyphen or underscore.'
87
88 @export
89 def start_game(name: str,
90 other_players: list,
91 creator: str,
92 game_config: dict,
93 games: Any,
94 game_names: Any,
95 players_games: Any,
96 players_invites: Any,
97 public: bool = False) -> str:
98
99 game_type = game_config['game_type']
100 bet_type = game_config['bet_type']
101 assert game_type in ALL_GAME_TYPES, f'Invalid game type: {game_type}.'
102 assert bet_type in ALL_BETTING_TYPES, f'Invalid betting type: {bet_type}.'
103
104 ante = game_config['ante']
105 assert ante >= 0, 'Ante must be non-negative.'
106 assert creator not in other_players, f'Caller can\'t be in other_players input.'
107
108 game_id = create_game_id(name=name)
109
110 assert games[game_id, 'creator'] is None, f'Game {game_id} has already been created.'
111
112 validate_game_name(name)
113 assert game_names[name] is None, f'Game {name} has already been created.'
114 game_names[name] = game_id
115
116 games[game_id, 'players'] = [creator]
117 games[game_id, 'name'] = name
118 games[game_id, 'ante'] = ante
119 games[game_id, 'creator'] = creator
120 games[game_id, 'invitees'] = other_players
121 games[game_id, 'public'] = public
122 games[game_id, 'game_type'] = game_type
123 games[game_id, 'bet_type'] = bet_type
124
125 if game_type == STUD_POKER:
126 n_cards_total = game_config['n_cards_total']
127 n_hole_cards = game_config['n_hole_cards']
128 assert n_cards_total is not None, 'Must specify n_cards_total for stud poker.'
129 assert n_hole_cards is not None, 'Must specify n_hole_cards for stud poker.'
130 assert n_cards_total == 5 or n_cards_total == 7, 'n_cards_total must equal 5 or 7.'
131 assert n_hole_cards > 0, 'n_hole_cards must be positive.'
132 assert n_hole_cards <= n_cards_total, 'n_hole_cards must be less than or equal to n_cards_total.'
133 games[game_id, 'n_cards_total'] = n_cards_total
134 games[game_id, 'n_hole_cards'] = n_hole_cards
135
136 players_games[creator] = (players_games[creator] or []) + [game_id]
137 send_invite_requests(game_id, other_players, players_invites)
138
139 return game_id
140
141 @export
142 def add_player_to_game(game_id: str, player_to_add: str, player: str, games: Any, players_invites: Any):
143 assert player != player_to_add, 'You cannot add yourself to a game.'
144 creator = games[game_id, 'creator']
145 assert player == creator, 'Only the game creator can add players.'
146 players = get_players_and_assert_exists(game_id, games)
147 assert player_to_add not in players, 'Player is already in the game.'
148 invitees = games[game_id, 'invitees']
149 assert player_to_add not in invitees, 'Player has already been invited.'
150 invitees.append(player_to_add)
151 games[game_id, 'invitees'] = invitees
152 send_invite_requests(game_id, [player_to_add], players_invites)
153
154 @export
155 def leave_game(game_id: str, player: str, games: Any, players_games: Any, hands: Any, hand_controller_contract: str):
156 players = get_players_and_assert_exists(game_id, games)
157 assert player in players, 'You are not in this game.'
158
159 chips = games[game_id, player]
160 assert chips is None or chips == 0, 'You still have chips in this game. Please withdraw them before leaving.'
161
162 player_games = players_games[player]
163 player_games.remove(game_id)
164 players_games[player] = player_games
165 players.remove(player)
166 games[game_id, 'players'] = players
167
168 hand_id = games[game_id, 'current_hand']
169
170 if hand_id is not None:
171 I.load_module(hand_controller_contract).leave_hand(
172 hand_id=hand_id,
173 player=player,
174 hands=hands
175 )
176

Byte Code

e30000000000000000000000000d00000040000000735401000065005a0164005a0264015a0364025a0464035a0564045a066502650365046505650667055a0764005a0864015a096508650967025a0a650b650c650d64059c036406640784045a0e650b650b64089c026409640a84045a0f6510640b8301650b6511650b650c640c9c04640d640e840483015a126510640b8301650b6511650b650c640c9c04640f6410840483015a136510640b8301650b6514650b650c650c650c64119c0664126413840483015a156510640b8301650b650c64149c0264156416840483015a16650b6517650c64179c036418641984045a18650b641a9c01641b641c84045a196510640b83016428650b6517650b650d650c650c650c650c6514650b641e9c0a641f6420840583015a1a6510640b8301650b650b650b650c650c64219c0564226423840483015a1b6510640b8301650b650b650c650c650c650b64249c0664256426840483015a1c642753002929e900000000e901000000e902000000e903000000e9040000002903da0767616d655f6964da0567616d6573da0672657475726e63020000000000000003000000040000004300000073280000007c017c006401660219007d027c0264006b097324740064027c009b0064039d03830182017c02530029044eda07706c61796572737a0547616d65207a1020646f6573206e6f742065786973742e2901da0e417373657274696f6e4572726f722903720600000072070000007209000000a900720b000000da00da1f5f5f6765745f706c61796572735f616e645f6173736572745f6578697374730e000000730600000000010c011801720d0000002902da046e616d657208000000630100000000000000010000000500000043000000731800000074006a0164016a027c00740374048301670283018301530029024efa013a2905da07686173686c6962da0473686133da046a6f696eda03737472da036e6f772901720e000000720b000000720b000000720c000000da105f5f6372656174655f67616d655f696414000000730200000000017215000000da1c636f6e5f706f6b65725f67616d655f636f6e74726f6c6c65725f763129047206000000da06616d6f756e74da06706c617965727207000000630400000000000000050000000400000043000000734e0000007c0164016b047310740064028301820174017c007c0383027d047c027c046b06732a74006403830182017c037c007c0266021900703c7402640483017c0117007c037c007c0266023c006400530029054e72010000007a20416d6f756e74206d757374206265206120706f736974697665206e756d6265727a1f596f7520646f206e6f742062656c6f6e6720746f20746869732067616d652e7a03302e302903720a000000720d000000da07646563696d616c290572060000007217000000721800000072070000007209000000720b000000720b000000720c000000da116164645f63686970735f746f5f67616d6518000000730a000000000210010a0110011201721a000000630400000000000000060000000400000043000000735a0000007c0164016b047310740064028301820174017c007c0383027d047c027c046b06732a74006403830182017c037c007c02660219007d057c057c016b05734674006404830182017c057c0118007c037c007c0266023c006400530029054e72010000007a20416d6f756e74206d757374206265206120706f736974697665206e756d6265727a1f596f7520646f206e6f742062656c6f6e6720746f20746869732067616d652e7a27596f752063616e6e6f74207769746864726177206d6f7265207468616e20796f7520686176652e2902720a000000720d000000290672060000007217000000721800000072070000007209000000da1263757272656e745f636869705f636f756e74720b000000720b000000720c000000da1877697468647261775f63686970735f66726f6d5f67616d6521000000730c000000000310010a0110010c011001721c00000029067206000000da0661636365707472180000007207000000da0f706c61796572735f696e7669746573da0d706c61796572735f67616d657363060000000000000009000000040000004300000073f20000007c047c021900700a67007d0674007c007c0383027d077c027c076b07732674016401830182017c047c02640266021900703467007d087c007c066b06735a7c007c086b06735a7c037c00640366021900735a74016404830182017c007c066b0672747c066a027c00830101007c067c047c023c007c017c047c027c0066023c007c0172d07c007c086b0672a27c086a027c00830101007c087c047c02640266023c007c076a037c02830101007c077c037c00640566023c007c057c02190070c267007c00670117007c057c023c006e1e7c007c086b0772ee7c086a037c00830101007c087c047c02640266023c006400530029064e7a24596f752061726520616c726561647920612070617274206f6620746869732067616d652eda086465636c696e6564da067075626c69637a27596f752068617665206e6f74206265656e20696e766974656420746f20746869732067616d652e72090000002904720d000000720a000000da0672656d6f7665da06617070656e6429097206000000721d00000072180000007207000000721e000000721f000000da0e706c617965725f696e766974657372090000007220000000720b000000720b000000720c000000da11726573706f6e645f746f5f696e766974652c000000732800000000030c010a01100110011201120108010a0108010c01040108010a010c010a010c01180108010a01722500000029027218000000721e00000063020000000000000004000000050000004300000073320000007c017c001900700a67007d0278187c0244005d107d0364017c017c007c0366023c007112570067007c017c003c006400530029024e46720b00000029047218000000721e000000da07696e7669746573da06696e76697465720b000000720b000000720c000000da136465636c696e655f616c6c5f696e766974657345000000730800000000020c010a011001722800000029037206000000da066f7468657273721e0000006303000000000000000500000004000000430000007330000000782a7c0144005d227d037c027c031900701467007d047c046a007c00830101007c047c027c033c00710657006400530029014e29017223000000290572060000007229000000721e000000da056f746865727224000000720b000000720b000000720c000000da165f5f73656e645f696e766974655f72657175657374734d000000730800000000010a010c010a01722b0000002901720e00000063010000000000000001000000030000004300000073800000007c0064006b09721474007c00830164016b04731c740164028301820174027c0074038302732e740164038301820174007c00830164046b017342740164058301820174046406640784007c00440083018301735c74016408830182017c0064011900640d6b0772747c00640e1900640f6b07737c7401640c830182016400530029104e72010000007a2147616d65206e616d652063616e6e6f74206265206e756c6c206f7220656d7074797a1b47616d65206e616d65206d757374206265206120737472696e672ee9240000007a2e47616d65206e616d652063616e6e6f74206265206c6f6e676572207468616e20333620636861726163746572732e630100000000000000020000000500000053000000731c00000067007c005d147d017c016a00830070167c0164026b069102710453002903da015ffa012d2902722d000000722e0000002901da076973616c6e756d2902da022e30da0163720b000000720b000000720c000000fa0a3c6c697374636f6d703e59000000730200000006007a285f5f76616c69646174655f67616d655f6e616d652e3c6c6f63616c733e2e3c6c697374636f6d703e7a6247616d65206e616d652068617320696e76616c696420636861726163746572732e204561636820636861726163746572206d75737420626520616c7068616e756d657269632c20612068797068656e2c206f7220616e20756e64657273636f72652e722e000000722d00000072020000007a3a47616d65206e616d652063616e6e6f74207374617274206f7220656e64207769746820612068797068656e206f7220756e64657273636f72652e2902722e000000722d000000e9ffffffff2902722e000000722d0000002905da036c656e720a000000da0a6973696e7374616e63657213000000da03616c6c2901720e000000720b000000720b000000720c000000da145f5f76616c69646174655f67616d655f6e616d6554000000731000000000010e010e0112011401140106011a01723700000046290a720e000000da0d6f746865725f706c6179657273da0763726561746f72da0b67616d655f636f6e6669677207000000da0a67616d655f6e616d6573721f000000721e000000722100000072080000006309000000000000000f000000040000004300000073de0100007c03640119007d097c03640219007d0a7c0974006b067328740164037c099b0064049d03830182017c0a74026b067340740164057c0a9b0064049d03830182017c03640619007d0b7c0b64076b05735874016408830182017c027c016b077368740164098301820174037c00640a8d017d0c7c047c0c640b6602190064006b0873927401640c7c0c9b00640d9d038301820174047c00830101007c057c00190064006b0873b67401640c7c009b00640d9d03830182017c0c7c057c003c007c0267017c047c0c640e66023c007c007c047c0c640f66023c007c0b7c047c0c640666023c007c027c047c0c640b66023c007c017c047c0c641066023c007c087c047c0c641166023c007c097c047c0c640166023c007c0a7c047c0c640266023c007c0974056b02900172b67c03641219007d0d7c03641319007d0e7c0d64006b099001734c74016414830182017c0e64006b099001735e74016415830182017c0d64166b029001737a7c0d64176b029001737a74016418830182017c0e64076b049001738c74016419830182017c0e7c0d6b019001739e7401641a830182017c0d7c047c0c641266023c007c0e7c047c0c641366023c007c067c021900900170c267007c0c670117007c067c023c0074067c0c7c017c07830301007c0c5300291b4eda0967616d655f74797065da086265745f747970657a13496e76616c69642067616d6520747970653a20da012e7a16496e76616c69642062657474696e6720747970653a20da04616e746572010000007a1a416e7465206d757374206265206e6f6e2d6e656761746976652e7a2743616c6c65722063616e277420626520696e206f746865725f706c617965727320696e7075742e2901720e00000072390000007a0547616d65207a1a2068617320616c7265616479206265656e20637265617465642e7209000000720e000000da08696e7669746565737221000000da0d6e5f63617264735f746f74616cda0c6e5f686f6c655f63617264737a2a4d7573742073706563696679206e5f63617264735f746f74616c20666f72207374756420706f6b65722e7a294d7573742073706563696679206e5f686f6c655f636172647320666f72207374756420706f6b65722ee905000000e9070000007a206e5f63617264735f746f74616c206d75737420657175616c2035206f7220372e7a1e6e5f686f6c655f6361726473206d75737420626520706f7369746976652e7a396e5f686f6c655f6361726473206d757374206265206c657373207468616e206f7220657175616c20746f206e5f63617264735f746f74616c2e2907da0e414c4c5f47414d455f5459504553720a000000da11414c4c5f42455454494e475f545950455372150000007237000000da0a535455445f504f4b4552722b000000290f720e00000072380000007239000000723a0000007207000000723b000000721f000000721e0000007221000000723c000000723d000000723f000000720600000072410000007242000000720b000000720b000000720c000000da0a73746172745f67616d655f0000007344000000000408010801180118010801100110010a010a01160108011c0108010e010c010c010c010c010c010c010c010a0108010801120112011c01120112010c010c0118010c01724800000029057206000000da0d706c617965725f746f5f61646472180000007207000000721e000000630500000000000000080000000400000043000000738a0000007c027c016b03731074006401830182017c037c006402660219007d057c027c056b02732c740064038301820174017c007c0383027d067c017c066b07734674006404830182017c037c006405660219007d077c017c076b07736274006406830182017c076a027c01830101007c077c037c00640566023c0074037c007c0167017c04830301006400530029074e7a22596f752063616e6e6f742061646420796f757273656c6620746f20612067616d652e72390000007a264f6e6c79207468652067616d652063726561746f722063616e2061646420706c61796572732e7a1e506c6179657220697320616c726561647920696e207468652067616d652e72400000007a20506c617965722068617320616c7265616479206265656e20696e76697465642e2904720a000000720d0000007223000000722b00000029087206000000724900000072180000007207000000721e000000723900000072090000007240000000720b000000720b000000720c000000da126164645f706c617965725f746f5f67616d65870000007314000000000310010c0110010a0110010c0110010a010c01724a0000002906720600000072180000007207000000721f000000da0568616e6473da1868616e645f636f6e74726f6c6c65725f636f6e74726163746306000000000000000a0000000500000043000000739c00000074007c007c0283027d067c017c066b06731a74016401830182017c027c007c01660219007d077c0764006b08733e7c0764026b02733e74016403830182017c037c0119007d087c086a027c00830101007c087c037c013c007c066a027c01830101007c067c027c00640466023c007c027c006405660219007d097c0964006b09729874036a047c0583016a057c097c017c0464068d0301006400530029074e7a19596f7520617265206e6f7420696e20746869732067616d652e72010000007a47596f75207374696c6c206861766520636869707320696e20746869732067616d652e20506c65617365207769746864726177207468656d206265666f7265206c656176696e672e7209000000da0c63757272656e745f68616e642903da0768616e645f69647218000000724b0000002906720d000000720a0000007222000000da0149da0b6c6f61645f6d6f64756c65da0a6c656176655f68616e64290a720600000072180000007207000000721f000000724b000000724c0000007209000000da056368697073da0c706c617965725f67616d6573724e000000720b000000720b000000720c000000da0a6c656176655f67616d6596000000731a00000000030a0110010c01180108010a0108010a010c010c0108010c0172540000004e290146291dda09696d706f72746c6962724f000000da0e4f4e455f434152445f504f4b4552da0b424c494e445f504f4b45527247000000da0c484f4c44454d5f504f4b4552da0b4f4d4148415f504f4b45527245000000da084e4f5f4c494d4954da09504f545f4c494d495472460000007213000000da03416e79da0464696374720d0000007215000000da085f5f6578706f7274da05666c6f6174721a000000721c000000da04626f6f6c72250000007228000000da046c697374722b00000072370000007248000000724a0000007254000000720b000000720b000000720b000000720c000000da083c6d6f64756c653e0100000073400000000401040104010401040104010801060104010401080312061004060116080601060110090601080112170601120712070e0b0603242506010601120d06010801