@@ -68,9 +68,11 @@ def bytearray_to_bytestr(value):
68
68
def mk_contract_address (sender , nonce ):
69
69
return sha3 (rlp .encode ([normalize_address (sender ), nonce ]))[12 :]
70
70
71
+
71
72
def mk_metropolis_contract_address (sender , initcode ):
72
73
return sha3 (normalize_address (sender ) + initcode )[12 :]
73
74
75
+
74
76
def safe_ord (value ):
75
77
if isinstance (value , int ):
76
78
return value
@@ -115,6 +117,7 @@ def int_to_32bytearray(i):
115
117
116
118
sha3_count = [0 ]
117
119
120
+
118
121
def sha3 (seed ):
119
122
sha3_count [0 ] += 1
120
123
return sha3_256 (to_string (seed ))
@@ -136,25 +139,33 @@ def add_checksum(x):
136
139
return x
137
140
return x + sha3 (x )[:4 ]
138
141
142
+
139
143
def add_cool_checksum (addr ):
140
144
addr = normalize_address (addr )
141
145
addr_hex = encode_hex (addr )
142
146
143
147
o = ''
144
148
h = encode_hex (sha3 (addr_hex ))
149
+ if not isinstance (addr_hex , str ):
150
+ # py3 bytes sequence
151
+ addr_hex = list (chr (c ) for c in addr_hex )
152
+ h = list (chr (c ) for c in h )
153
+
145
154
for i , c in enumerate (addr_hex ):
146
155
if c in '0123456789' :
147
156
o += c
148
157
else :
149
158
o += c .lower () if h [i ] in '01234567' else c .upper ()
150
- return '0x' + o
159
+ return '0x' + o
160
+
151
161
152
162
def check_and_strip_checksum (x ):
153
163
if len (x ) in (40 , 48 ):
154
164
x = decode_hex (x )
155
165
assert len (x ) == 24 and sha3 (x [:20 ])[:4 ] == x [- 4 :]
156
166
return x [:20 ]
157
167
168
+
158
169
def check_and_strip_cool_checksum (addr ):
159
170
assert add_cool_checksum (addr .lower ()) == addr
160
171
return normalize_address (addr )
0 commit comments