Contract con_gamma_phi_profile_v4


Contract Code


  
1 # con_gamma_phi_profile_v4
2 metadata = Hash(default_value=None)
3 usernames = Hash(default_value=None)
4 total_users = Variable()
5 owner = Variable()
6
7
8 DEFAULT_METADATA_FIELDS = [
9 'username',
10 'display_name',
11 'telegram',
12 'twitter',
13 'instagram',
14 'facebook',
15 'discord',
16 'icon_base64',
17 'icon_url',
18 'public_rsa_key',
19 'frens'
20 ]
21
22
23 @construct
24 def seed():
25 total_users.set(0)
26 owner.set(ctx.caller)
27
28
29 @export
30 def create_profile(
31 username: str,
32 display_name: str,
33 telegram: str = None,
34 twitter: str = None,
35 instagram: str = None,
36 facebook: str = None,
37 discord: str = None,
38 icon_base64: str = None,
39 icon_url: str = None,
40 public_rsa_key: str = None # Expected to be "{n}|{e}"
41 ):
42
43 user_address = ctx.caller
44
45 validate_username(username)
46 assert usernames[username] is None, f'Username {username} already exists.'
47
48 usernames[username] = user_address
49 metadata[user_address, 'username'] = username
50 metadata[user_address, 'display_name'] = display_name or username
51 metadata[user_address, 'telegram'] = telegram
52 metadata[user_address, 'twitter'] = twitter
53 metadata[user_address, 'instagram'] = instagram
54 metadata[user_address, 'facebook'] = facebook
55 metadata[user_address, 'discord'] = discord
56 metadata[user_address, 'icon_base64'] = icon_base64
57 metadata[user_address, 'icon_url'] = icon_url
58 metadata[user_address, 'frens'] = []
59 update_public_rsa_key(user_address=user_address, key=public_rsa_key)
60 total_users.set(total_users.get()+1)
61
62
63 @export
64 def add_frens(frens: list):
65 user_address = ctx.caller
66 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
67 current_frens = metadata[user_address, 'frens'] or []
68 for fren in frens:
69 # Check for address or username
70 fren_address = usernames[fren]
71 if fren_address is None:
72 fren_address = fren
73
74 assert metadata[fren_address, 'username'] is not None, f'{fren_address} does not have a profile.'
75 assert fren_address != user_address, 'You cannot add yourself as a fren'
76
77 if fren_address not in current_frens:
78 current_frens.append(fren_address)
79 metadata[user_address, 'frens'] = current_frens
80
81
82 @export
83 def remove_frens(frens: list):
84 user_address = ctx.caller
85 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
86 current_frens = metadata[user_address, 'frens'] or []
87 for fren in frens:
88 # Check for address or username
89 fren_address = usernames[fren]
90 if fren_address is None:
91 fren_address = fren
92
93 if fren_address in current_frens:
94 current_frens.remove(fren_address)
95 metadata[user_address, 'frens'] = current_frens
96
97
98 def validate_username(username: str):
99 assert username is not None and len(username) > 0, 'Username cannot be null or empty'
100 assert isinstance(username, str), 'Username must be a string.'
101 assert len(username) <= 16, 'Usernames cannot be longer than 16 characters.'
102 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.'
103 assert username[0] not in ('-', '_') and username[-1] not in ('-', '_'), 'Usernames cannot start or end with a hyphen or underscore.'
104
105
106 def update_public_rsa_key(user_address, key: str):
107 if key is None:
108 metadata[user_address, 'public_rsa_key'] = None
109 else:
110 assert len(key.split('|')) == 2, 'Invalid key format'
111 metadata[user_address, 'public_rsa_key'] = key
112
113
114 def update_profile_helper(user_address: str, key: str, value: Any):
115 assert key != 'extra_fields', 'You cannot update extra_fields with this method.'
116 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
117
118 if key == 'username':
119 validate_username(value)
120
121 username = metadata[user_address, 'username']
122 assert username is not None, 'This user does not exist.'
123 assert usernames[value] is None, f'Username {value} already exists.'
124 assert value is not None, 'No username provided. Call delete_profile to remove a user profile.'
125
126 usernames[value] = user_address
127
128 elif key == 'public_rsa_key':
129 update_public_rsa_key(user_address=user_address, key=value)
130
131 elif key not in DEFAULT_METADATA_FIELDS:
132 extra_fields = metadata[user_address, 'extra_fields'] or []
133 if key not in extra_fields:
134 extra_fields.append(key)
135 metadata[user_address, 'extra_fields'] = extra_fields
136
137 metadata[user_address, key] = value
138
139
140 def delete_profile_helper(user_address: str):
141 username = metadata[user_address, 'username']
142 assert username is not None, 'This user does not exist.'
143 usernames[username] = None
144 metadata[user_address, 'username'] = None
145 metadata[user_address, 'display_name'] = None
146 metadata[user_address, 'telegram'] = None
147 metadata[user_address, 'twitter'] = None
148 metadata[user_address, 'instagram'] = None
149 metadata[user_address, 'facebook'] = None
150 metadata[user_address, 'discord'] = None
151 metadata[user_address, 'icon_base64'] = None
152 metadata[user_address, 'icon_url'] = None
153 metadata[user_address, 'frens'] = None
154 update_public_rsa_key(user_address=user_address, key=None)
155 extra_fields = metadata[user_address, 'extra_fields'] or []
156 for field in extra_fields:
157 metadata[user_address, field] = None
158 # Subtract from total user count
159 total_users.set(total_users.get()-1)
160
161 @export
162 def delete_profile():
163 delete_profile_helper(user_address=ctx.caller)
164
165
166 @export
167 def force_delete_profile(user_address: str):
168 assert ctx.caller == owner.get(), 'Only the owner can call force_delete_profile'
169 delete_profile_helper(user_address=user_address)
170
171
172 @export
173 def update_profile(key: str, value: Any):
174 update_profile_helper(user_address=ctx.caller, key=key, value=value)
175
176
177 @export
178 def force_update_profile(user_address: str, key: str, value: Any):
179 assert ctx.caller == owner.get(), 'Only the owner can call force_update_profile'
180 update_profile_helper(user_address=user_address, key=key, value=value)
181
182
183 @export
184 def force_update_metadata(user_address: str, key: str, value: Any):
185 assert ctx.caller == owner.get(), 'Only the owner can call force_update_metadata'
186 metadata[user_address, key] = value
187
188
189 @export
190 def force_update_usernames(key: str, value: Any):
191 assert ctx.caller == owner.get(), 'Only the owner can call force_update_usernames'
192 usernames[key] = value
193
194
195 @export
196 def change_ownership(new_owner: str):
197 assert ctx.caller == owner.get(), 'Only the owner can change ownership!'
198
199 owner.set(new_owner)

