etherlite 0.1.1 → 0.1.2

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
2
  SHA1:
3
- metadata.gz: 1b367f296ffd50994239be945e0e546b3e7dbdb0
4
- data.tar.gz: f6b56c996e394c582dc2262f0b7a14f7034b28b3
3
+ metadata.gz: cc3672a5fe74a7af2cd535015ad05b291e5d07c0
4
+ data.tar.gz: b67bf5d1345c35d4a4a60da6a8b87d5266607768
5
5
  SHA512:
6
- metadata.gz: 1b8ddbb397d7c8c988a9619f9919bacbd5688a83cf691b1563a454a9a1c20ed7059df406e25d2bf17c4045ca43c868b9f7a081355b53997cc6b63b7ae0bf0c82
7
- data.tar.gz: 7a2c9922d666eaaed434f184f9122193535d52f4c22098f780098c5b8ebdb2bbfe175d788830c338b19029e2071bc78d18ccec9020937b0b9672b380481d9090
6
+ metadata.gz: b10b9675ff4a41b94e7dba7cfac2797b01008164fab0ac7a1d65ec1b89abb294d57d1ee8c4660dcbdb38470a7f5f1524ad66040fce9366d167aa146b1519db65
7
+ data.tar.gz: 0ab16b1be44be94cdbb0a6f6c78bc03154eaeae30c6ce14bcf1f2afd41e68a55c3e1a4cd2873e62ea78443c0fcc80d932dcee91147b7df2eb4b4cefc3e5757f1
data/etherlite.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_dependency "digest-sha3", "~> 1.1"
23
23
  spec.add_dependency "power-types", "~> 0.1"
24
+ spec.add_dependency "eth", "~> 0.4.4"
24
25
  spec.add_dependency "activesupport"
25
26
 
26
27
  spec.add_development_dependency "bundler", "~> 1.12"
data/lib/etherlite.rb CHANGED
@@ -28,6 +28,7 @@ require "etherlite/configuration"
28
28
  require "etherlite/abi"
29
29
  require "etherlite/utils"
30
30
  require "etherlite/connection"
31
+ require "etherlite/pk_account"
31
32
  require "etherlite/account"
32
33
  require "etherlite/address"
33
34
  require "etherlite/client"
@@ -31,26 +31,42 @@ module Etherlite
31
31
  _function = Utils.parse_function(_function) unless _function.is_a? Contract::Function
32
32
  options = _params.last.is_a?(Hash) ? _params.pop : {}
33
33
 
