etherlite 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3d9836bec35f181ec6d32abafcd7a3a5dde485e4
4
- data.tar.gz: 98977ede760cfcb7dcf32910d79acffef187b89e
2
+ SHA256:
3
+ metadata.gz: bbd613d95d4aaec97652278de22e3599754a18979185f8a0eeaea0ef6db3e3c4
4
+ data.tar.gz: c21fe17680a4b4cc82eceedbd413df822da0c9475b9ee4c58f9ba124a481d82e
5
5
  SHA512:
6
- metadata.gz: 12c60f7ad8b8a4556171db68c495a49ac4f72a8f10a0a3a64321db3170bbf05ea992a5bcbf40c89b1ee9054092eef7818aa3bf49fa6349c9e872720e9e9f3f2a
7
- data.tar.gz: b36ebbd7fb4d09d33bad6129eb1d42ffe6b1588a20fbe90cf7ffe193d0cf4d20c1fb49d388897741ad3ad93d08e55948fc51e95a1c5b8c046d99bf3f741c7017
6
+ metadata.gz: 202253e8cea38ae5b51977e130e442cdcc5fb4563f93dd5da802e6dbc8e86e154e08a4b13fc50f05b17c17ba4541d8a9adb6406aee7fb05f79e90fde8e8da594
7
+ data.tar.gz: 1cbca94d66686e94db2ff819f4d21f6c64035a6004ab56d9d641ab02895ea8dbdb00495a120f4813c75cf00a9d1e0d4efe8e1655f2d23cb907615c0cf60102f6
data/etherlite.gemspec CHANGED
@@ -24,11 +24,11 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency "eth", "~> 0.4.4"
25
25
  spec.add_dependency "activesupport"
26
26
 
27
- spec.add_development_dependency "bundler", "~> 1.12"
27
+ spec.add_development_dependency "bundler", "~> 2.1.4"
28
28
  spec.add_development_dependency "rake", "~> 10.0"
29
29
  spec.add_development_dependency "rspec", "~> 3.0"
30
30
  spec.add_development_dependency "guard", "~> 2.14"
31
31
  spec.add_development_dependency "guard-rspec", "~> 4.7"
32
- spec.add_development_dependency "webmock", "~> 3.0.1"
32
+ spec.add_development_dependency "webmock", "~> 3.7.5"
33
33
  spec.add_development_dependency "pry"
34
34
  end
@@ -9,6 +9,15 @@ module Etherlite::Account
9
9
  @normalized_address = _normalized_address
10
10
  end
11
11
 
12
+ def next_nonce
13
+ if @connection.use_parity
14
+ @connection.parity_next_nonce(address)
15
+ else
16
+ # https://github.com/ethereum/go-ethereum/issues/2736
17
+ @connection.eth_get_transaction_count(address, 'pending')
18
+ end
19
+ end
20
+
12
21
  def transfer_to(_target, _options = {})
13
22
  send_transaction _options.merge(to: _target, value: _options.fetch(:amount, 0))
14
23
  end
@@ -9,7 +9,9 @@ module Etherlite
9
9
  end
10
10
 
11
11
  def send_transaction(_options = {})
