-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathIGN.v.py
More file actions
94 lines (79 loc) · 2.91 KB
/
IGN.v.py
File metadata and controls
94 lines (79 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# HEADS UP! I haven't been audited, you should be very careful using me!
Register: __log__({ign: bytes <= 32, addr: address})
Update: __log__({ign: bytes <= 32, oldAddr: address, newAddr: address})
owner: address
# -------------------------------------------
# ---------- State Variables ----------------
# -------------------------------------------
# Represents a profile for the IGN
profiles: public({
ign: bytes <= 32,
age: timestamp
}[address])
# Represents the IGN associated to an address
names: public((bytes <= 32)[address])
# Represents the address associated to an IGN
addresses: public(address[bytes <= 32])
# -------------------------------------------
# -------------- Internal -------------------
# -------------------------------------------
@public
def __init__ ():
self.owner = msg.sender
@private
def _tag (addr: address, ign: bytes <= 26) -> bytes <= 32:
# Creates a tagged IGN for example Matt#ef25d
bytesAddr = concat('', sha3(as_bytes32(addr)))
addrHash = slice(bytesAddr, start=0, len=5)
return concat(ign, "#", addrHash)
# -------------------------------------------
# -------------- Getters --------------------
# -------------------------------------------
@public
def getAddress (ign: bytes <= 32) -> address:
# Return the address of an IGN
return self.addresses[ign]
@public
def getProfile (addr: address) -> (bytes <= 32, timestamp):
# Return the profile of an address
return (
self.profiles[addr].ign,
self.profiles[addr].age
)
# -------------------------------------------
# -------------- External -------------------
# -------------------------------------------
@public
def register (ign: bytes <= 26):
# If address is not already registered to an IGN register it
assert len(self.names[msg.sender]) == 0
# Tag the username to mitigate duplicate usernames
taggedName = self._tag(msg.sender, ign)
# Ensure this name tag combination is not already registered
assert as_bytes32(self.addresses[taggedName]) == as_bytes32(0)
# Set username assignment
self.names[msg.sender] = taggedName
self.addresses[taggedName] = msg.sender
self.profiles[msg.sender] = {
ign: ign,
age: block.timestamp
}
log.Register(taggedName, msg.sender)
@public
def changeAddress (newAddress: address):
# Expect sender to have an IGN registered
assert len(self.names[msg.sender]) > 0
# Expect new address not to be registered already
assert len(self.names[msg.sender]) == 0
# Get current IGN
ign = self.names[msg.sender]
# Change address associated to IGN
self.addresses[ign] = newAddress
# Change name associated to address
self.names[newAddress] = ign
# Transfer profile
self.profiles[newAddress] = self.profiles[msg.sender]
# Remove old address registration
self.names[msg.sender] = None
self.profiles[msg.sender] = None
log.Update(ign, msg.sender, newAddress)