@@ -246,6 +246,9 @@ defmodule Ethers.Utils do
246
246
def to_checksum_address ( "0x" <> address ) , do: to_checksum_address ( address )
247
247
def to_checksum_address ( "0X" <> address ) , do: to_checksum_address ( address )
248
248
249
+ def to_checksum_address ( << address_bin :: binary - 20 >> ) ,
250
+ do: hex_encode ( address_bin ) |> to_checksum_address ( )
251
+
249
252
def to_checksum_address ( address ) do
250
253
address = String . downcase ( address )
251
254
@@ -295,33 +298,43 @@ defmodule Ethers.Utils do
295
298
"0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"
296
299
"""
297
300
@ spec public_key_to_address ( Ethers.Types . t_pub_key ( ) ) :: Ethers.Types . t_address ( )
298
- def public_key_to_address ( << public_key :: binary - 64 >> ) do
299
- Ethers . keccak_module ( ) . hash_256 ( public_key )
300
- |> :binary . part ( 32 - 20 , 20 )
301
- |> hex_encode ( )
302
- |> to_checksum_address ( )
301
+ def public_key_to_address ( public_key , use_checksum_address \\ true )
302
+
303
+ def public_key_to_address ( << public_key :: binary - 64 >> , use_checksum_address ) do
304
+ address =
305
+ Ethers . keccak_module ( ) . hash_256 ( public_key )
306
+ |> :binary . part ( 32 - 20 , 20 )
307
+ |> hex_encode ( )
308
+
309
+ if use_checksum_address do
310
+ to_checksum_address ( address )
311
+ else
312
+ address
313
+ end
303
314
end
304
315
305
- def public_key_to_address ( << 4 , public_key :: binary - 64 >> ) do
306
- public_key_to_address ( public_key )
316
+ def public_key_to_address ( << 4 , public_key :: binary - 64 >> , use_checksum_address ) do
317
+ public_key_to_address ( public_key , use_checksum_address )
307
318
end
308
319
309
320
unless Code . ensure_loaded? ( Ethers . secp256k1_module ( ) ) do
310
- def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed ) when pre in [ 2 , 3 ] ,
311
- do: raise ( "secp256k1 module not loaded" )
321
+ def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed , _use_checksum_address )
322
+ when pre in [ 2 , 3 ] ,
323
+ do: raise ( "secp256k1 module not loaded" )
312
324
end
313
325
314
- def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed ) when pre in [ 2 , 3 ] do
326
+ def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed , use_checksum_address )
327
+ when pre in [ 2 , 3 ] do
315
328
case Ethers . secp256k1_module ( ) . public_key_decompress ( compressed ) do
316
- { :ok , public_key } -> public_key_to_address ( public_key )
329
+ { :ok , public_key } -> public_key_to_address ( public_key , use_checksum_address )
317
330
error -> raise ArgumentError , "Invalid compressed public key #{ inspect ( error ) } "
318
331
end
319
332
end
320
333
321
- def public_key_to_address ( "0x" <> _ = key ) do
334
+ def public_key_to_address ( "0x" <> _ = key , use_checksum_address ) do
322
335
key
323
336
|> hex_decode! ( )
324
- |> public_key_to_address ( )
337
+ |> public_key_to_address ( use_checksum_address )
325
338
end
326
339
327
340
@ doc """
0 commit comments