class Web3::Hpb::Contract::ContractMethod
Attributes
abi[R]
constant[R]
input_types[R]
name[R]
output_types[R]
signature[R]
signature_hash[R]
Public Class Methods
new(abi)
click to toggle source
# File lib/web3/hpb/contract.rb, line 34 def initialize(abi) @abi = abi @name = abi['name'] @constant = !!abi['constant'] @input_types = abi['inputs'].map{|a| a['type']} @output_types = abi['outputs'].map{|a| a['type']} if abi['outputs'] @signature = Abi::Utils.function_signature(@name, @input_types) @signature_hash = Abi::Utils.signature_hash(@signature, (abi['type']=='event' ? 64 : 8)) end
Public Instance Methods
do_call(web3_rpc, contract_address, args)
click to toggle source
# File lib/web3/hpb/contract.rb, line 83 def do_call(web3_rpc, contract_address, args) data = '0x' + signature_hash + encode_hex(encode_abi(input_types, args)) puts data response = web3_rpc.request("hpb_call", [{ to: contract_address, data: data}, 'latest']) string_data = [remove_0x_head(response)].pack('H*') return nil if string_data.empty? result = decode_abi(output_types, string_data) result.length == 1 ? result.first : result end
parse_event_args(log)
click to toggle source
# File lib/web3/hpb/contract.rb, line 44 def parse_event_args(log) log_data = remove_0x_head(log.raw_data['data']) indexed_types = abi['inputs'].select{|a| a['indexed']}.collect{|a| a['type']} not_indexed_types = abi['inputs'].select{|a| !a['indexed']}.collect{|a| a['type']} indexed_args = log.indexed_args if indexed_args.size = indexed_types.size indexed_values = [indexed_types, indexed_args].transpose.collect{|arg| decode_type_data(arg.first, [arg.second].pack('H*')) } not_indexed_values = not_indexed_types.empty? ? [] : decode_abi(not_indexed_types, [log_data].pack('H*')) i = j = 0 abi['inputs'].collect{|collect| input['indexed'] ? (i+=1; indexed_values[i-1]) :(j+=1; not_indexed_values[j-1]) } elsif !indexed_args.empty? || !log_data.empty? all_types = abi['inputs'].collect{|a| a['type']} [all_types[0...indexed_args.size], indexed_args].transpose.collect{|arg| decode_typed_data( arg.first, [arg.second].pack('H*') ) } + decode_abi(all_types[indexed_args.size..-1], [log_data].pack('H*') ) else [] end end
parse_method_args(transaction)
click to toggle source
# File lib/web3/hpb/contract.rb, line 78 def parse_method_args(transaction) d = transaction.call_input_data (!d || d.empty?) ? [] : decode_abi(input_types, [d].pack('H*')) end