Byte Code

e30000000000000000000000000d00000040000000738c010000650064006401640264038d035a01650064006401640464038d035a0265036401640564068d025a0465036401640764068d025a0564086409640a640b640c640d640e640f641064116412670b5a066413641484005a076508640183016439650965096509650965096509650965096509650964159c0a64166417840583015a0a650864018301650b64189c016419641a840483015a0c650864018301650b64189c01641b641c840483015a0d6509641d9c01641e641f84045a0e650964209c016421642284045a0f65096509651064239c036424642584045a11650964269c016427642884045a126508640183016429642a840083015a13650864018301650964269c01642b642c840483015a1465086401830165096510642d9c02642e642f840483015a1565086401830165096509651064239c0364306431840483015a1665086401830165096509651064239c0364326433840483015a1765086401830165096510642d9c0264346435840483015a18650864018301650964369c0164376438840483015a1964005300293a4eda18636f6e5f67616d6d615f7068695f70726f66696c655f7634da086d657461646174612903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da09757365726e616d6573da0b746f74616c5f7573657273290272040000007205000000da056f776e6572da08757365726e616d65da0c646973706c61795f6e616d65da0874656c656772616dda0774776974746572da09696e7374616772616dda0866616365626f6f6bda07646973636f7264da0b69636f6e5f626173653634da0869636f6e5f75726cda0e7075626c69635f7273615f6b6579da056672656e73630000000000000000000000000200000043000000731a00000074006a0164018301010074026a0174036a04830101006400530029024ee9000000002905da0d5f5f746f74616c5f7573657273da03736574da075f5f6f776e6572da03637478da0663616c6c6572a900721a000000721a000000da00da045f5f5f5f0d000000730400000000010a01721c000000290a7209000000720a000000720b000000720c000000720d000000720e000000720f000000721000000072110000007212000000630a000000000000000b000000040000004300000073d000000074006a017d0a74027c008301010074037c00190064006b08732a740464017c009b0064029d03830182017c0a74037c003c007c0074057c0a640366023c007c0170447c0074057c0a640466023c007c0274057c0a640566023c007c0374057c0a640666023c007c0474057c0a640766023c007c0574057c0a640866023c007c0674057c0a640966023c007c0774057c0a640a66023c007c0874057c0a640b66023c00670074057c0a640c66023c0074067c0a7c09640d8d02010074076a0874076a098300640e17008301010064005300290f4e7a09557365726e616d65207a1020616c7265616479206578697374732e7209000000720a000000720b000000720c000000720d000000720e000000720f0000007210000000721100000072130000002902da0c757365725f61646472657373da036b6579e901000000290a72180000007219000000da135f5f76616c69646174655f757365726e616d65da0b5f5f757365726e616d6573da0e417373657274696f6e4572726f72da0a5f5f6d65746164617461da175f5f7570646174655f7075626c69635f7273615f6b657972150000007216000000da03676574290b7209000000720a000000720b000000720c000000720d000000720e000000720f000000721000000072110000007212000000721d000000721a000000721a000000721b000000da0e6372656174655f70726f66696c651200000073220000000005060108010601160108010c0110010c010c010c010c010c010c010c010c010c0172260000002901721300000063010000000000000005000000040000004300000073a000000074006a017d0174027c0164016602190064006b09731e740364028301820174027c01640366021900702c67007d0278607c0044005d587d0374047c0319007d047c0464006b08724c7c037d0474027c0464016602190064006b09736a74037c049b0064049d02830182017c047c016b03737a74036405830182017c047c026b0772347c026a057c0483010100713457007c0274027c01640366023c006400530029064e72090000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e72130000007a1920646f6573206e6f74206861766520612070726f66696c652e7a21596f752063616e6e6f742061646420796f757273656c662061732061206672656e290672180000007219000000722300000072220000007221000000da06617070656e6429057213000000721d000000da0d63757272656e745f6672656e73da046672656eda0c6672656e5f61646472657373721a000000721a000000721b000000da096164645f6672656e732a000000731c000000000206010a010e0110010a010801080104010a011401100108010e01722b000000630100000000000000050000000400000043000000737200000074006a017d0174027c0164016602190064006b09731e740364028301820174027c01640366021900702c67007d0278327c0044005d2a7d0374047c0319007d047c0464006b08724c7c037d047c047c026b0672347c026a057c0483010100713457007c0274027c01640366023c006400530029044e72090000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e7213000000290672180000007219000000722300000072220000007221000000da0672656d6f766529057213000000721d00000072280000007229000000722a000000721a000000721a000000721b000000da0c72656d6f76655f6672656e733c0000007316000000000206010a010e0110010a0108010801040108010e01722d0000002901720900000063010000000000000001000000030000004300000073800000007c0064006b09721474007c00830164016b04731c740164028301820174027c0074038302732e740164038301820174007c00830164046b017342740164058301820174046406640784007c00440083018301735c74016408830182017c0064011900640d6b0772747c00640e1900640f6b07737c7401640c830182016400530029104e72140000007a20557365726e616d652063616e6e6f74206265206e756c6c206f7220656d7074797a1a557365726e616d65206d757374206265206120737472696e672ee9100000007a2e557365726e616d65732063616e6e6f74206265206c6f6e676572207468616e20313620636861726163746572732e630100000000000000020000000500000053000000731c00000067007c005d147d017c016a00830070167c0164026b069102710453002903da015ffa012d2902722f00000072300000002901da076973616c6e756d2902da022e30da0163721a000000721a000000721b000000fa0a3c6c697374636f6d703e51000000730200000006007a275f5f76616c69646174655f757365726e616d652e3c6c6f63616c733e2e3c6c697374636f6d703e7a61557365726e616d652068617320696e76616c696420636861726163746572732e204561636820636861726163746572206d75737420626520616c7068616e756d657269632c20612068797068656e2c206f7220616e20756e64657273636f72652e7230000000722f000000721f0000007a3a557365726e616d65732063616e6e6f74207374617274206f7220656e64207769746820612068797068656e206f7220756e64657273636f72652e29027230000000722f000000e9ffffffff29027230000000722f0000002905da036c656e7222000000da0a6973696e7374616e6365da03737472da03616c6c29017209000000721a000000721a000000721b00000072200000004b000000731200000000010e010e01120106010e01140106011a0172200000002901721e00000063020000000000000002000000040000004300000073400000007c0164006b087216640074007c00640166023c006e2674017c016a0264028301830164036b02733074036404830182017c0174007c00640166023c006400530029054e7212000000fa017ce9020000007a12496e76616c6964206b657920666f726d6174290472230000007236000000da0573706c697472220000002902721d000000721e000000721a000000721a000000721b0000007224000000570000007308000000000108010e021a0172240000002903721d000000721e000000da0576616c756563030000000000000005000000040000004300000073e60000007c0164016b037310740064028301820174017c0064036602190064006b09732874006404830182017c0164036b02728a74027c028301010074017c006403660219007d037c0364006b097354740064058301820174037c02190064006b087370740064067c029b0064079d03830182017c0264006b09738074006408830182017c0074037c023c006e4c7c0164096b0272a074047c007c02640a8d0201006e367c0174056b0772d674017c0064016602190070b667007d047c017c046b0772d67c046a067c01830101007c0474017c00640166023c007c0274017c007c0166023c0064005300290b4eda0c65787472615f6669656c64737a30596f752063616e6e6f74207570646174652065787472615f6669656c647320776974682074686973206d6574686f642e72090000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e7a1954686973207573657220646f6573206e6f742065786973742e7a09557365726e616d65207a1020616c7265616479206578697374732e7a434e6f20757365726e616d652070726f76696465642e2043616c6c2064656c6574655f70726f66696c6520746f2072656d6f7665206120757365722070726f66696c652e72120000002902721d000000721e000000290772220000007223000000722000000072210000007224000000da1744454641554c545f4d455441444154415f4649454c445372270000002905721d000000721e000000723d0000007209000000723e000000721a000000721a000000721b000000da175f5f7570646174655f70726f66696c655f68656c7065725f0000007324000000000110010a010e01080108010c0110011c0110010a0108010e010801100108010a010c0172400000002901721d00000063010000000000000004000000050000004300000073e800000074007c006401660219007d017c0164006b09731c7401640283018201640074027c013c00640074007c00640166023c00640074007c00640366023c00640074007c00640466023c00640074007c00640566023c00640074007c00640666023c00640074007c00640766023c00640074007c00640866023c00640074007c00640966023c00640074007c00640a66023c00640074007c00640b66023c0074037c006400640c8d02010074007c00640d6602190070b667007d0278187c0244005d107d03640074007c007c0366023c0071be570074046a0574046a068300640e18008301010064005300290f4e72090000007a1954686973207573657220646f6573206e6f742065786973742e720a000000720b000000720c000000720d000000720e000000720f0000007210000000721100000072130000002902721d000000721e000000723e000000721f000000290772230000007222000000722100000072240000007215000000721600000072250000002904721d0000007209000000723e000000da056669656c64721a000000721a000000721b000000da175f5f64656c6574655f70726f66696c655f68656c70657274000000732400000000010c01100108010c010c010c010c010c010c010c010c010c010c010c0110010a01100172420000006300000000000000000000000003000000430000007310000000740074016a0264018d0101006400530029024e2901721d0000002903724200000072180000007219000000721a000000721a000000721a000000721b000000da0e64656c6574655f70726f66696c6589000000730200000000027243000000630100000000000000010000000300000043000000732400000074006a0174026a0383006b027316740464018301820174057c0064028d0101006400530029034e7a2c4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f64656c6574655f70726f66696c652901721d00000029067218000000721900000072170000007225000000722200000072420000002901721d000000721a000000721a000000721b000000da14666f7263655f64656c6574655f70726f66696c658e000000730600000000021001060172440000002902721e000000723d0000006302000000000000000200000005000000430000007314000000740074016a027c007c0164018d0301006400530029024e2903721d000000721e000000723d00000029037240000000721800000072190000002902721e000000723d000000721a000000721a000000721b000000da0e7570646174655f70726f66696c6595000000730200000000027245000000630300000000000000030000000500000043000000732800000074006a0174026a0383006b027316740464018301820174057c007c017c0264028d0301006400530029034e7a2c4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f70726f66696c652903721d000000721e000000723d00000029067218000000721900000072170000007225000000722200000072400000002903721d000000721e000000723d000000721a000000721a000000721b000000da14666f7263655f7570646174655f70726f66696c659a00000073060000000002100106017246000000630300000000000000030000000400000043000000732600000074006a0174026a0383006b02731674046401830182017c0274057c007c0166023c006400530029024e7a2d4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f6d6574616461746129067218000000721900000072170000007225000000722200000072230000002903721d000000721e000000723d000000721a000000721a000000721b000000da15666f7263655f7570646174655f6d65746164617461a100000073060000000002100106017247000000630200000000000000020000000300000043000000732200000074006a0174026a0383006b02731674046401830182017c0174057c003c006400530029024e7a2e4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f757365726e616d657329067218000000721900000072170000007225000000722200000072210000002902721e000000723d000000721a000000721a000000721b000000da16666f7263655f7570646174655f757365726e616d6573a8000000730600000000021001060172480000002901da096e65775f6f776e6572630100000000000000010000000200000043000000732400000074006a0174026a0383006b027316740464018301820174026a057c00830101006400530029024e7a244f6e6c7920746865206f776e65722063616e206368616e6765206f776e65727368697021290672180000007219000000721700000072250000007222000000721600000029017249000000721a000000721a000000721b000000da106368616e67655f6f776e657273686970af000000730400000000021601724a00000029084e4e4e4e4e4e4e4e291ada044861736872230000007221000000da085661726961626c6572150000007217000000723f000000721c000000da085f5f6578706f727472380000007226000000da046c697374722b000000722d00000072200000007224000000da03416e7972400000007242000000724300000072440000007245000000724600000072470000007248000000724a000000721a000000721a000000721a000000721b000000da083c6d6f64756c653e0100000073480000000601080106010801040108010c0106010a010a03080506010001000100012414060110110601100e0e0c0e0812150e15100506011006060112040601140606011406060112060601