Contract con_gamma_phi_profile_impl_v1
Creator | ae9cfa894495930b8d2f1707ab936325b5c848ace677bb8ba41dfe7dcdb3e3e6 |
Creation Hash | d1189ec06b41128a49ac17b47de025a13803687055f4fac65c93d9974bcb7e7a |
Created On | 848 days ago - 12/29/2021, 8:38:55 PM UTC+0 |
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