34
- params = {
34
+ if _function.constant?
35
+ call_constant _target, _function, _params, options
36
+ else
37
+ send_function_transaction _target, _function, _params, options
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ attr_reader :normalized_address
44
+
45
+ def call_constant(_target, _function, _params, _options)
46
+ ipc_params = {
35
47
  from: json_encoded_address,
36
48
  to: Utils.encode_address_param(_target),
37
49
  data: _function.encode(_params)
38
50
  }
39
51
 
40
- if _function.constant?
41
- _function.decode @connection, @connection.ipc_call(:eth_call, params, "latest")
42
- else
43
- if _function.payable? && options.key?(:pay)
44
- params[:value] = Utils.encode_quantity_param options[:pay]
45
- end
52
+ block = Utils.encode_block_param _options.fetch(:block, :latest)
46
53
 
47
- send_transaction params, options
48
- end
54
+ _function.decode @connection, @connection.ipc_call(:eth_call, ipc_params, block)
49
55
  end
50
56
 
51
- private
57
+ def send_function_transaction(_target, _function, _params, _options)
58
+ ipc_params = {
59
+ from: json_encoded_address,
60
+ to: Utils.encode_address_param(_target),
61
+ data: _function.encode(_params)
62
+ }
52
63
 
53
- attr_reader :normalized_address
64
+ value = _options.fetch(:pay, 0)
65
+ raise 'function is not payable' if value > 0 && !_function.payable?
66
+ ipc_params[:value] = value
67
+
68
+ send_transaction(ipc_params, _options)
69
+ end
54
70
 
55
71
  def send_transaction(_params, _opt)
56
72
  _params[:gas] = Utils.encode_quantity_param(_opt[:gas]) if _opt.key? :gas
@@ -0,0 +1,74 @@
1
+ require 'eth'
2
+
3
+ module Etherlite
4
+ class PkAccount
5
+ include Etherlite::Api::Address
6
+
7
+ attr_reader :connection
8
+
9
+ def initialize(_connection, _pk)
10
+ @connection = _connection
11
+ @key = Eth::Key.new priv: _pk
12
+ end
13
+
14
+ def normalized_address
15
+ @normalized_address ||= Utils.normalize_address @key.address
16
+ end
17
+
18
+ def transfer_to(_target, _options = {})
19
+ send_transaction(
20
+ _options.fetch(:amount, 0), '', Utils.encode_address_param(_target), _options
21
+ )
22
+ end
23
+
24
+ def call(_target, _function, *_params)
25
+ _function = Utils.parse_function(_function) unless _function.is_a? Contract::Function
26
+ options = _params.last.is_a?(Hash) ? _params.pop : {}
27
+
28
+ if _function.constant?
29
+ call_constant _target, _function, _params, options
30
+ else
31
+ value = options.fetch(:pay, 0)
32
+ raise 'function is not payable' if value > 0 && !_function.payable?
33
+
34
+ send_transaction(
35
+ value, _function.encode(_params), Utils.encode_address_param(_target), options
36
+ )
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def call_constant(_target, _function, _params, _options)
43
+ ipc_params = {
44
+ from: json_encoded_address,
45
+ to: Utils.encode_address_param(_target),
46
+ data: _function.encode(_params)
47
+ }
48
+
49
+ block = Utils.encode_block_param _options.fetch(:block, :latest)
50
+
51
+ _function.decode @connection, @connection.ipc_call(:eth_call, ipc_params, block)
52
+ end
53
+
54
+ def send_transaction(_value, _hex_data, _hex_address, _opt)
55
+ tx = Eth::Tx.new(
56
+ value: _value,
57
+ data: _hex_data,
58
+ gas_limit: _opt.fetch(:gas, 90_000),
59
+ gas_price: _opt.fetch(:gas_price, gas_price),
60
+ to: _hex_address,
61
+ nonce: 0
62
+ )
63
+
64
+ tx.sign @key
65
+
66
+ @connection.ipc_call(:eth_sendRawTransaction, tx.hex)
67
+ end
68
+
69
+ def gas_price
70
+ # TODO: improve on this
71
+ @gas_price ||= Etherlite::Utils.hex_to_uint @connection.ipc_call(:eth_gasPrice)
72
+ end
73
+ end
74
+ end
@@ -10,7 +10,7 @@ module Etherlite::Types
10
10
 
11
11
  def encode(_value)
12
12
  _value = Etherlite::Utils.normalize_address_param _value
13
- _value.to_raw_hex.rjust(64, '0')
13
+ _value.rjust(64, '0')
14
14
  end
15
15
 
16
16
  def decode(_connection, _value)
@@ -1,3 +1,3 @@
1
1
  module Etherlite
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
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.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacio Baixas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-08 00:00:00.000000000 Z
11
+ date: 2017-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: digest-sha3
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: eth
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.4
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.4
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: activesupport
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -161,6 +175,7 @@ files:
161
175
  - lib/etherlite/contract/event_base.rb
162
176
  - lib/etherlite/contract/event_input.rb
163
177
  - lib/etherlite/contract/function.rb
178
+ - lib/etherlite/pk_account.rb
164
179
  - lib/etherlite/railtie.rb
165
180
  - lib/etherlite/railties/configuration_extensions.rb
166
181
  - lib/etherlite/railties/utils.rb