Contract con_gamma_phi_profile_impl_v1


Contract Code


  
1 # con_gamma_phi_profile_impl_v1
2
3 DEFAULT_METADATA_FIELDS = [
4 'username',
5 'display_name',
6 'telegram',
7 'twitter',
8 'instagram',
9 'facebook',
10 'discord',
11 'icon_base64',
12 'icon_url',
13 'public_rsa_key',
14 'frens'
15 ]
16
17
18 @export
19 def interact(payload: dict, state: dict, caller: str):
20 # state
21 total_users = state['total_users']
22 metadata = state['metadata']
23 usernames = state['usernames']
24 owner = state['owner']
25
26 # action
27 function = payload['action']
28
29
30 if function == 'create_profile':
31 create_profile(
32 payload.get('username'),
33 caller,
34 metadata,
35 usernames,
36 total_users,
37 payload.get('display_name'),
38 payload.get('telegram'),
39 payload.get('twitter'),
40 payload.get('instagram'),
41 payload.get('facebook'),
42 payload.get('discord'),
43 payload.get('icon_base64'),
44 payload.get('icon_url'),
45 payload.get('public_rsa_key'),
46 )
47 elif function == 'add_frens':
48 add_frens(
49 payload.get('frens'),
50 caller,
51 metadata,
52 usernames,
53 )
54 elif function == 'remove_frens':
55 remove_frens(
56 payload.get('frens'),
57 caller,
58 metadata,
59 usernames,
60 )
61 elif function == 'delete_profile':
62 delete_profile(
63 caller,
64 metadata,
65 usernames,
66 total_users,
67 )
68 elif function == 'force_delete_profile':
69 force_delete_profile(
70 payload.get('user_address'),
71 caller,
72 metadata,
73 usernames,
74 total_users,
75 owner
76 )
77 elif function == 'update_profile':
78 update_profile(
79 payload.get('key'),
80 payload.get('value'),
81 caller,
82 metadata,
83 usernames,
84 )
85 elif function == 'force_update_profile':
86 force_update_profile(
87 payload.get('user_address'),
88 payload.get('key'),
89 payload.get('value'),
90 caller,
91 metadata,
92 usernames,
93 owner
94 )
95 elif function == 'force_update_metadata':
96 force_update_metadata(
97 payload.get('user_address'),
98 payload.get('key'),
99 payload.get('value'),
100 caller,
101 metadata,
102 owner,
103 )
104 elif function == 'force_update_usernames':
105 force_update_usernames(
106 payload.get('key'),
107 payload.get('value'),
108 caller,
109 usernames,
110 owner,
111 )
112
113
114 def create_profile(
115 username: str,
116 caller: str,
117 metadata: Any,
118 usernames: Any,
119 total_users: Any,
120 display_name: str = None,
121 telegram: str = None,
122 twitter: str = None,
123 instagram: str = None,
124 facebook: str = None,
125 discord: str = None,
126 icon_base64: str = None,
127 icon_url: str = None,
128 public_rsa_key: str = None, # Expected to be "{n}|{e}"
129 ):
130
131 user_address = caller
132
133 validate_username(username)
134 assert usernames[username] is None, f'Username {username} already exists.'
135
136 usernames[username] = user_address
137 metadata[user_address, 'username'] = username
138 metadata[user_address, 'display_name'] = display_name or username
139 if telegram is not None:
140 metadata[user_address, 'telegram'] = telegram
141 if twitter is not None:
142 metadata[user_address, 'twitter'] = twitter
143 if instagram is not None:
144 metadata[user_address, 'instagram'] = instagram
145 if facebook is not None:
146 metadata[user_address, 'facebook'] = facebook
147 if discord is not None:
148 metadata[user_address, 'discord'] = discord
149 if icon_base64 is not None:
150 metadata[user_address, 'icon_base64'] = icon_base64
151 if icon_url is not None:
152 metadata[user_address, 'icon_url'] = icon_url
153 metadata[user_address, 'frens'] = []
154 update_public_rsa_key(user_address=user_address, key=public_rsa_key, metadata=metadata)
155 total_users.set(total_users.get()+1)
156
157
158 def add_frens(frens: list,
159 caller: str,
160 metadata: Any,
161 usernames: Any):
162 user_address = caller
163 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
164 current_frens = metadata[user_address, 'frens'] or []
165 for fren in frens:
166 # Check for address or username
167 fren_address = usernames[fren]
168 if fren_address is None:
169 fren_address = fren
170
171 assert metadata[fren_address, 'username'] is not None, f'{fren_address} does not have a profile.'
172 assert fren_address != user_address, 'You cannot add yourself as a fren'
173
174 if fren_address not in current_frens:
175 current_frens.append(fren_address)
176 metadata[user_address, 'frens'] = current_frens
177
178
179 def remove_frens(frens: list,
180 caller: str,
181 metadata: Any,
182 usernames: Any):
183 user_address = caller
184 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
185 current_frens = metadata[user_address, 'frens'] or []
186 for fren in frens:
187 # Check for address or username
188 fren_address = usernames[fren]
189 if fren_address is None:
190 fren_address = fren
191
192 if fren_address in current_frens:
193 current_frens.remove(fren_address)
194 metadata[user_address, 'frens'] = current_frens
195
196
197 def validate_username(username: str):
198 assert username is not None and len(username) > 0, 'Username cannot be null or empty'
199 assert isinstance(username, str), 'Username must be a string.'
200 assert len(username) <= 16, 'Usernames cannot be longer than 16 characters.'
201 assert all([c.isalnum() or c in ('_', '-') for c in username]), 'Username has invalid characters. Each character must be alphanumeric, a hyphen, or an underscore.'
202 assert username[0] not in ('-', '_') and username[-1] not in ('-', '_'), 'Usernames cannot start or end with a hyphen or underscore.'
203
204
205 def update_public_rsa_key(user_address: str, key: str, metadata: Any):
206 if key is None:
207 metadata[user_address, 'public_rsa_key'] = None
208 else:
209 assert len(key.split('|')) == 2, 'Invalid key format'
210 metadata[user_address, 'public_rsa_key'] = key
211
212
213 def update_profile_helper(user_address: str, key: str, value: Any, metadata: Any, usernames: Any):
214 assert key != 'extra_fields', 'You cannot update extra_fields with this method.'
215 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
216
217 if key == 'username':
218 validate_username(value)
219
220 username = metadata[user_address, 'username']
221 assert username is not None, 'This user does not exist.'
222 assert usernames[value] is None, f'Username {value} already exists.'
223 assert value is not None, 'No username provided. Call delete_profile to remove a user profile.'
224
225 usernames[value] = user_address
226
227 elif key == 'public_rsa_key':
228 update_public_rsa_key(user_address=user_address, key=value, metadata=metadata)
229
230 elif key not in DEFAULT_METADATA_FIELDS:
231 extra_fields = metadata[user_address, 'extra_fields'] or []
232 if key not in extra_fields:
233 extra_fields.append(key)
234 metadata[user_address, 'extra_fields'] = extra_fields
235
236 metadata[user_address, key] = value
237
238
239 def delete_profile_helper(user_address: str, metadata: Any, usernames: Any, total_users: Any):
240 username = metadata[user_address, 'username']
241 assert username is not None, 'This user does not exist.'
242 usernames[username] = None
243 metadata[user_address, 'username'] = None
244 metadata[user_address, 'display_name'] = None
245 metadata[user_address, 'telegram'] = None
246 metadata[user_address, 'twitter'] = None
247 metadata[user_address, 'instagram'] = None
248 metadata[user_address, 'facebook'] = None
249 metadata[user_address, 'discord'] = None
250 metadata[user_address, 'icon_base64'] = None
251 metadata[user_address, 'icon_url'] = None
252 metadata[user_address, 'frens'] = None
253 update_public_rsa_key(user_address=user_address, key=None, metadata=metadata)
254 extra_fields = metadata[user_address, 'extra_fields'] or []
255 for field in extra_fields:
256 metadata[user_address, field] = None
257 # Subtract from total user count
258 total_users.set(total_users.get()-1)
259
260
261 def delete_profile(caller: str, metadata: Any, usernames: Any, total_users: Any):
262 delete_profile_helper(caller, metadata, usernames, total_users)
263
264
265 def force_delete_profile(user_address: str, caller: str, metadata: Any, usernames: Any, total_users: Any, owner: Any):
266 assert caller == owner.get(), 'Only the owner can call force_delete_profile'
267 delete_profile_helper(user_address, metadata, usernames, total_users)
268
269
270 def update_profile(key: str, value: Any, caller: str, metadata: Any, usernames: Any):
271 update_profile_helper(caller, key, value, metadata, usernames)
272
273
274 def force_update_profile(user_address: str, key: str, value: Any, caller: str, metadata: Any, usernames: Any, owner: Any):
275 assert caller == owner.get(), 'Only the owner can call force_update_profile'
276 update_profile_helper(user_address, key, value, metadata, usernames)
277
278
279 def force_update_metadata(user_address: str, key: str, value: Any, caller: str, metadata: Any, owner: Any):
280 assert caller == owner.get(), 'Only the owner can call force_update_metadata'
281 metadata[user_address, key] = value
282
283
284 def force_update_usernames(key: str, value: Any, caller: str, usernames: Any, owner: Any):
285 assert caller == owner.get(), 'Only the owner can call force_update_usernames'
286 usernames[key] = value

