Contract con_gamma_phi_profile_v2


Contract Code


  
1 # con_gamma_phi_profile_v2
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 parts = key.split('|')
111 assert len(key) != 2, 'Invalid key format'
112 metadata[user_address, 'public_rsa_key'] = [int(parts[0]), int(parts[1])]
113
114
115 def update_profile_helper(user_address: str, key: str, value: Any):
116 assert key != 'extra_fields', 'You cannot update extra_fields with this method.'
117 assert metadata[user_address, 'username'] is not None, 'You do not have a profile. Please create one first.'
118
119 if key == 'username':
120 validate_username(value)
121
122 username = metadata[user_address, 'username']
123 assert username is not None, 'This user does not exist.'
124 assert usernames[value] is None, f'Username {value} already exists.'
125 assert value is not None, 'No username provided. Call delete_profile to remove a user profile.'
126
127 usernames[value] = user_address
128
129 elif key == 'public_rsa_key':
130 update_public_rsa_key(user_address=user_address, key=value)
131
132 elif key not in DEFAULT_METADATA_FIELDS:
133 extra_fields = metadata[user_address, 'extra_fields'] or []
134 if key not in extra_fields:
135 extra_fields.append(key)
136 metadata[user_address, 'extra_fields'] = extra_fields
137
138 metadata[user_address, key] = value
139
140
141 def delete_profile_helper(user_address: str):
142 username = metadata[user_address, 'username']
143 assert username is not None, 'This user does not exist.'
144 usernames[username] = None
145 metadata[user_address, 'username'] = None
146 metadata[user_address, 'display_name'] = None
147 metadata[user_address, 'telegram'] = None
148 metadata[user_address, 'twitter'] = None
149 metadata[user_address, 'instagram'] = None
150 metadata[user_address, 'facebook'] = None
151 metadata[user_address, 'discord'] = None
152 metadata[user_address, 'icon_base64'] = None
153 metadata[user_address, 'icon_url'] = None
154 metadata[user_address, 'frens'] = None
155 update_public_rsa_key(user_address=user_address, key=None)
156 extra_fields = metadata[user_address, 'extra_fields'] or []
157 for field in extra_fields:
158 metadata[user_address, field] = None
159 # Subtract from total user count
160 total_users.set(total_users.get()-1)
161
162 @export
163 def delete_profile():
164 delete_profile_helper(user_address=ctx.caller)
165
166
167 @export
168 def force_delete_profile(user_address: str):
169 assert ctx.caller == owner.get(), 'Only the owner can call force_delete_profile'
170 delete_profile_helper(user_address=user_address)
171
172
173 @export
174 def update_profile(key: str, value: Any):
175 update_profile_helper(user_address=ctx.caller, key=key, value=value)
176
177
178 @export
179 def force_update_profile(user_address: str, key: str, value: Any):
180 assert ctx.caller == owner.get(), 'Only the owner can call force_update_profile'
181 update_profile_helper(user_address=user_address, key=key, value=value)
182
183 @export
184 def change_ownership(new_owner: str):
185 assert ctx.caller == owner.get(), 'Only the owner can change ownership!'
186
187 owner.set(new_owner)

Byte Code

