tezos_client 0.3.9 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -4
- data/Gemfile.lock +1 -1
- data/lib/tezos_client.rb +19 -10
- data/lib/tezos_client/exceptions.rb +92 -0
- data/lib/tezos_client/liquidity_interface.rb +4 -2
- data/lib/tezos_client/logger.rb +22 -0
- data/lib/tezos_client/operation_mgr.rb +178 -0
- data/lib/tezos_client/operations/activate_account_operation.rb +9 -27
- data/lib/tezos_client/operations/operation.rb +33 -0
- data/lib/tezos_client/operations/operation_array.rb +35 -0
- data/lib/tezos_client/operations/origination_operation.rb +13 -44
- data/lib/tezos_client/operations/reveal_operation.rb +3 -22
- data/lib/tezos_client/operations/transaction_operation.rb +21 -24
- data/lib/tezos_client/operations/transactions_operation.rb +24 -22
- data/lib/tezos_client/rpc_interface.rb +2 -0
- data/lib/tezos_client/rpc_interface/helper.rb +29 -85
- data/lib/tezos_client/rpc_interface/operations.rb +44 -0
- data/lib/tezos_client/rpc_interface/request_manager.rb +23 -5
- data/lib/tezos_client/version.rb +1 -1
- data/travis-scripts/install-liquidity.sh +2 -10
- data/travis-scripts/install-opam.sh +11 -3
- data/travis-scripts/prepare-ubuntu.sh +14 -0
- metadata +8 -4
- data/lib/tezos_client/operation.rb +0 -159
- data/travis-scripts/prepare-trusty.sh +0 -16
@@ -1,35 +1,17 @@
|
|
1
1
|
class TezosClient
|
2
2
|
class ActivateAccountOperation < Operation
|
3
3
|
|
4
|
-
def
|
5
|
-
@
|
6
|
-
|
7
|
-
|
8
|
-
branch: branch)
|
4
|
+
def rpc_operation_args
|
5
|
+
@rpc_operation_args ||= rpc_interface.activate_account_operation(
|
6
|
+
operation_args
|
7
|
+
)
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
12
|
-
|
10
|
+
def operation_args
|
11
|
+
{
|
12
|
+
pkh: @args.fetch(:pkh),
|
13
|
+
secret: @args.fetch(:secret)
|
14
|
+
}
|
13
15
|
end
|
14
|
-
|
15
|
-
def ensure_applied!(rpc_response)
|
16
|
-
balance_updates = rpc_response[:metadata][:balance_updates]
|
17
|
-
raise "Operation failed\n #{rpc_response.pretty_inspect}" if balance_updates.nil?
|
18
|
-
if block_given?
|
19
|
-
yield rpc_response[:metadata]
|
20
|
-
else
|
21
|
-
rpc_response[:metadata]
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def default_args
|
28
|
-
{
|
29
|
-
gas_limit: 0.1,
|
30
|
-
storage_limit: 0.006,
|
31
|
-
fee: 0.05
|
32
|
-
}
|
33
|
-
end
|
34
16
|
end
|
35
17
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class TezosClient
|
2
|
+
class Operation
|
3
|
+
delegate :run, :preapply, :test_and_broadcast, :signed_hex, to: :operation_mgr
|
4
|
+
|
5
|
+
def initialize(rpc_interface:, **args)
|
6
|
+
@rpc_interface = rpc_interface
|
7
|
+
@args = args.clone
|
8
|
+
post_initialize(**args)
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
attr_reader :rpc_interface, :liquidity_interface
|
14
|
+
|
15
|
+
def rpc_operation_args
|
16
|
+
raise NotImplementedError, "#{__method__} is a virtual method"
|
17
|
+
end
|
18
|
+
|
19
|
+
def post_initialize(*_args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def operation_mgr
|
23
|
+
@operation_mgr ||= OperationMgr.new(
|
24
|
+
rpc_interface: rpc_interface,
|
25
|
+
rpc_operation_args: rpc_operation_args,
|
26
|
+
**operation_options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def operation_options
|
30
|
+
@args.slice(:secret_key, :protocol, :branch)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class TezosClient
|
2
|
+
class OperationArray < Operation
|
3
|
+
|
4
|
+
def post_initialize(operations:, **args)
|
5
|
+
@operations = 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
|
+
operations.map.with_index do |operation, index|
|
13
|
+
counter = (initial_counter + index)
|
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
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
attr_reader :operations
|
30
|
+
|
31
|
+
def operation_klass(operation_name)
|
32
|
+
"tezos_client/#{operation_name}_operation".camelize.constantize
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,50 +1,19 @@
|
|
1
1
|
class TezosClient
|
2
2
|
class OriginationOperation < Operation
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def has_script?
|
19
|
-
@init_args.key? :script
|
20
|
-
end
|
21
|
-
|
22
|
-
def json_script
|
23
|
-
liquidity_interface.origination_script(
|
24
|
-
@init_args.slice(:from, :script, :init_params)
|
3
|
+
def rpc_operation_args
|
4
|
+
@rpc_operation_args ||= rpc_interface.origination_operation(
|
5
|
+
@args.slice(
|
6
|
+
:delegatable,
|
7
|
+
:spendable,
|
8
|
+
:amount,
|
9
|
+
:from,
|
10
|
+
:gas_limit,
|
11
|
+
:storage_limit,
|
12
|
+
:fee,
|
13
|
+
:counter,
|
14
|
+
:script
|
15
|
+
)
|
25
16
|
)
|
26
17
|
end
|
27
|
-
|
28
|
-
def manager
|
29
|
-
@init_args.fetch(:manager) { @init_args.fetch(:from) }
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def operation_kind
|
34
|
-
:origination
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def default_args
|
40
|
-
{
|
41
|
-
amount: 0,
|
42
|
-
spendable: false,
|
43
|
-
delegatable: false,
|
44
|
-
gas_limit: 0.1,
|
45
|
-
storage_limit: 0.06,
|
46
|
-
fee: 0.05
|
47
|
-
}
|
48
|
-
end
|
49
18
|
end
|
50
19
|
end
|
@@ -1,28 +1,9 @@
|
|
1
1
|
class TezosClient
|
2
2
|
class RevealOperation < Operation
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
**@init_args,
|
7
|
-
operation_kind: operation_kind,
|
8
|
-
branch: branch,
|
9
|
-
counter: counter
|
3
|
+
def rpc_operation_args
|
4
|
+
@rpc_operation_args ||= rpc_interface.reveal_operation(
|
5
|
+
@args.slice(:from, :fee, :gas_limit, :storage_limit, :counter, :public_key)
|
10
6
|
)
|
11
7
|
end
|
12
|
-
|
13
|
-
|
14
|
-
def operation_kind
|
15
|
-
:reveal
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def default_args
|
21
|
-
{
|
22
|
-
gas_limit: 0.1,
|
23
|
-
storage_limit: 0,
|
24
|
-
fee: 0.05
|
25
|
-
}
|
26
|
-
end
|
27
8
|
end
|
28
9
|
end
|
@@ -2,38 +2,35 @@ class TezosClient
|
|
2
2
|
class TransactionOperation < Operation
|
3
3
|
include EncodeUtils
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
operation_kind: operation_kind,
|
9
|
-
branch: branch,
|
10
|
-
counter: counter
|
5
|
+
def rpc_operation_args
|
6
|
+
rpc_interface.transaction_operation(
|
7
|
+
operation_args
|
11
8
|
)
|
12
|
-
if has_parameters?
|
13
|
-
@operation_args[:parameters] = parameters
|
14
|
-
end
|
15
9
|
end
|
16
10
|
|
17
|
-
|
18
|
-
@init_args.key? :parameters
|
19
|
-
end
|
11
|
+
private
|
20
12
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
13
|
+
def operation_args
|
14
|
+
operation_args = @args.slice(
|
15
|
+
:amount,
|
16
|
+
:from,
|
17
|
+
:to,
|
18
|
+
:gas_limit,
|
19
|
+
:storage_limit,
|
20
|
+
:fee,
|
21
|
+
:counter
|
22
|
+
)
|
23
|
+
operation_args[:parameters] = parameters if has_parameters?
|
24
24
|
|
25
|
-
|
26
|
-
:transaction
|
25
|
+
operation_args
|
27
26
|
end
|
28
27
|
|
29
|
-
|
28
|
+
def has_parameters?
|
29
|
+
@args.key? :parameters
|
30
|
+
end
|
30
31
|
|
31
|
-
def
|
32
|
-
|
33
|
-
gas_limit: 0.1,
|
34
|
-
storage_limit: 0.006,
|
35
|
-
fee: 0.05
|
36
|
-
}
|
32
|
+
def parameters
|
33
|
+
(@args[:parameters].is_a? String) ? encode_args(@args[:parameters]) : @args[:parameters]
|
37
34
|
end
|
38
35
|
end
|
39
36
|
end
|
@@ -1,29 +1,31 @@
|
|
1
1
|
class TezosClient
|
2
2
|
class TransactionsOperation < Operation
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
def rpc_operation_args
|
4
|
+
@rpc_operation_args ||= begin
|
5
|
+
OperationArray.new(
|
6
|
+
operations: operations,
|
7
|
+
secret_key: @args.fetch(:secret_key),
|
8
|
+
from: @args.fetch(:from),
|
9
|
+
rpc_interface: rpc_interface,
|
10
|
+
liquidity_interface: liquidity_interface
|
11
|
+
).rpc_operation_args
|
12
|
+
end
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
15
|
+
def operations
|
16
|
+
@args[:amounts].map do |destination, amount|
|
17
|
+
{
|
18
|
+
kind: :transaction,
|
19
|
+
amount: amount,
|
20
|
+
to: destination
|
21
|
+
}.merge(
|
22
|
+
@args.slice(
|
23
|
+
:gas_limit,
|
24
|
+
:storage_limit,
|
25
|
+
:fee
|
26
|
+
)
|
27
|
+
)
|
28
|
+
end
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -7,6 +7,7 @@ require_relative "rpc_interface/monitor"
|
|
7
7
|
require_relative "rpc_interface/contracts"
|
8
8
|
require_relative "rpc_interface/context"
|
9
9
|
require_relative "rpc_interface/helper"
|
10
|
+
require_relative "rpc_interface/operations"
|
10
11
|
require_relative "rpc_interface/request_manager"
|
11
12
|
require_relative "rpc_interface/blocks"
|
12
13
|
|
@@ -17,6 +18,7 @@ class TezosClient
|
|
17
18
|
include Contracts
|
18
19
|
include Context
|
19
20
|
include Helper
|
21
|
+
include Operations
|
20
22
|
include RequestManager
|
21
23
|
include Blocks
|
22
24
|
|
@@ -11,42 +11,29 @@ class TezosClient
|
|
11
11
|
amount: args.fetch(:amount).to_satoshi.to_s,
|
12
12
|
source: args.fetch(:from),
|
13
13
|
destination: args.fetch(:to),
|
14
|
-
gas_limit: args.fetch(:gas_limit).to_satoshi.to_s,
|
15
|
-
storage_limit: args.fetch(:storage_limit).to_satoshi.to_s,
|
16
|
-
counter: args
|
17
|
-
fee: args.fetch(:fee).to_satoshi.to_s
|
14
|
+
gas_limit: args.fetch(:gas_limit, 0.1).to_satoshi.to_s,
|
15
|
+
storage_limit: args.fetch(:storage_limit, 0.006).to_satoshi.to_s,
|
16
|
+
counter: counter(args).to_s,
|
17
|
+
fee: args.fetch(:fee, 0.05).to_satoshi.to_s
|
18
18
|
}
|
19
19
|
operation[:parameters] = args[:parameters] if args[:parameters]
|
20
20
|
operation
|
21
21
|
end
|
22
22
|
|
23
|
-
def transactions_operation(args)
|
24
|
-
args[:amounts].map.with_index do |(destination, amount), index|
|
25
|
-
{
|
26
|
-
kind: "transaction",
|
27
|
-
amount: amount.to_satoshi.to_s,
|
28
|
-
source: args.fetch(:from),
|
29
|
-
destination: destination,
|
30
|
-
gas_limit: args.fetch(:gas_limit).to_satoshi.to_s,
|
31
|
-
storage_limit: args.fetch(:storage_limit).to_satoshi.to_s,
|
32
|
-
counter: (args.fetch(:counter) + index).to_s,
|
33
|
-
fee: args.fetch(:fee).to_satoshi.to_s
|
34
|
-
}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
23
|
def origination_operation(args)
|
24
|
+
manager = (args.fetch(:manager) { args.fetch(:from) })
|
25
|
+
|
39
26
|
operation = {
|
40
27
|
kind: "origination",
|
41
|
-
delegatable: args.fetch(:delegatable),
|
42
|
-
spendable: args.fetch(:spendable),
|
43
|
-
balance: args.fetch(:amount).to_satoshi.to_s,
|
28
|
+
delegatable: args.fetch(:delegatable, false),
|
29
|
+
spendable: args.fetch(:spendable, false),
|
30
|
+
balance: args.fetch(:amount,0).to_satoshi.to_s,
|
44
31
|
source: args.fetch(:from),
|
45
|
-
gas_limit: args.fetch(:gas_limit).to_satoshi.to_s,
|
46
|
-
storage_limit: args.fetch(:storage_limit).to_satoshi.to_s,
|
47
|
-
counter: args
|
48
|
-
fee: args.fetch(:fee).to_satoshi.to_s,
|
49
|
-
managerPubkey:
|
32
|
+
gas_limit: args.fetch(:gas_limit, 0.1).to_satoshi.to_s,
|
33
|
+
storage_limit: args.fetch(:storage_limit, 0.06).to_satoshi.to_s,
|
34
|
+
counter: counter(args).to_s,
|
35
|
+
fee: args.fetch(:fee, 0.05).to_satoshi.to_s,
|
36
|
+
managerPubkey: manager
|
50
37
|
}
|
51
38
|
|
52
39
|
operation[:script] = args[:script] if args[:script]
|
@@ -66,75 +53,32 @@ class TezosClient
|
|
66
53
|
{
|
67
54
|
kind: "reveal",
|
68
55
|
source: args.fetch(:from),
|
69
|
-
fee: args.fetch(:fee).to_satoshi.to_s,
|
70
|
-
counter: args
|
71
|
-
gas_limit: args.fetch(:gas_limit).to_satoshi.to_s,
|
72
|
-
storage_limit: args.fetch(:storage_limit).to_satoshi.to_s,
|
56
|
+
fee: args.fetch(:fee, 0.05).to_satoshi.to_s,
|
57
|
+
counter: counter(args).to_s,
|
58
|
+
gas_limit: args.fetch(:gas_limit, 0.1).to_satoshi.to_s,
|
59
|
+
storage_limit: args.fetch(:storage_limit, 0).to_satoshi.to_s,
|
73
60
|
public_key: args.fetch(:public_key)
|
74
61
|
}
|
75
62
|
end
|
76
63
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
%w(origination transaction).each do |operation_kind|
|
83
|
-
# preapply_transaction, preapply_origination ...
|
84
|
-
define_method "preapply_#{operation_kind}" do |args|
|
85
|
-
preapply_operation(operation_kind: operation_kind, **args)
|
86
|
-
end
|
87
|
-
|
88
|
-
# run_transaction, run_origination ...
|
89
|
-
define_method "run_#{operation_kind}" do |args|
|
90
|
-
run_operation(operation_kind: operation_kind, **args)
|
91
|
-
end
|
92
|
-
|
93
|
-
# forge_transaction, forge_origination ...
|
94
|
-
define_method "forge_#{operation_kind}" do |args|
|
95
|
-
forge_operation(operation_kind: operation_kind, **args)
|
64
|
+
def counter(args)
|
65
|
+
args.fetch(:counter) do
|
66
|
+
contract_counter(args.fetch(:from)) + 1
|
96
67
|
end
|
97
68
|
end
|
98
69
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
protocol: args.fetch(:protocol),
|
103
|
-
branch: args.fetch(:branch),
|
104
|
-
contents: contents(args),
|
105
|
-
signature: args.fetch(:signature)
|
106
|
-
}
|
107
|
-
|
108
|
-
res = post("chains/main/blocks/head/helpers/preapply/operations",
|
109
|
-
[content])
|
110
|
-
res[0]["contents"][0]
|
111
|
-
end
|
112
|
-
|
113
|
-
def run_operation(args)
|
114
|
-
content = {
|
115
|
-
branch: args.fetch(:branch),
|
116
|
-
contents: contents(args),
|
117
|
-
signature: args.fetch(:signature)
|
118
|
-
}
|
119
|
-
res = post("chains/main/blocks/head/helpers/scripts/run_operation", content)
|
120
|
-
res["contents"][0]
|
121
|
-
end
|
122
|
-
|
123
|
-
def forge_operation(args)
|
124
|
-
content = {
|
125
|
-
branch: args.fetch(:branch),
|
126
|
-
contents: contents(args)
|
127
|
-
}
|
128
|
-
post("chains/main/blocks/head/helpers/forge/operations", content)
|
70
|
+
def preapply_operation(operation:, **options)
|
71
|
+
res = preapply_operations(operations: [operation], **options)
|
72
|
+
res[0]
|
129
73
|
end
|
130
74
|
|
131
|
-
def
|
132
|
-
|
75
|
+
def run_operation(operation:, **options)
|
76
|
+
res = run_operations(operations: [operation], **options)
|
77
|
+
res[0]
|
133
78
|
end
|
134
79
|
|
135
|
-
def
|
136
|
-
operation
|
137
|
-
(operation.is_a?(Array)) ? operation : [operation]
|
80
|
+
def forge_operation(operation:, **options)
|
81
|
+
forge_operations(operations: [operation], **options)
|
138
82
|
end
|
139
83
|
end
|
140
84
|
end
|