Byte Code

e30000000000000000000000001000000040000000735e0100006400640164026403640464056406640764086409640a670b5a006501640b8301650265026503640c9c03640d640e840483015a0464366503650365056505650565036503650365036503650365036503650364109c0e6411641284055a06650765036505650564139c046414641584045a08650765036505650564139c046416641784045a09650364189c016419641a84045a0a650365036505641b9c03641c641d84045a0b65036503650565056505641e9c05641f642084045a0c650365056505650564219c046422642384045a0d650365056505650564249c046425642684045a0e65036503650565056505650564279c066428642984045a0f65036505650365056505642a9c05642b642c84045a106503650365056503650565056505642d9c07642e642f84045a1165036503650565036505650564309c066431643284045a126503650565036505650564339c056434643584045a13640f53002937da08757365726e616d65da0c646973706c61795f6e616d65da0874656c656772616dda0774776974746572da09696e7374616772616dda0866616365626f6f6bda07646973636f7264da0b69636f6e5f626173653634da0869636f6e5f75726cda0e7075626c69635f7273615f6b6579da056672656e73da1d636f6e5f67616d6d615f7068695f70726f66696c655f696d706c5f76312903da077061796c6f6164da057374617465da0663616c6c657263030000000000000008000000100000004300000073c00100007c01640119007d037c01640219007d047c01640319007d057c01640419007d067c00640519007d077c0764066b02729274007c006a01640783017c027c047c057c037c006a01640883017c006a01640983017c006a01640a83017c006a01640b83017c006a01640c83017c006a01640d83017c006a01640e83017c006a01640f83017c006a0164108301830e010090016e2a7c0764116b0272b274027c006a01641283017c027c047c058304010090016e0a7c0764136b0272d074037c006a01641283017c027c047c05830401006eec7c0764146b0272e874047c027c047c057c03830401006ed47c0764156b029001720c74057c006a01641683017c027c047c057c037c06830601006eb07c0764176b029001723474067c006a01641883017c006a01641983017c027c047c05830501006e887c07641a6b029001726674077c006a01641683017c006a01641883017c006a01641983017c027c047c057c06830701006e567c07641b6b029001729674087c006a01641683017c006a01641883017c006a01641983017c027c047c06830601006e267c07641c6b02900172bc74097c006a01641883017c006a01641983017c027c057c068305010064005300291d4eda0b746f74616c5f7573657273da086d65746164617461da09757365726e616d6573da056f776e6572da06616374696f6eda0e6372656174655f70726f66696c65720100000072020000007203000000720400000072050000007206000000720700000072080000007209000000720a000000da096164645f6672656e73720b000000da0c72656d6f76655f6672656e73da0e64656c6574655f70726f66696c65da14666f7263655f64656c6574655f70726f66696c65da0c757365725f61646472657373da0e7570646174655f70726f66696c65da036b6579da0576616c7565da14666f7263655f7570646174655f70726f66696c65da15666f7263655f7570646174655f6d65746164617461da16666f7263655f7570646174655f757365726e616d6573290ada105f5f6372656174655f70726f66696c65da03676574da0b5f5f6164645f6672656e73da0e5f5f72656d6f76655f6672656e73da105f5f64656c6574655f70726f66696c65da165f5f666f7263655f64656c6574655f70726f66696c65da105f5f7570646174655f70726f66696c65da165f5f666f7263655f7570646174655f70726f66696c65da175f5f666f7263655f7570646174655f6d65746164617461da185f5f666f7263655f7570646174655f757365726e616d65732908720d000000720e000000720f0000007210000000721100000072120000007213000000da0866756e6374696f6ea900722c000000da00da08696e74657261637406000000734200000000020801080108010801080108010e0110011001140114010c010801180108011601080110010a010c010e010a0114010a010a010e011a010a010e0118010a011201722e0000004e290e7201000000720f00000072110000007212000000721000000072020000007203000000720400000072050000007206000000720700000072080000007209000000720a000000630e000000000000000f000000050000004300000073080100007c017d0e74007c00830101007c037c00190064006b087328740164017c009b0064029d03830182017c0e7c037c003c007c007c027c0e640366023c007c0570427c007c027c0e640466023c007c0664006b0972607c067c027c0e640566023c007c0764006b0972747c077c027c0e640666023c007c0864006b0972887c087c027c0e640766023c007c0964006b09729c7c097c027c0e640866023c007c0a64006b0972b07c0a7c027c0e640966023c007c0b64006b0972c47c0b7c027c0e640a66023c007c0c64006b0972d87c0c7c027c0e640b66023c0067007c027c0e640c66023c0074027c0e7c0d7c02640d8d0301007c046a037c046a048300640e17008301010064005300290f4e7a09557365726e616d65207a1020616c7265616479206578697374732e720100000072020000007203000000720400000072050000007206000000720700000072080000007209000000720b0000002903721a000000721c0000007211000000e9010000002905da135f5f76616c69646174655f757365726e616d65da0e417373657274696f6e4572726f72da175f5f7570646174655f7075626c69635f7273615f6b6579da037365747222000000290f7201000000720f00000072110000007212000000721000000072020000007203000000720400000072050000007206000000720700000072080000007209000000720a000000721a000000722c000000722c000000722d00000072210000002b00000073300000000005040108011c0108010c01100108010c0108010c0108010c0108010c0108010c0108010c0108010c010c010601080172210000002904720b000000720f00000072110000007212000000630400000000000000080000000400000043000000739e0000007c017d047c027c0464016602190064006b09731c74006402830182017c027c04640366021900702a67007d0578607c0044005d587d067c037c0619007d077c0764006b08724a7c067d077c027c0764016602190064006b09736874007c079b0064049d02830182017c077c046b03737874006405830182017c077c056b0772327c056a017c0783010100713257007c057c027c04640366023c006400530029064e72010000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e720b0000007a1920646f6573206e6f74206861766520612070726f66696c652e7a21596f752063616e6e6f742061646420796f757273656c662061732061206672656e29027231000000da06617070656e642908720b000000720f00000072110000007212000000721a000000da0d63757272656e745f6672656e73da046672656eda0c6672656e5f61646472657373722c000000722c000000722d00000072230000004a000000731c000000000104010a010e0110010a010801080104010a011401100108010e01722300000063040000000000000008000000040000004300000073700000007c017d047c027c0464016602190064006b09731c74006402830182017c027c04640366021900702a67007d0578327c0044005d2a7d067c037c0619007d077c0764006b08724a7c067d077c077c056b0672327c056a017c0783010100713257007c057c027c04640366023c006400530029044e72010000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e720b00000029027231000000da0672656d6f76652908720b000000720f00000072110000007212000000721a000000723500000072360000007237000000722c000000722c000000722d00000072240000005b0000007316000000000104010a010e0110010a0108010801040108010e0172240000002901720100000063010000000000000001000000030000004300000073800000007c0064006b09721474007c00830164016b04731c740164028301820174027c0074038302732e740164038301820174007c00830164046b017342740164058301820174046406640784007c00440083018301735c74016408830182017c0064011900640d6b0772747c00640e1900640f6b07737c7401640c830182016400530029104ee9000000007a20557365726e616d652063616e6e6f74206265206e756c6c206f7220656d7074797a1a557365726e616d65206d757374206265206120737472696e672ee9100000007a2e557365726e616d65732063616e6e6f74206265206c6f6e676572207468616e20313620636861726163746572732e630100000000000000020000000500000053000000731c00000067007c005d147d017c016a00830070167c0164026b069102710453002903da015ffa012d2902723b000000723c0000002901da076973616c6e756d2902da022e30da0163722c000000722c000000722d000000fa0a3c6c697374636f6d703e6f000000730200000006007a275f5f76616c69646174655f757365726e616d652e3c6c6f63616c733e2e3c6c697374636f6d703e7a61557365726e616d652068617320696e76616c696420636861726163746572732e204561636820636861726163746572206d75737420626520616c7068616e756d657269632c20612068797068656e2c206f7220616e20756e64657273636f72652e723c000000723b000000722f0000007a3a557365726e616d65732063616e6e6f74207374617274206f7220656e64207769746820612068797068656e206f7220756e64657273636f72652e2902723c000000723b000000e9ffffffff2902723c000000723b0000002905da036c656e7231000000da0a6973696e7374616e6365da03737472da03616c6c29017201000000722c000000722c000000722d000000723000000069000000731200000000010e010e01120106010e01140106011a0172300000002903721a000000721c000000721100000063030000000000000003000000040000004300000073400000007c0164006b08721664007c027c00640166023c006e2674007c016a0164028301830164036b02733074026404830182017c017c027c00640166023c006400530029054e720a000000fa017ce9020000007a12496e76616c6964206b657920666f726d617429037242000000da0573706c697472310000002903721a000000721c0000007211000000722c000000722c000000722d0000007232000000750000007308000000000108010e021a0172320000002905721a000000721c000000721d0000007211000000721200000063050000000000000007000000050000004300000073e80000007c0164016b03731074006402830182017c037c0064036602190064006b09732874006404830182017c0164036b02728a74017c02830101007c037c006403660219007d057c0564006b09735474006405830182017c047c02190064006b087370740064067c029b0064079d03830182017c0264006b09738074006408830182017c007c047c023c006e4e7c0164096b0272a274027c007c027c03640a8d0301006e367c0174036b0772d87c037c0064016602190070b867007d067c017c066b0772d87c066a047c01830101007c067c037c00640166023c007c027c037c007c0166023c0064005300290b4eda0c65787472615f6669656c64737a30596f752063616e6e6f74207570646174652065787472615f6669656c647320776974682074686973206d6574686f642e72010000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e7a1954686973207573657220646f6573206e6f742065786973742e7a09557365726e616d65207a1020616c7265616479206578697374732e7a434e6f20757365726e616d652070726f76696465642e2043616c6c2064656c6574655f70726f66696c6520746f2072656d6f7665206120757365722070726f66696c652e720a0000002903721a000000721c00000072110000002905723100000072300000007232000000da1744454641554c545f4d455441444154415f4649454c445372340000002907721a000000721c000000721d0000007211000000721200000072010000007249000000722c000000722c000000722d000000da175f5f7570646174655f70726f66696c655f68656c7065727d0000007326000000000210010a010e01080108010c0110011c0110010a01080106010a010801100108010a010c01724b0000002904721a00000072110000007212000000721000000063040000000000000007000000050000004300000073ea0000007c017c006401660219007d047c0464006b09731c740064028301820164007c027c043c0064007c017c00640166023c0064007c017c00640366023c0064007c017c00640466023c0064007c017c00640566023c0064007c017c00640666023c0064007c017c00640766023c0064007c017c00640866023c0064007c017c00640966023c0064007c017c00640a66023c0064007c017c00640b66023c0074017c0064007c01640c8d0301007c017c00640d6602190070b867007d0578187c0544005d107d0664007c017c007c0666023c0071c057007c036a027c036a038300640e18008301010064005300290f4e72010000007a1954686973207573657220646f6573206e6f742065786973742e72020000007203000000720400000072050000007206000000720700000072080000007209000000720b0000002903721a000000721c00000072110000007249000000722f000000290472310000007232000000723300000072220000002907721a00000072110000007212000000721000000072010000007249000000da056669656c64722c000000722c000000722d000000da175f5f64656c6574655f70726f66696c655f68656c70657294000000732600000000020c01100108010c010c010c010c010c010c010c010c010c010c010601080110010a011001724d0000002904720f000000721100000072120000007210000000630400000000000000040000000500000043000000731200000074007c007c017c027c03830401006400530029014e2901724d0000002904720f000000721100000072120000007210000000722c000000722c000000722d0000007225000000ab0000007302000000000272250000002906721a000000720f000000721100000072120000007210000000721300000063060000000000000006000000050000004300000073260000007c017c056a0083006b027314740164018301820174027c007c027c037c04830401006400530029024e7a2c4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f64656c6574655f70726f66696c65290372220000007231000000724d0000002906721a000000720f0000007211000000721200000072100000007213000000722c000000722c000000722d0000007226000000b0000000730600000000020e01060172260000002905721c000000721d000000720f00000072110000007212000000630500000000000000050000000600000043000000731400000074007c027c007c017c037c04830501006400530029014e2901724b0000002905721c000000721d000000720f00000072110000007212000000722c000000722c000000722d0000007227000000b70000007302000000000272270000002907721a000000721c000000721d000000720f00000072110000007212000000721300000063070000000000000007000000060000004300000073280000007c037c066a0083006b027314740164018301820174027c007c017c027c047c05830501006400530029024e7a2c4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f70726f66696c65290372220000007231000000724b0000002907721a000000721c000000721d000000720f000000721100000072120000007213000000722c000000722c000000722d0000007228000000bc000000730600000000020e01060172280000002906721a000000721c000000721d000000720f0000007211000000721300000063060000000000000006000000040000004300000073240000007c037c056a0083006b02731474016401830182017c027c047c007c0166023c006400530029024e7a2d4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f6d657461646174612902722200000072310000002906721a000000721c000000721d000000720f00000072110000007213000000722c000000722c000000722d0000007229000000c3000000730600000000020e01060172290000002905721c000000721d000000720f0000007212000000721300000063050000000000000005000000030000004300000073200000007c027c046a0083006b02731474016401830182017c017c037c003c006400530029024e7a2e4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f757365726e616d65732902722200000072310000002905721c000000721d000000720f00000072120000007213000000722c000000722c000000722d000000722a000000ca000000730600000000020e010601722a00000029094e4e4e4e4e4e4e4e4e2914724a000000da085f5f6578706f7274da04646963747244000000722e000000da03416e797221000000da046c6973747223000000722400000072300000007232000000724b000000724d00000072250000007226000000722700000072280000007229000000722a000000722c000000722c000000722c000000722d000000da083c6d6f64756c653e01000000733800000006010a010a03060114250001000100012a1b1411140e0e0c1208060110160401101606010e040601120608010e0406011406060112060601