12
- nonce_manager.with_next_nonce_for(normalized_address) do |nonce|
12
+ nonce_options = _options.slice(:replace, :nonce)
13
+
14
+ nonce_manager.with_next_nonce_for(normalized_address, nonce_options) do |nonce|
13
15
  tx = Eth::Tx.new(
14
16
  value: _options.fetch(:value, 0),
15
17
  data: _options.fetch(:data, ''),
@@ -16,6 +16,19 @@ module Etherlite
16
16
  load_transaction(*_args).refresh
17
17
  end
18
18
 
19
+ def get_logs(events: nil, address: nil, from_block: :earliest, to_block: :latest)
20
+ params = {
21
+ fromBlock: Etherlite::Utils.encode_block_param(from_block),
22
+ toBlock: Etherlite::Utils.encode_block_param(to_block)
23
+ }
24
+
25
+ params[:topics] = [Array(events).map(&:topic)] unless events.nil?
26
+ params[:address] = Etherlite::Utils.encode_address_param(address) unless address.nil?
27
+
28
+ logs = connection.ipc_call(:eth_getLogs, params)
29
+ ::Etherlite::EventProvider.parse_raw_logs(connection, logs)
30
+ end
31
+
19
32
  def load_transaction(_hash)
20
33
  Transaction.new(connection, _hash)
21
34
  end
@@ -3,7 +3,7 @@ module Etherlite::Abi
3
3
  def perform
4
4
  klass = Class.new(Etherlite::Contract::Base)
5
5
 
6
- define_class_getter klass, 'unlinked_binary', unlinked_binary
6
+ define_class_getter klass, 'unlinked_bytecode', unlinked_bytecode
7
7
 
8
8
  abi_definitions.each do |definition|
9
9
  case definition['type']
@@ -24,7 +24,7 @@ module Etherlite::Abi
24
24
 
25
25
  private
26
26
 
27
- def unlinked_binary
27
+ def unlinked_bytecode
28
28
  @artifact['unlinked_binary'] || @artifact['bytecode'] || ''
29
29
  end
30
30
 
@@ -10,7 +10,7 @@ module Etherlite::Contract
10
10
  @events ||= []
11
11
  end
12
12
 
13
- def self.unlinked_binary
13
+ def self.unlinked_bytecode
14
14
  '0x0'
15
15
  end
16
16
 
@@ -18,13 +18,13 @@ module Etherlite::Contract
18
18
  nil
19
19
  end
20
20
 
21
- def self.binary
22
- @binary ||= begin
23
- if /__[^_]+_+/ === unlinked_binary
21
+ def self.bytecode
22
+ @bytecode ||= begin
23
+ if /__[^_]+_+/.match? unlinked_bytecode
24
24
  raise UnlinkedContractError, 'compiled contract contains unresolved library references'
25
25
  end
26
26
 
27
- unlinked_binary
27
+ unlinked_bytecode
28
28
  end
29
29
  end
30
30
 
@@ -32,7 +32,7 @@ module Etherlite::Contract
32
32
  options = _args.last.is_a?(Hash) ? _args.pop : {}
33
33
  as = options[:as] || options[:client].try(:default_account) || Etherlite.default_account
34
34
 
35
- tx_data = binary
35
+ tx_data = options.fetch(:bytecode, bytecode)
36
36
  tx_data += constructor.encode(_args) unless constructor.nil?
37
37
 
38
38
  as.send_transaction({ data: tx_data }.merge(options))
@@ -25,15 +25,17 @@ module Etherlite::Contract
25
25
  new(
26
26
  _json['blockNumber'].nil? ? nil : Etherlite::Utils.hex_to_uint(_json['blockNumber']),
27
27
  _json['transactionHash'],
28
+ Etherlite::Address.new(_connection, Etherlite::Utils.normalize_address(_json['address'])),
28
29
  DecodeLogInputs.for(connection: _connection, inputs: inputs, json: _json)
29
30
  )
30
31
  end
31
32
 
32
- attr_reader :block_number, :tx_hash, :attributes
33
+ attr_reader :block_number, :tx_hash, :address, :attributes
33
34
 
34
- def initialize(_block_number, _tx_hash, _attributes)
35
+ def initialize(_block_number, _tx_hash, _address, _attributes)
35
36
  @block_number = _block_number
36
37
  @tx_hash = _tx_hash
38
+ @address = _address
37
39
  @attributes = _attributes
38
40
  end
39
41
  end
@@ -17,9 +17,12 @@ module Etherlite
17
17
  last_nonce
18
18
  end
19
19
 
20
- def with_next_nonce_for(_normalized_address)
20
+ def with_next_nonce_for(_normalized_address, replace: false, nonce: nil)
21
21
  @@nonce_mutex.synchronize do
22
- next_nonce = last_nonce_for(_normalized_address) + 1
22
+ return yield nonce if nonce.present?
23
+
24
+ next_nonce = last_nonce_for(_normalized_address)
25
+ next_nonce += 1 if next_nonce.negative? || !replace # if first tx, don't replace
23
26
 
24
27
  begin
25
28
  result = yield next_nonce
@@ -1,72 +1,92 @@
1
1
  module Etherlite
2
2
  class Transaction
3
- attr_reader :tx_hash, :receipt
3
+ attr_reader :tx_hash
4
4
 
5
5
  def initialize(_connection, _tx_hash)
6
6
  @connection = _connection
7
7
  @tx_hash = _tx_hash
8
- @receipt = {}
8
+ @loaded = false
9
9
  end
10
10
 
11
11
  def refresh
12
- @receipt = @connection.eth_get_transaction_receipt(@tx_hash) || {}
12
+ @original = @connection.eth_get_transaction_by_hash(@tx_hash)
13
+ @loaded = true
13
14
  self
14
15
  end
15
16
 
17
+ def original
18
+ refresh unless @loaded
19
+ @original
20
+ end
21
+
16
22
  def removed?
17
- @receipt.nil?
23
+ original.nil?
18
24
  end
19
25
 
20
- def succeeded?
21
- status == 1
26
+ def mined?
27
+ original.present? && !original['blockNumber'].nil?
22
28
  end
23
29
 
24
- def status
25
- return nil if removed?
26
- status = @receipt['status']
27
- status.is_a?(String) ? Utils.hex_to_uint(status) : status
30
+ def gas
31
+ original && Utils.hex_to_uint(original['gas'])
28
32
  end
29
33
 
30
- def mined?
31
- !removed? && @receipt.key?('blockNumber')
34
+ def gas_price
35
+ original && Utils.hex_to_uint(original['gasPrice'])
36
+ end
37
+
38
+ def value
39
+ original && Utils.hex_to_uint(original['value'])
40
+ end
41
+
42
+ def block_number
43
+ return nil unless mined?
44
+
45
+ Utils.hex_to_uint(original['blockNumber'])
32
46
  end
33
47
 
34
48
  def confirmations
35
49
  return 0 unless mined?
36
50
 
37
- @connection.eth_block_number - block_number
51
+ (@connection.eth_block_number - block_number) + 1
38
52
  end
39
53
 
40
- def gas
41
- Utils.hex_to_uint original['gas']
54
+ # receipt attributes
55
+
56
+ def receipt
57
+ return nil unless mined?
58
+
59
+ @receipt ||= @connection.eth_get_transaction_receipt(@tx_hash)
42
60
  end
43
61
 
44
- def gas_used
45
- Utils.hex_to_uint @receipt['gasUsed']
62
+ def status
63
+ return nil if receipt.nil?
64
+
65
+ receipt['status'].is_a?(String) ? Utils.hex_to_uint(receipt['status']) : receipt['status']
46
66
  end
47
67
 
48
- def gas_price
49
- Utils.hex_to_uint original['gasPrice']
68
+ def succeeded?
69
+ status == 1
50
70
  end
51
71
 
52
- def value
53
- Utils.hex_to_uint original['value']
72
+ def failed?
73
+ status == 0
54
74
  end
55
75
 
56
- def logs
57
- @receipt['logs'] || []
76
+ def gas_used
77
+ receipt && Utils.hex_to_uint(receipt['gasUsed'])
58
78
  end
59
79
 
60
- def events
61
- ::Etherlite::EventProvider.parse_raw_logs(@connection, logs)
80
+ def logs
81
+ receipt && (receipt['logs'] || [])
62
82
  end
63
83
 
64
- def block_number
65
- Utils.hex_to_uint @receipt['blockNumber']
84
+ def events
85
+ receipt && ::Etherlite::EventProvider.parse_raw_logs(@connection, logs)
66
86
  end
67
87
 
68
88
  def contract_address
69
- @receipt['contractAddress']
89
+ receipt && receipt['contractAddress']
70
90
  end
71
91
 
72
92
  def wait_for_block(timeout: 120)
@@ -79,11 +99,5 @@ module Etherlite
79
99
 
80
100
  true
81
101
  end
82
-
83
- private
84
-
85
- def original
86
- @original ||= @connection.eth_get_transaction_by_hash(@tx_hash)
87
- end
88
102
  end
89
103
  end
@@ -1,3 +1,3 @@
1
1
  module Etherlite
2
- VERSION = "0.2.3"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: etherlite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacio Baixas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-16 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: digest-sha3
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.12'
75
+ version: 2.1.4
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.12'
82
+ version: 2.1.4
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 3.0.1
145
+ version: 3.7.5
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 3.0.1
152
+ version: 3.7.5
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: pry
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -248,8 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
248
  - !ruby/object:Gem::Version
249
249
  version: '0'
250
250
  requirements: []
251
- rubyforge_project:
252
- rubygems_version: 2.6.4
251
+ rubygems_version: 3.0.3
253
252
  signing_key:
254
253
  specification_version: 4
255
254
  summary: Ethereum integration for ruby on rails