etherlite 0.4.0 → 0.5.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 +4 -4
- data/lib/etherlite/account/base.rb +1 -2
- data/lib/etherlite/account/private_key.rb +19 -15
- data/lib/etherlite/api/node.rb +5 -8
- data/lib/etherlite/commands/abi/load_contract.rb +14 -2
- data/lib/etherlite/contract/event_base.rb +4 -2
- data/lib/etherlite/nonce_manager.rb +13 -7
- data/lib/etherlite/transaction.rb +6 -0
- data/lib/etherlite/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6bd7c04f60e0b06abbc63f817737ef0deea013791b885151d41f1789d57092a5
|
4
|
+
data.tar.gz: dbd6bf87f3e54a7e7c855e6e6bcf14226f5b708c5d8789c7b80b52e931f0dffc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2afa891466239576519823c40b146196ecd64f1ec9ff2afb20bac2b3b5010f2d4fe79dbc2811c83e461d3005b917dc405163f2e06556126f9af3644aea22a50f
|
7
|
+
data.tar.gz: cd7ce4b0800fe121a0ba5b9ed0e7c86de252101f3186d9504c4f69df0d0dde6300ba885762feb4f76f41ccd2981e1dacc75f1234ae01876324be8ffb6527d492
|
@@ -39,7 +39,7 @@ module Etherlite::Account
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def send_transaction(_options = {})
|
42
|
-
raise NotSupportedError, 'transactions are not supported by this kind of account'
|
42
|
+
raise Etherlite::NotSupportedError, 'transactions are not supported by this kind of account'
|
43
43
|
end
|
44
44
|
|
45
45
|
def ==(_other)
|
@@ -50,7 +50,6 @@ module Etherlite::Account
|
|
50
50
|
|
51
51
|
def call_constant(_target, _function, _params, _options)
|
52
52
|
params = {
|
53
|
-
from: json_encoded_address,
|
54
53
|
to: Etherlite::Utils.encode_address_param(_target),
|
55
54
|
data: _function.encode(_params)
|
56
55
|
}
|
@@ -8,23 +8,27 @@ module Etherlite
|
|
8
8
|
super _connection, Etherlite::Utils.normalize_address(@key.address)
|
9
9
|
end
|
10
10
|
|
11
|
+
def build_raw_transaction(_options = {})
|
12
|
+
nonce = nonce_manager.next_nonce_for(normalized_address, _options.slice(:replace, :nonce))
|
13
|
+
|
14
|
+
tx = Eth::Tx.new(
|
15
|
+
value: _options.fetch(:value, 0),
|
16
|
+
data: _options.fetch(:data, ''),
|
17
|
+
gas_limit: _options.fetch(:gas, 90_000),
|
18
|
+
gas_price: _options.fetch(:gas_price, gas_price),
|
19
|
+
to: (Etherlite::Utils.encode_address_param(_options[:to]) if _options.key?(:to)),
|
20
|
+
nonce: nonce
|
21
|
+
)
|
22
|
+
|
23
|
+
sign_with_connection_chain tx
|
24
|
+
|
25
|
+
tx
|
26
|
+
end
|
27
|
+
|
11
28
|
def send_transaction(_options = {})
|
12
|
-
|
13
|
-
|
14
|
-
nonce_manager.with_next_nonce_for(normalized_address, nonce_options) do |nonce|
|
15
|
-
tx = Eth::Tx.new(
|
16
|
-
value: _options.fetch(:value, 0),
|
17
|
-
data: _options.fetch(:data, ''),
|
18
|
-
gas_limit: _options.fetch(:gas, 90_000),
|
19
|
-
gas_price: _options.fetch(:gas_price, gas_price),
|
20
|
-
to: (Etherlite::Utils.encode_address_param(_options[:to]) if _options.key?(:to)),
|
21
|
-
nonce: nonce
|
22
|
-
)
|
23
|
-
|
24
|
-
# Since eth gem does not allow configuration of chains for every tx, we need
|
25
|
-
# to globally configure it before signing. This is not thread safe so a mutex is needed.
|
26
|
-
sign_with_connection_chain tx
|
29
|
+
tx = build_raw_transaction(_options)
|
27
30
|
|
31
|
+
nonce_manager.with_next_nonce_for(normalized_address, nonce: tx.nonce) do |nonce|
|
28
32
|
Etherlite::Transaction.new @connection, @connection.eth_send_raw_transaction(tx.hex)
|
29
33
|
end
|
30
34
|
end
|
data/lib/etherlite/api/node.rb
CHANGED
@@ -53,7 +53,11 @@ module Etherlite
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def default_account
|
56
|
-
@default_account ||=
|
56
|
+
@default_account ||= (accounts.first || anonymous_account)
|
57
|
+
end
|
58
|
+
|
59
|
+
def anonymous_account
|
60
|
+
@anonymous_account ||= Etherlite::Account::Anonymous.new(connection)
|
57
61
|
end
|
58
62
|
|
59
63
|
def account_from_pk(_pk)
|
@@ -66,13 +70,6 @@ use 'load_account' instead"
|
|
66
70
|
end
|
67
71
|
|
68
72
|
def_delegators :default_account, :unlock, :lock, :normalized_address, :transfer_to, :call
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def load_default_account
|
73
|
-
# TODO: consider configuring a global PK and allow the default account to use it
|
74
|
-
accounts.first || Etherlite::Account::Anonymous.new(connection)
|
75
|
-
end
|
76
73
|
end
|
77
74
|
end
|
78
75
|
end
|
@@ -81,9 +81,21 @@ module Etherlite::Abi
|
|
81
81
|
)
|
82
82
|
end,
|
83
83
|
(_definition['outputs'] || []).map { |input| LoadType.for signature: input['type'] },
|
84
|
-
_definition
|
85
|
-
_definition
|
84
|
+
function_payable?(_definition),
|
85
|
+
function_constant?(_definition)
|
86
86
|
)
|
87
87
|
end
|
88
|
+
|
89
|
+
def function_payable?(_definition)
|
90
|
+
return _definition['payable'] if _definition.key? 'payable'
|
91
|
+
|
92
|
+
_definition['stateMutability'] == 'payable'
|
93
|
+
end
|
94
|
+
|
95
|
+
def function_constant?(_definition)
|
96
|
+
return _definition['constant'] if _definition.key? 'constant'
|
97
|
+
|
98
|
+
_definition['stateMutability'] == 'pure' || _definition['stateMutability'] == 'view'
|
99
|
+
end
|
88
100
|
end
|
89
101
|
end
|
@@ -23,6 +23,7 @@ module Etherlite::Contract
|
|
23
23
|
|
24
24
|
def self.decode(_connection, _json)
|
25
25
|
new(
|
26
|
+
_json['blockHash'],
|
26
27
|
_json['blockNumber'].nil? ? nil : Etherlite::Utils.hex_to_uint(_json['blockNumber']),
|
27
28
|
_json['transactionHash'],
|
28
29
|
Etherlite::Address.new(_connection, Etherlite::Utils.normalize_address(_json['address'])),
|
@@ -30,9 +31,10 @@ module Etherlite::Contract
|
|
30
31
|
)
|
31
32
|
end
|
32
33
|
|
33
|
-
attr_reader :block_number, :tx_hash, :address, :attributes
|
34
|
+
attr_reader :block_hash, :block_number, :tx_hash, :address, :attributes
|
34
35
|
|
35
|
-
def initialize(_block_number, _tx_hash, _address, _attributes)
|
36
|
+
def initialize(_block_hash, _block_number, _tx_hash, _address, _attributes)
|
37
|
+
@block_hash = _block_hash
|
36
38
|
@block_number = _block_number
|
37
39
|
@tx_hash = _tx_hash
|
38
40
|
@address = _address
|
@@ -17,16 +17,22 @@ module Etherlite
|
|
17
17
|
last_nonce
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
20
|
+
def next_nonce_for(_normalized_address, replace: false, nonce: nil)
|
21
|
+
if nonce.nil?
|
22
|
+
nonce = last_nonce_for(_normalized_address)
|
23
|
+
nonce += 1 if nonce.negative? || !replace # if first tx, don't replace
|
24
|
+
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
+
nonce
|
27
|
+
end
|
28
|
+
|
29
|
+
def with_next_nonce_for(_normalized_address, _options = {})
|
30
|
+
@@nonce_mutex.synchronize do
|
31
|
+
nonce = next_nonce_for(_normalized_address, _options)
|
26
32
|
|
27
33
|
begin
|
28
|
-
result = yield
|
29
|
-
@@nonce_cache[_normalized_address] =
|
34
|
+
result = yield nonce
|
35
|
+
@@nonce_cache[_normalized_address] = nonce if caching_enabled?
|
30
36
|
return result
|
31
37
|
rescue
|
32
38
|
# if yield fails, cant be sure about transaction status so must rely again on observing.
|
data/lib/etherlite/version.rb
CHANGED
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.
|
4
|
+
version: 0.5.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: 2021-
|
11
|
+
date: 2021-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: digest-sha3
|