Contract con_gamma_phi_profile_v2
Creator | ae9cfa894495930b8d2f1707ab936325b5c848ace677bb8ba41dfe7dcdb3e3e6 |
Creation Hash | 11d9fbee3041d7c4e9088aa6f09fc333c5a0107dd1ed1b51320d4ceb32ad7f37 |
Created On | 886 days ago - 12/11/2021, 5:19:12 PM UTC+0 |
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