@@ -192,7 +192,7 @@ defmodule Ethers.Utils do
192192 <<192, 42, 170, 57, 178, 35, 254, 141, 10, 14, 92, 79, 39, 234, 217, 8, 60, 117, 108, 194>>
193193 """
194194 @ spec prepare_arg ( term ( ) , ABI.FunctionSelector . type ( ) ) :: term ( )
195- def prepare_arg ( "0x" <> _ = argument , :address ) , do: hex_decode! ( argument )
195+ def prepare_arg ( << "0x" , address :: binary - 40 >> , :address ) , do: hex_decode! ( address )
196196 def prepare_arg ( arguments , { :array , type } ) , do: Enum . map ( arguments , & prepare_arg ( & 1 , type ) )
197197 def prepare_arg ( arguments , { :array , type , _ } ) , do: Enum . map ( arguments , & prepare_arg ( & 1 , type ) )
198198
@@ -212,14 +212,17 @@ defmodule Ethers.Utils do
212212 ## Examples
213213 iex> Ethers.Utils.human_arg(<<192, 42, 170, 57, 178, 35, 254, 141, 10, 14, 92, 79, 39,
214214 ...> 234, 217, 8, 60, 117, 108, 194>>, :address)
215- "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 "
215+ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 "
216216
217217 iex> Ethers.Utils.human_arg("0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", :address)
218- "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 "
218+ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 "
219219 """
220220 @ spec human_arg ( term ( ) , ABI.FunctionSelector . type ( ) ) :: term ( )
221- def human_arg ( "0x" <> _ = argument , :address ) , do: argument
222- def human_arg ( argument , :address ) , do: hex_encode ( argument )
221+ def human_arg ( << "0x" , _ :: binary - 40 >> = address , :address ) , do: to_checksum_address ( address )
222+ def human_arg ( << address :: binary - 20 >> , :address ) , do: to_checksum_address ( address )
223+
224+ def human_arg ( invalid , :address ) ,
225+ do: raise ( ArgumentError , "Invalid address: #{ inspect ( invalid ) } " )
223226
224227 def human_arg ( arguments , { :array , type } ) , do: Enum . map ( arguments , & human_arg ( & 1 , type ) )
225228 def human_arg ( arguments , { :array , type , _ } ) , do: Enum . map ( arguments , & human_arg ( & 1 , type ) )
@@ -255,12 +258,15 @@ defmodule Ethers.Utils do
255258 iex> Ethers.Utils.to_checksum_address("0XDE709F2102306220921060314715629080e2Fb77", 30)
256259 "0xDe709F2102306220921060314715629080e2FB77"
257260 """
258- @ spec to_checksum_address ( Ethers.Types . t_address ( ) , pos_integer ( ) | nil ) ::
261+ @ spec to_checksum_address ( Ethers.Types . t_address ( ) | << _ :: 320 >> , pos_integer ( ) | nil ) ::
259262 Ethers.Types . t_address ( )
260263 def to_checksum_address ( address , chain_id \\ nil )
261264
262- def to_checksum_address ( "0x" <> address , chain_id ) , do: to_checksum_address ( address , chain_id )
263- def to_checksum_address ( "0X" <> address , chain_id ) , do: to_checksum_address ( address , chain_id )
265+ def to_checksum_address ( << "0x" , address :: binary - 40 >> , chain_id ) ,
266+ do: to_checksum_address ( address , chain_id )
267+
268+ def to_checksum_address ( << "0X" , address :: binary - 40 >> , chain_id ) ,
269+ do: to_checksum_address ( address , chain_id )
264270
265271 def to_checksum_address ( << address_bin :: binary - 20 >> , chain_id ) ,
266272 do: hex_encode ( address_bin , false ) |> to_checksum_address ( chain_id )
@@ -341,20 +347,20 @@ defmodule Ethers.Utils do
341347 public_key_to_address ( public_key , use_checksum_address )
342348 end
343349
344- unless Code . ensure_loaded? ( Ethers . secp256k1_module ( ) ) do
345- def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed , _use_checksum_address )
350+ if Code . ensure_loaded? ( Ethers . secp256k1_module ( ) ) do
351+ def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed , use_checksum_address )
352+ when pre in [ 2 , 3 ] do
353+ case Ethers . secp256k1_module ( ) . public_key_decompress ( compressed ) do
354+ { :ok , public_key } -> public_key_to_address ( public_key , use_checksum_address )
355+ error -> raise ArgumentError , "Invalid compressed public key #{ inspect ( error ) } "
356+ end
357+ end
358+ else
359+ def public_key_to_address ( << pre , _ :: binary - 32 >> = _compressed , _use_checksum_address )
346360 when pre in [ 2 , 3 ] ,
347361 do: raise ( "secp256k1 module not loaded" )
348362 end
349363
350- def public_key_to_address ( << pre , _ :: binary - 32 >> = compressed , use_checksum_address )
351- when pre in [ 2 , 3 ] do
352- case Ethers . secp256k1_module ( ) . public_key_decompress ( compressed ) do
353- { :ok , public_key } -> public_key_to_address ( public_key , use_checksum_address )
354- error -> raise ArgumentError , "Invalid compressed public key #{ inspect ( error ) } "
355- end
356- end
357-
358364 def public_key_to_address ( "0x" <> _ = key , use_checksum_address ) do
359365 key
360366 |> hex_decode! ( )
0 commit comments