module Platon::Utils

Public Instance Methods

base256_to_int(str) click to toggle source
# File lib/platon/utils.rb, line 26
def base256_to_int(str)
  RLP::Sedes.big_endian_int.deserialize str.sub(/\A(\x00)+/, '')
end
bech32_to_bin(bech32Address) click to toggle source

bech32 address to bin

# File lib/platon/utils.rb, line 66
def bech32_to_bin(bech32Address)
  address = decode_bech32_address(bech32Address)
  hex_to_bin address
end
bin_to_hex(string) click to toggle source
# File lib/platon/utils.rb, line 18
def bin_to_hex(string)
  RLP::Utils.encode_hex string
end
bin_to_prefixed_hex(binary) click to toggle source
# File lib/platon/utils.rb, line 50
def bin_to_prefixed_hex(binary)
  prefix_hex bin_to_hex(binary)
end
decode_bech32_address(bech32Address) click to toggle source

Resolve the bech32 address

@method decode_bech32_address @param {String} bech32Address @return {String} formatted address eg: Platon::Utils.decode_bech32_address(“atp1kh9dktnszj04zn6d8ae9edhqfmt4awx94n6h4m”)

# File lib/platon/utils.rb, line 85
def decode_bech32_address(bech32Address)
  if is_bech32_address?(bech32Address) ## is_bech32_address? ## TODO
    
    segwit_addr = SegwitAddr.new(bech32Address)
    address = segwit_addr.to_script_pubkey
    if address
      return "0x" + address
    end
  end
  return ''
end
format_address(address) click to toggle source
# File lib/platon/utils.rb, line 158
def format_address(address)
  Address.new(address).checksummed
end
hash160(x) click to toggle source
# File lib/platon/utils.rb, line 134
def hash160(x)
  ripemd160 sha256(x)
end
hex_to_bin(string) click to toggle source
# File lib/platon/utils.rb, line 22
def hex_to_bin(string)
  RLP::Utils.decode_hex remove_hex_prefix(string)
end
int_to_base256(int) click to toggle source
# File lib/platon/utils.rb, line 30
def int_to_base256(int)
  RLP::Sedes.big_endian_int.serialize int
end
is_bech32_address?(bech32Address) click to toggle source
# File lib/platon/utils.rb, line 71
def is_bech32_address?(bech32Address)
  return false if bech32Address.length != 42
  hrp,data,spec = Bech32.decode bech32Address
  return false if data == nil
  return true
end
keccak256(x) click to toggle source
# File lib/platon/utils.rb, line 118
def keccak256(x)
  Digest::SHA3.new(256).digest(x)
end
keccak256_rlp(x) click to toggle source
# File lib/platon/utils.rb, line 126
def keccak256_rlp(x)
  keccak256 RLP.encode(x)
end
keccak512(x) click to toggle source
# File lib/platon/utils.rb, line 122
def keccak512(x)
  Digest::SHA3.new(512).digest(x)
end
normalize_address(address) click to toggle source
# File lib/platon/utils.rb, line 6
def normalize_address(address)
  if address.nil? || address == ''
    ''
  elsif address.size == 40
    hex_to_bin address
  elsif address.size == 42 && address[0..1] == '0x' 
    hex_to_bin address[2..-1]
  else
    address
  end
end
prefix_hex(hex) click to toggle source
# File lib/platon/utils.rb, line 42
def prefix_hex(hex)
  hex.match(/\A0x/) ? hex : "0x#{hex}"
end
prefix_message(message) click to toggle source
# File lib/platon/utils.rb, line 54
def prefix_message(message)
  "\x19Platon Signed Message:\n#{message.length}#{message}"
  # "\x19Ethereum Signed Message:\n#{message.length}#{message}"
end
public_key_to_address(hex) click to toggle source
# File lib/platon/utils.rb, line 59
def public_key_to_address(hex)
  bytes = hex_to_bin(hex)
  address_bytes = Utils.keccak256(bytes[1..-1])[-20..-1]
  format_address bin_to_prefixed_hex(address_bytes)
end
remove_hex_prefix(s) click to toggle source
# File lib/platon/utils.rb, line 46
def remove_hex_prefix(s)
  s[0,2] == '0x' ? s[2..-1] : s 
end
ripemd160(x) click to toggle source
# File lib/platon/utils.rb, line 130
def ripemd160(x)
  Digest::RMD160.digest x
end
sha256(x) click to toggle source
# File lib/platon/utils.rb, line 114
def sha256(x)
  Digest::SHA256.digest x
end
to_bech32_address(hrp,address) click to toggle source

Platon::Utils.to_bech32_address(“atp”,“0xb5cadb2e70149f514f4d3f725cb6e04ed75eb8c5”)

# File lib/platon/utils.rb, line 105
def to_bech32_address(hrp,address)
  if true ## isAddress
    segwit_addr = SegwitAddr.new
    segwit_addr.hrp = hrp
    segwit_addr.script_pubkey = remove_hex_prefix(address)  ## remove 0x
    segwit_addr.addr
  end
end
v_r_s_for(signature) click to toggle source
# File lib/platon/utils.rb, line 34
def v_r_s_for(signature)
  [
    signature[0].bytes[0],
    Utils.base256_to_int(signature[1..32]),
    Utils.base256_to_int(signature[33..65]),
  ]
end
valid_address?(address) click to toggle source
# File lib/platon/utils.rb, line 154
def valid_address?(address)
  Address.new(address).valid?
end
zpad(x, l) click to toggle source
# File lib/platon/utils.rb, line 138
def zpad(x, l)
  lpad x, BYTE_ZERO, l
end
zpad_hex(s, l=32) click to toggle source
# File lib/platon/utils.rb, line 150
def zpad_hex(s, l=32)
  zpad decode_hex(s), l
end
zpad_int(n, l=32) click to toggle source
# File lib/platon/utils.rb, line 146
def zpad_int(n, l=32)
  zpad encode_int(n), l
end
zunpad(x) click to toggle source
# File lib/platon/utils.rb, line 142
def zunpad(x)
  x.sub(/\A\x00+/, '')
end

Private Instance Methods

encode_int(n) click to toggle source
# File lib/platon/utils.rb, line 171
def encode_int(n)
  unless n.is_a?(Integer) && n >= 0 && n <= UINT_MAX
    raise ArgumentError, "Integer invalid or out of range: #{n}"
  end

  int_to_base256 n
end
lpad(x, symbol, l) click to toggle source
# File lib/platon/utils.rb, line 166
def lpad(x, symbol, l)
  return x if x.size >= l
  symbol * (l - x.size) + x
end