Class: Web3::Hpb::Contract::ContractMethod
- Inherits:
-
Object
- Object
- Web3::Hpb::Contract::ContractMethod
- Includes:
- Abi::AbiCoder, Abi::Utils, Utility
- Defined in:
- lib/web3/hpb/contract.rb
Constant Summary
Constants included from Abi::Constant
Abi::Constant::BYTE_EMPTY, Abi::Constant::BYTE_ONE, Abi::Constant::BYTE_ZERO, Abi::Constant::CONTRACT_CODE_SIZE_LIMIT, Abi::Constant::HASH_ZERO, Abi::Constant::INT_MAX, Abi::Constant::INT_MIN, Abi::Constant::PRIVKEY_ZERO, Abi::Constant::PRIVKEY_ZERO_HEX, Abi::Constant::PUBKEY_ZERO, Abi::Constant::TT160, Abi::Constant::TT256, Abi::Constant::TT32, Abi::Constant::TT40, Abi::Constant::TT64M1, Abi::Constant::UINT_MAX, Abi::Constant::UINT_MIN
Instance Attribute Summary collapse
-
#abi ⇒ Object
readonly
Returns the value of attribute abi.
-
#constant ⇒ Object
readonly
Returns the value of attribute constant.
-
#input_types ⇒ Object
readonly
Returns the value of attribute input_types.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#output_types ⇒ Object
readonly
Returns the value of attribute output_types.
-
#signature ⇒ Object
readonly
Returns the value of attribute signature.
-
#signature_hash ⇒ Object
readonly
Returns the value of attribute signature_hash.
Instance Method Summary collapse
- #do_call(web3_rpc, contract_address, args) ⇒ Object
-
#initialize(abi) ⇒ ContractMethod
constructor
A new instance of ContractMethod.
- #parse_event_args(log) ⇒ Object
- #parse_method_args(transaction) ⇒ Object
Methods included from Utility
#from_hex, #hex, #remove_0x_head, #wei_to_hpb
Methods included from Abi::Utils
#base58_check_to_bytes, #big_endian_to_int, #bytearray_to_int, #bytes_to_base58_check, #bytes_to_int_array, #ceil32, #coerce_addr_to_hex, #coerce_to_bytes, #coerce_to_int, #decode_hex, #decode_int, #double_sha256, #encode_hex, #encode_int, #function_signature, #hash160, #hash160_hex, #int_array_to_bytes, #int_to_addr, #int_to_big_endian, #keccak256, #keccak256_rlp, #keccak512, #lpad, #mk_contract_address, #mk_metropolis_contract_address, #mod_exp, #mod_mul, #normalize_address, #normalize_hex_without_prefix, #parse_int_or_hex, #ripemd160, #rpad, #sha256, #to_signed, #zpad, #zpad_hex, #zpad_int, #zunpad
Methods included from Abi::AbiCoder
#decode_abi, #decode_primitive_type, #decode_type, #decode_typed_data, #encode_abi, #encode_primitive_type, #encode_type
Constructor Details
#initialize(abi) ⇒ ContractMethod
Returns a new instance of ContractMethod.
34 35 36 37 38 39 40 41 42 |
# 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 |
Instance Attribute Details
#abi ⇒ Object (readonly)
Returns the value of attribute abi.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def abi @abi end |
#constant ⇒ Object (readonly)
Returns the value of attribute constant.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def constant @constant end |
#input_types ⇒ Object (readonly)
Returns the value of attribute input_types.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def input_types @input_types end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def name @name end |
#output_types ⇒ Object (readonly)
Returns the value of attribute output_types.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def output_types @output_types end |
#signature ⇒ Object (readonly)
Returns the value of attribute signature.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def signature @signature end |
#signature_hash ⇒ Object (readonly)
Returns the value of attribute signature_hash.
32 33 34 |
# File 'lib/web3/hpb/contract.rb', line 32 def signature_hash @signature_hash end |
Instance Method Details
#do_call(web3_rpc, contract_address, args) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 |
# 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) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# 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) ⇒ Object
78 79 80 81 |
# 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 |