e30000000000000000000000000d00000040000000735a010000650064006401640264038d035a01650064006401640464038d035a0265036401640564068d025a0465036401640764068d025a0564086409640a640b640c640d640e640f641064116412670b5a066413641484005a076508640183016435650965096509650965096509650965096509650964159c0a64166417840583015a0a650864018301650b64189c016419641a840483015a0c650864018301650b64189c01641b641c840483015a0d6509641d9c01641e641f84045a0e650964209c016421642284045a0f65096509651064239c036424642584045a11650964269c016427642884045a126508640183016429642a840083015a13650864018301650964269c01642b642c840483015a1465086401830165096510642d9c02642e642f840483015a1565086401830165096509651064239c0364306431840483015a16650864018301650964329c0164336434840483015a176400530029364eda18636f6e5f67616d6d615f7068695f70726f66696c655f7632da086d657461646174612903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da09757365726e616d6573da0b746f74616c5f7573657273290272040000007205000000da056f776e6572da08757365726e616d65da0c646973706c61795f6e616d65da0874656c656772616dda0774776974746572da09696e7374616772616dda0866616365626f6f6bda07646973636f7264da0b69636f6e5f626173653634da0869636f6e5f75726cda0e7075626c69635f7273615f6b6579da056672656e73630000000000000000000000000200000043000000731a00000074006a0164018301010074026a0174036a04830101006400530029024ee9000000002905da0d5f5f746f74616c5f7573657273da03736574da075f5f6f776e6572da03637478da0663616c6c6572a900721a000000721a000000da00da045f5f5f5f0d000000730400000000010a01721c000000290a7209000000720a000000720b000000720c000000720d000000720e000000720f000000721000000072110000007212000000630a000000000000000b000000040000004300000073d000000074006a017d0a74027c008301010074037c00190064006b08732a740464017c009b0064029d03830182017c0a74037c003c007c0074057c0a640366023c007c0170447c0074057c0a640466023c007c0274057c0a640566023c007c0374057c0a640666023c007c0474057c0a640766023c007c0574057c0a640866023c007c0674057c0a640966023c007c0774057c0a640a66023c007c0874057c0a640b66023c00670074057c0a640c66023c0074067c0a7c09640d8d02010074076a0874076a098300640e17008301010064005300290f4e7a09557365726e616d65207a1020616c7265616479206578697374732e7209000000720a000000720b000000720c000000720d000000720e000000720f0000007210000000721100000072130000002902da0c757365725f61646472657373da036b6579e901000000290a72180000007219000000da135f5f76616c69646174655f757365726e616d65da0b5f5f757365726e616d6573da0e417373657274696f6e4572726f72da0a5f5f6d65746164617461da175f5f7570646174655f7075626c69635f7273615f6b657972150000007216000000da03676574290b7209000000720a000000720b000000720c000000720d000000720e000000720f000000721000000072110000007212000000721d000000721a000000721a000000721b000000da0e6372656174655f70726f66696c651200000073220000000005060108010601160108010c0110010c010c010c010c010c010c010c010c010c0172260000002901721300000063010000000000000005000000040000004300000073a000000074006a017d0174027c0164016602190064006b09731e740364028301820174027c01640366021900702c67007d0278607c0044005d587d0374047c0319007d047c0464006b08724c7c037d0474027c0464016602190064006b09736a74037c049b0064049d02830182017c047c016b03737a74036405830182017c047c026b0772347c026a057c0483010100713457007c0274027c01640366023c006400530029064e72090000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e72130000007a1920646f6573206e6f74206861766520612070726f66696c652e7a21596f752063616e6e6f742061646420796f757273656c662061732061206672656e290672180000007219000000722300000072220000007221000000da06617070656e6429057213000000721d000000da0d63757272656e745f6672656e73da046672656eda0c6672656e5f61646472657373721a000000721a000000721b000000da096164645f6672656e732a000000731c000000000206010a010e0110010a010801080104010a011401100108010e01722b000000630100000000000000050000000400000043000000737200000074006a017d0174027c0164016602190064006b09731e740364028301820174027c01640366021900702c67007d0278327c0044005d2a7d0374047c0319007d047c0464006b08724c7c037d047c047c026b0672347c026a057c0483010100713457007c0274027c01640366023c006400530029044e72090000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e7213000000290672180000007219000000722300000072220000007221000000da0672656d6f766529057213000000721d00000072280000007229000000722a000000721a000000721a000000721b000000da0c72656d6f76655f6672656e733c0000007316000000000206010a010e0110010a0108010801040108010e01722d0000002901720900000063010000000000000001000000030000004300000073800000007c0064006b09721474007c00830164016b04731c740164028301820174027c0074038302732e740164038301820174007c00830164046b017342740164058301820174046406640784007c00440083018301735c74016408830182017c0064011900640d6b0772747c00640e1900640f6b07737c7401640c830182016400530029104e72140000007a20557365726e616d652063616e6e6f74206265206e756c6c206f7220656d7074797a1a557365726e616d65206d757374206265206120737472696e672ee9100000007a2e557365726e616d65732063616e6e6f74206265206c6f6e676572207468616e20313620636861726163746572732e630100000000000000020000000500000053000000731c00000067007c005d147d017c016a00830070167c0164026b069102710453002903da015ffa012d2902722f00000072300000002901da076973616c6e756d2902da022e30da0163721a000000721a000000721b000000fa0a3c6c697374636f6d703e51000000730200000006007a275f5f76616c69646174655f757365726e616d652e3c6c6f63616c733e2e3c6c697374636f6d703e7a61557365726e616d652068617320696e76616c696420636861726163746572732e204561636820636861726163746572206d75737420626520616c7068616e756d657269632c20612068797068656e2c206f7220616e20756e64657273636f72652e7230000000722f000000721f0000007a3a557365726e616d65732063616e6e6f74207374617274206f7220656e64207769746820612068797068656e206f7220756e64657273636f72652e29027230000000722f000000e9ffffffff29027230000000722f0000002905da036c656e7222000000da0a6973696e7374616e6365da03737472da03616c6c29017209000000721a000000721a000000721b00000072200000004b000000731200000000010e010e01120106010e01140106011a0172200000002901721e00000063020000000000000003000000040000004300000073580000007c0164006b087216640074007c00640166023c006e3e7c016a01640283017d0274027c01830164036b037334740364048301820174047c0264051900830174047c02640619008301670274007c00640166023c006400530029074e7212000000fa017ce9020000007a12496e76616c6964206b657920666f726d61747214000000721f00000029057223000000da0573706c697472360000007222000000da03696e742903721d000000721e000000da057061727473721a000000721a000000721b000000722400000057000000730c000000000108010e020a0114010c0172240000002903721d000000721e000000da0576616c756563030000000000000005000000040000004300000073e60000007c0164016b037310740064028301820174017c0064036602190064006b09732874006404830182017c0164036b02728a74027c028301010074017c006403660219007d037c0364006b097354740064058301820174037c02190064006b087370740064067c029b0064079d03830182017c0264006b09738074006408830182017c0074037c023c006e4c7c0164096b0272a074047c007c02640a8d0201006e367c0174056b0772d674017c0064016602190070b667007d047c017c046b0772d67c046a067c01830101007c0474017c00640166023c007c0274017c007c0166023c0064005300290b4eda0c65787472615f6669656c64737a30596f752063616e6e6f74207570646174652065787472615f6669656c647320776974682074686973206d6574686f642e72090000007a33596f7520646f206e6f74206861766520612070726f66696c652e20506c6561736520637265617465206f6e652066697273742e7a1954686973207573657220646f6573206e6f742065786973742e7a09557365726e616d65207a1020616c7265616479206578697374732e7a434e6f20757365726e616d652070726f76696465642e2043616c6c2064656c6574655f70726f66696c6520746f2072656d6f7665206120757365722070726f66696c652e72120000002902721d000000721e000000290772220000007223000000722000000072210000007224000000da1744454641554c545f4d455441444154415f4649454c445372270000002905721d000000721e000000723f00000072090000007240000000721a000000721a000000721b000000da175f5f7570646174655f70726f66696c655f68656c706572610000007324000000000110010a010e01080108010c0110011c0110010a0108010e010801100108010a010c0172420000002901721d00000063010000000000000004000000050000004300000073e800000074007c006401660219007d017c0164006b09731c7401640283018201640074027c013c00640074007c00640166023c00640074007c00640366023c00640074007c00640466023c00640074007c00640566023c00640074007c00640666023c00640074007c00640766023c00640074007c00640866023c00640074007c00640966023c00640074007c00640a66023c00640074007c00640b66023c0074037c006400640c8d02010074007c00640d6602190070b667007d0278187c0244005d107d03640074007c007c0366023c0071be570074046a0574046a068300640e18008301010064005300290f4e72090000007a1954686973207573657220646f6573206e6f742065786973742e720a000000720b000000720c000000720d000000720e000000720f0000007210000000721100000072130000002902721d000000721e0000007240000000721f000000290772230000007222000000722100000072240000007215000000721600000072250000002904721d00000072090000007240000000da056669656c64721a000000721a000000721b000000da175f5f64656c6574655f70726f66696c655f68656c70657276000000732400000000010c01100108010c010c010c010c010c010c010c010c010c010c010c0110010a01100172440000006300000000000000000000000003000000430000007310000000740074016a0264018d0101006400530029024e2901721d0000002903724400000072180000007219000000721a000000721a000000721a000000721b000000da0e64656c6574655f70726f66696c658b000000730200000000027245000000630100000000000000010000000300000043000000732400000074006a0174026a0383006b027316740464018301820174057c0064028d0101006400530029034e7a2c4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f64656c6574655f70726f66696c652901721d00000029067218000000721900000072170000007225000000722200000072440000002901721d000000721a000000721a000000721b000000da14666f7263655f64656c6574655f70726f66696c6590000000730600000000021001060172460000002902721e000000723f0000006302000000000000000200000005000000430000007314000000740074016a027c007c0164018d0301006400530029024e2903721d000000721e000000723f00000029037242000000721800000072190000002902721e000000723f000000721a000000721a000000721b000000da0e7570646174655f70726f66696c6597000000730200000000027247000000630300000000000000030000000500000043000000732800000074006a0174026a0383006b027316740464018301820174057c007c017c0264028d0301006400530029034e7a2c4f6e6c7920746865206f776e65722063616e2063616c6c20666f7263655f7570646174655f70726f66696c652903721d000000721e000000723f00000029067218000000721900000072170000007225000000722200000072420000002903721d000000721e000000723f000000721a000000721a000000721b000000da14666f7263655f7570646174655f70726f66696c659c000000730600000000021001060172480000002901da096e65775f6f776e6572630100000000000000010000000200000043000000732400000074006a0174026a0383006b027316740464018301820174026a057c00830101006400530029024e7a244f6e6c7920746865206f776e65722063616e206368616e6765206f776e65727368697021290672180000007219000000721700000072250000007222000000721600000029017249000000721a000000721a000000721b000000da106368616e67655f6f776e657273686970a3000000730400000000021601724a00000029084e4e4e4e4e4e4e4e2918da044861736872230000007221000000da085661726961626c65721500000072170000007241000000721c000000da085f5f6578706f727472380000007226000000da046c697374722b000000722d00000072200000007224000000da03416e79724200000072440000007245000000724600000072470000007248000000724a000000721a000000721a000000721a000000721b000000da083c6d6f64756c653e0100000073400000000601080106010801040108010c0106010a010a03080506010001000100012414060110110601100e0e0c0e0a12150e1510050601100606011204060114060601