tezos_client 0.4.8 → 0.4.9
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/Gemfile.lock +3 -3
- data/lib/tezos_client/commands.rb +2 -1
- data/lib/tezos_client/exceptions.rb +12 -0
- data/lib/tezos_client/operation_mgr.rb +20 -10
- data/lib/tezos_client/operations/operation.rb +1 -1
- data/lib/tezos_client/operations/operation_array.rb +11 -22
- data/lib/tezos_client/operations/raw_operation_array.rb +24 -0
- data/lib/tezos_client/operations/transaction_operation.rb +5 -3
- data/lib/tezos_client/rpc_interface/helper.rb +1 -1
- data/lib/tezos_client/rpc_interface/operations.rb +4 -0
- data/lib/tezos_client/rpc_interface/request_manager.rb +17 -9
- data/lib/tezos_client/version.rb +1 -1
- data/lib/tezos_client.rb +61 -17
- data/tezos_client.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d68c46e8ce54db3ab5deaaec705d5bb3f746706aaf35f592687f5282bf847225
|
4
|
+
data.tar.gz: f5d7effdcd2a84cebf396b2901189371bc9e2f47f092aa23fbae3bdcccd764c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6edec149c2d3b5390cc97c761015511e6012b5524d5dfeb0cb3a68965c28b47af5780690e66ec8b6ef8f9e67c914b2527c26b7e413bb1a7f69f2d42db2ddd07
|
7
|
+
data.tar.gz: 22c34b38fd4cd477a4c4687a5db02ed0bce9fa0f70daae778ea78fbc6bca505836dd1ea6768a644f270807e33269efb54a02dfa3ec0eb9e57ad63ca8c1f5b079
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
tezos_client (0.4.
|
4
|
+
tezos_client (0.4.9)
|
5
5
|
activesupport (~> 5.2.3)
|
6
6
|
base58 (~> 0.2.3)
|
7
7
|
bip_mnemonic (~> 0.0.2)
|
8
|
-
httparty (~> 0.
|
8
|
+
httparty (~> 0.17.0)
|
9
9
|
money-tree (~> 0.10.0)
|
10
10
|
rbnacl (~> 5.0.0)
|
11
11
|
rest-client (~> 2.0.0)
|
@@ -49,7 +49,7 @@ GEM
|
|
49
49
|
hashdiff (1.0.0)
|
50
50
|
http-cookie (1.0.3)
|
51
51
|
domain_name (~> 0.5)
|
52
|
-
httparty (0.
|
52
|
+
httparty (0.17.1)
|
53
53
|
mime-types (~> 3.0)
|
54
54
|
multi_xml (>= 0.5.2)
|
55
55
|
i18n (1.6.0)
|
@@ -28,6 +28,18 @@ class TezosClient
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
class PreviouslyRevealedKey < RpcRequestFailure
|
32
|
+
attr_reader :contract
|
33
|
+
|
34
|
+
def initialize(error:, **_args)
|
35
|
+
@contract = error[:contract]
|
36
|
+
|
37
|
+
@message = "Previously revealed key for address #{contract}"
|
38
|
+
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
31
43
|
class OperationFailure < Exception
|
32
44
|
include Logger
|
33
45
|
|
@@ -37,9 +37,9 @@ class TezosClient
|
|
37
37
|
def simulate_and_update_limits
|
38
38
|
run_result = run
|
39
39
|
|
40
|
-
run_result[:
|
40
|
+
run_result[:operation_results].zip(rpc_operation_args) do |operation_result, rpc_operation_args|
|
41
41
|
if rpc_operation_args.key?(:gas_limit)
|
42
|
-
rpc_operation_args[:gas_limit] = (operation_result[:consumed_gas] + 0.001).to_satoshi.to_s
|
42
|
+
rpc_operation_args[:gas_limit] = (operation_result[:consumed_gas].to_i.from_satoshi + 0.001).to_satoshi.to_s
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -73,16 +73,25 @@ class TezosClient
|
|
73
73
|
@signed_hex
|
74
74
|
end
|
75
75
|
|
76
|
-
def
|
76
|
+
def simulate
|
77
77
|
# simulate operations and adjust gas limits
|
78
78
|
simulate_and_update_limits
|
79
|
+
res = preapply
|
80
|
+
operation_results = res.map { |metadata| metadata[:operation_result] }
|
81
|
+
|
82
|
+
{
|
83
|
+
operation_results: operation_results,
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_and_broadcast
|
88
|
+
simulate_res = simulate
|
79
89
|
|
80
|
-
operations_result = preapply
|
81
90
|
|
82
91
|
op_id = broadcast
|
83
92
|
{
|
84
93
|
operation_id: op_id,
|
85
|
-
|
94
|
+
operation_results: simulate_res[:operation_results],
|
86
95
|
}
|
87
96
|
end
|
88
97
|
|
@@ -97,19 +106,19 @@ class TezosClient
|
|
97
106
|
|
98
107
|
ensure_applied!(rpc_responses)
|
99
108
|
|
100
|
-
|
109
|
+
operation_results = rpc_responses.map do |rpc_response|
|
101
110
|
metadata = rpc_response[:metadata]
|
102
111
|
total_consumed_storage += compute_consumed_storage(metadata)
|
103
112
|
consumed_gas = compute_consumed_gas(metadata)
|
104
113
|
total_consumed_gas += consumed_gas
|
105
|
-
|
114
|
+
metadata[:operation_result]
|
106
115
|
end
|
107
116
|
|
108
117
|
{
|
109
118
|
status: :applied,
|
110
119
|
consumed_gas: total_consumed_gas,
|
111
120
|
consumed_storage: total_consumed_storage,
|
112
|
-
|
121
|
+
operation_results: operation_results
|
113
122
|
}
|
114
123
|
end
|
115
124
|
|
@@ -146,13 +155,14 @@ class TezosClient
|
|
146
155
|
private
|
147
156
|
|
148
157
|
def ensure_applied!(rpc_responses)
|
149
|
-
|
158
|
+
metadatas = rpc_responses.map { |response| response[:metadata] }
|
159
|
+
operation_results = metadatas.map { |metadata| metadata[:operation_result] }
|
150
160
|
|
151
161
|
failed = operation_results.detect do |operation_result|
|
152
162
|
operation_result != nil && operation_result[:status] != "applied"
|
153
163
|
end
|
154
164
|
|
155
|
-
return
|
165
|
+
return metadatas if failed.nil?
|
156
166
|
|
157
167
|
failed_operation_result = operation_results.detect do |operation_result|
|
158
168
|
operation_result[:status] == "failed"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class TezosClient
|
2
2
|
class Operation
|
3
|
-
delegate :run, :preapply, :test_and_broadcast, :signed_hex, to: :operation_mgr
|
3
|
+
delegate :run, :preapply, :test_and_broadcast, :simulate, :signed_hex, to: :operation_mgr
|
4
4
|
|
5
5
|
def initialize(rpc_interface:, **args)
|
6
6
|
@rpc_interface = rpc_interface
|
@@ -1,32 +1,21 @@
|
|
1
1
|
class TezosClient
|
2
|
-
class OperationArray <
|
2
|
+
class OperationArray < RawOperationArray
|
3
3
|
|
4
4
|
def post_initialize(operations:, **args)
|
5
|
-
@
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
operation_kind = operation.delete(:kind)
|
15
|
-
|
16
|
-
operation_klass(operation_kind).new(
|
17
|
-
operation
|
18
|
-
.merge(@args.slice(:from))
|
19
|
-
.merge(
|
20
|
-
rpc_interface: rpc_interface,
|
21
|
-
counter: counter
|
22
|
-
)
|
23
|
-
).rpc_operation_args
|
24
|
-
end
|
5
|
+
@raw_operations = operations.map do |operation|
|
6
|
+
operation_kind = operation.delete(:kind)
|
7
|
+
operation_klass(operation_kind).new(
|
8
|
+
operation.merge(
|
9
|
+
from: @args.fetch(:from),
|
10
|
+
rpc_interface: rpc_interface,
|
11
|
+
counter: 0 # will be set by raw_operation_array
|
12
|
+
)
|
13
|
+
).rpc_operation_args
|
25
14
|
end
|
26
15
|
end
|
27
16
|
|
28
17
|
private
|
29
|
-
|
18
|
+
|
30
19
|
|
31
20
|
def operation_klass(operation_name)
|
32
21
|
"tezos_client/#{operation_name}_operation".camelize.constantize
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class TezosClient
|
2
|
+
class RawOperationArray < Operation
|
3
|
+
|
4
|
+
def post_initialize(raw_operations:, **args)
|
5
|
+
@raw_operations = raw_operations.clone
|
6
|
+
end
|
7
|
+
|
8
|
+
def rpc_operation_args
|
9
|
+
@rpc_operation_args ||= begin
|
10
|
+
initial_counter = rpc_interface.contract_counter(@args.fetch(:from)) + 1
|
11
|
+
|
12
|
+
raw_operations.map.with_index do |operation, index|
|
13
|
+
counter = (initial_counter + index)
|
14
|
+
operation.merge(
|
15
|
+
counter: counter.to_s
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
attr_reader :raw_operations
|
23
|
+
end
|
24
|
+
end
|
@@ -27,7 +27,7 @@ class TezosClient
|
|
27
27
|
kind: "origination",
|
28
28
|
delegatable: args.fetch(:delegatable, false),
|
29
29
|
spendable: args.fetch(:spendable, false),
|
30
|
-
balance: args.fetch(:amount,0).to_satoshi.to_s,
|
30
|
+
balance: args.fetch(:amount, 0).to_satoshi.to_s,
|
31
31
|
source: args.fetch(:from),
|
32
32
|
gas_limit: args.fetch(:gas_limit, 0.1).to_satoshi.to_s,
|
33
33
|
storage_limit: args.fetch(:storage_limit, 0.06).to_satoshi.to_s,
|
@@ -5,13 +5,15 @@ class TezosClient
|
|
5
5
|
module RequestManager
|
6
6
|
def get(path, query: {})
|
7
7
|
url = "http://#{@host}:#{@port}/#{path}"
|
8
|
-
|
9
|
-
|
8
|
+
response = nil
|
9
|
+
exec_time = Benchmark.realtime do
|
10
|
+
response = HTTParty.get(url, headers: { "Content-Type" => "application/json" }, query: query)
|
11
|
+
end
|
10
12
|
formatted_response = format_response(response.parsed_response)
|
11
13
|
|
12
14
|
log("-------")
|
13
15
|
log(">>> GET #{response.request.uri.to_s} \n")
|
14
|
-
log("<<< code: #{response.code} \n #{tezos_contents_log(formatted_response)}")
|
16
|
+
log("<<< code: #{response.code} \n exec time: #{exec_time}\n #{tezos_contents_log(formatted_response)}")
|
15
17
|
log("-------")
|
16
18
|
unless response.success?
|
17
19
|
failed!(url: url, code: response.code, responses: formatted_response)
|
@@ -22,15 +24,19 @@ class TezosClient
|
|
22
24
|
|
23
25
|
def post(path, content)
|
24
26
|
url = "http://#{@host}:#{@port}/#{path}"
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
|
28
|
+
response = nil
|
29
|
+
exec_time = Benchmark.realtime do
|
30
|
+
response = HTTParty.post(url,
|
31
|
+
body: content.to_json,
|
32
|
+
headers: { "Content-Type" => "application/json" })
|
33
|
+
end
|
28
34
|
|
29
35
|
formatted_response = format_response(response.parsed_response)
|
30
36
|
|
31
37
|
log("-------")
|
32
38
|
log(">>> POST #{url} \n #{tezos_contents_log(content)}")
|
33
|
-
log("<<< code: #{response.code} \n #{tezos_contents_log(formatted_response)}")
|
39
|
+
log("<<< code: #{response.code} \n exec time: #{exec_time} \n #{tezos_contents_log(formatted_response)}")
|
34
40
|
log("-------")
|
35
41
|
|
36
42
|
unless response.success?
|
@@ -71,15 +77,17 @@ class TezosClient
|
|
71
77
|
|
72
78
|
def exception_klass(error)
|
73
79
|
case get_error_id(error)
|
74
|
-
when
|
80
|
+
when /proto\.[^.]*\.operation\.invalid_activation/
|
75
81
|
TezosClient::InvalidActivation
|
82
|
+
when /proto\.[^.]*\.contract\.previously_revealed_key/
|
83
|
+
TezosClient::PreviouslyRevealedKey
|
76
84
|
else
|
77
85
|
TezosClient::RpcRequestFailure
|
78
86
|
end
|
79
87
|
end
|
80
88
|
|
81
89
|
def failed!(url:, code:, responses:)
|
82
|
-
error = responses[0]
|
90
|
+
error = responses.is_a?(String) ? responses : responses[0]
|
83
91
|
raise exception_klass(error).new(
|
84
92
|
error: error,
|
85
93
|
url: url,
|
data/lib/tezos_client/version.rb
CHANGED
data/lib/tezos_client.rb
CHANGED
@@ -5,6 +5,7 @@ require "active_support/core_ext/hash/indifferent_access"
|
|
5
5
|
require "active_support/core_ext/string/inflections"
|
6
6
|
require "active_support/core_ext/module/delegation"
|
7
7
|
require "timeout"
|
8
|
+
require "benchmark"
|
8
9
|
|
9
10
|
require "tezos_client/version"
|
10
11
|
require "tezos_client/string_utils"
|
@@ -21,6 +22,7 @@ require "tezos_client/operations/transaction_operation"
|
|
21
22
|
require "tezos_client/operations/transactions_operation"
|
22
23
|
require "tezos_client/operations/activate_account_operation"
|
23
24
|
require "tezos_client/operations/reveal_operation"
|
25
|
+
require "tezos_client/operations/raw_operation_array"
|
24
26
|
require "tezos_client/operations/operation_array"
|
25
27
|
|
26
28
|
require "tezos_client/client_interface"
|
@@ -78,7 +80,7 @@ class TezosClient
|
|
78
80
|
#
|
79
81
|
# @return [Hash] result of the origination containing :operation_id, :operation_result and :originated_contract
|
80
82
|
#
|
81
|
-
def originate_contract(from:, amount:, secret_key:, script: nil, init_params: nil, **args)
|
83
|
+
def originate_contract(from:, amount:, secret_key:, script: nil, init_params: nil, dry_run: false, **args)
|
82
84
|
origination_args = {
|
83
85
|
rpc_interface: rpc_interface,
|
84
86
|
from: from,
|
@@ -95,9 +97,12 @@ class TezosClient
|
|
95
97
|
)
|
96
98
|
end
|
97
99
|
|
98
|
-
|
100
|
+
operation = OriginationOperation.new(origination_args)
|
101
|
+
res = broadcast_operation(operation: operation, dry_run: dry_run)
|
99
102
|
|
100
|
-
res.merge(
|
103
|
+
res.merge(
|
104
|
+
originated_contract: res[:operation_results][0][:originated_contracts][0]
|
105
|
+
)
|
101
106
|
end
|
102
107
|
|
103
108
|
# Transfer funds to an account
|
@@ -110,51 +115,59 @@ class TezosClient
|
|
110
115
|
#
|
111
116
|
# @return [Hash] result of the transfer containing :operation_id and :operation_result
|
112
117
|
#
|
113
|
-
def transfer(from:, amount:, to:, secret_key:, **args)
|
114
|
-
TransactionOperation.new(
|
118
|
+
def transfer(from:, amount:, to:, secret_key:, dry_run: false, **args)
|
119
|
+
operation = TransactionOperation.new(
|
115
120
|
rpc_interface: rpc_interface,
|
116
121
|
from: from,
|
117
122
|
to: to,
|
118
123
|
secret_key: secret_key,
|
119
124
|
amount: amount,
|
120
125
|
**args
|
121
|
-
)
|
126
|
+
)
|
127
|
+
|
128
|
+
broadcast_operation(operation: operation, dry_run: dry_run)
|
122
129
|
end
|
123
130
|
|
124
|
-
def activate_account(pkh:, secret:, **args)
|
125
|
-
ActivateAccountOperation.new(
|
131
|
+
def activate_account(pkh:, secret:, dry_run: false, **args)
|
132
|
+
operation = ActivateAccountOperation.new(
|
126
133
|
rpc_interface: rpc_interface,
|
127
134
|
pkh: pkh,
|
128
135
|
secret: secret,
|
129
136
|
**args
|
130
|
-
)
|
137
|
+
)
|
138
|
+
|
139
|
+
broadcast_operation(operation: operation, dry_run: dry_run)
|
131
140
|
end
|
132
141
|
|
133
|
-
def transfer_to_many(from:, amounts:, secret_key:, **args)
|
134
|
-
TransactionsOperation.new(
|
142
|
+
def transfer_to_many(from:, amounts:, secret_key:, dry_run: false, **args)
|
143
|
+
operation = TransactionsOperation.new(
|
135
144
|
rpc_interface: rpc_interface,
|
136
145
|
from: from,
|
137
146
|
amounts: amounts,
|
138
147
|
secret_key: secret_key,
|
139
148
|
**args
|
140
|
-
)
|
149
|
+
)
|
150
|
+
|
151
|
+
broadcast_operation(operation: operation, dry_run: dry_run)
|
141
152
|
end
|
142
153
|
|
143
|
-
def reveal_pubkey(secret_key:, **args)
|
154
|
+
def reveal_pubkey(secret_key:, dry_run: false, **args)
|
144
155
|
public_key = secret_key_to_public_key(secret_key)
|
145
156
|
from = public_key_to_address(public_key)
|
146
157
|
|
147
|
-
RevealOperation.new(
|
158
|
+
operation = RevealOperation.new(
|
148
159
|
liquidity_interface: liquidity_interface,
|
149
160
|
rpc_interface: rpc_interface,
|
150
161
|
public_key: public_key,
|
151
162
|
from: from,
|
152
163
|
secret_key: secret_key,
|
153
164
|
**args
|
154
|
-
)
|
165
|
+
)
|
166
|
+
|
167
|
+
broadcast_operation(operation: operation, dry_run: dry_run)
|
155
168
|
end
|
156
169
|
|
157
|
-
def call_contract(args)
|
170
|
+
def call_contract(dry_run: false, **args)
|
158
171
|
parameters = args.fetch(:parameters)
|
159
172
|
|
160
173
|
json_params = liquidity_interface.call_parameters(
|
@@ -162,11 +175,28 @@ class TezosClient
|
|
162
175
|
parameters: parameters
|
163
176
|
)
|
164
177
|
|
165
|
-
transfer_args = args.merge(parameters: json_params)
|
178
|
+
transfer_args = args.merge(parameters: json_params, dry_run: dry_run)
|
166
179
|
|
167
180
|
transfer(transfer_args)
|
168
181
|
end
|
169
182
|
|
183
|
+
def inject_raw_operations(secret_key:, raw_operations:, dry_run: false, **args)
|
184
|
+
public_key = secret_key_to_public_key(secret_key)
|
185
|
+
from = public_key_to_address(public_key)
|
186
|
+
|
187
|
+
operation = RawOperationArray.new(
|
188
|
+
liquidity_interface: liquidity_interface,
|
189
|
+
rpc_interface: rpc_interface,
|
190
|
+
public_key: public_key,
|
191
|
+
from: from,
|
192
|
+
secret_key: secret_key,
|
193
|
+
raw_operations: raw_operations,
|
194
|
+
**args
|
195
|
+
)
|
196
|
+
|
197
|
+
broadcast_operation(operation: operation, dry_run: dry_run)
|
198
|
+
end
|
199
|
+
|
170
200
|
def monitor_operation(operation_id, timeout: 120)
|
171
201
|
including_block = nil
|
172
202
|
|
@@ -204,4 +234,18 @@ class TezosClient
|
|
204
234
|
operations.flatten.include? operation_id
|
205
235
|
end
|
206
236
|
|
237
|
+
private
|
238
|
+
|
239
|
+
def broadcast_operation(operation:, dry_run:)
|
240
|
+
res = if dry_run
|
241
|
+
operation.simulate
|
242
|
+
else
|
243
|
+
operation.test_and_broadcast
|
244
|
+
end
|
245
|
+
|
246
|
+
res.merge(
|
247
|
+
rpc_operation_args: operation.rpc_operation_args
|
248
|
+
)
|
249
|
+
end
|
250
|
+
|
207
251
|
end
|
data/tezos_client.gemspec
CHANGED
@@ -41,7 +41,7 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_development_dependency "vcr", "~> 4.0.0"
|
42
42
|
|
43
43
|
spec.add_dependency "base58", "~> 0.2.3"
|
44
|
-
spec.add_dependency "httparty", "~> 0.
|
44
|
+
spec.add_dependency "httparty", "~> 0.17.0"
|
45
45
|
spec.add_dependency "rbnacl", "~> 5.0.0"
|
46
46
|
spec.add_dependency "rest-client", "~>2.0.0"
|
47
47
|
spec.add_dependency "activesupport", "~> 5.2.3"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tezos_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pierre Michard
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.17.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.17.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rbnacl
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -232,6 +232,7 @@ files:
|
|
232
232
|
- lib/tezos_client/operations/operation.rb
|
233
233
|
- lib/tezos_client/operations/operation_array.rb
|
234
234
|
- lib/tezos_client/operations/origination_operation.rb
|
235
|
+
- lib/tezos_client/operations/raw_operation_array.rb
|
235
236
|
- lib/tezos_client/operations/reveal_operation.rb
|
236
237
|
- lib/tezos_client/operations/transaction_operation.rb
|
237
238
|
- lib/tezos_client/operations/transactions_operation.rb
|