stellar_core_commander 0.0.2 → 0.0.3
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/.gitignore +1 -0
- data/examples/allow_trust.rb +24 -0
- data/examples/pathed_payment.rb +2 -2
- data/examples/trade.rb +31 -0
- data/lib/stellar_core_commander.rb +1 -0
- data/lib/stellar_core_commander/operation_builder.rb +138 -0
- data/lib/stellar_core_commander/process.rb +1 -1
- data/lib/stellar_core_commander/transactor.rb +65 -96
- data/lib/stellar_core_commander/version.rb +1 -1
- data/stellar_core_commander.gemspec +1 -1
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69125ec58eb849d896c5fc814cc969c81a1cb652
|
4
|
+
data.tar.gz: b60d9215848229eb69ead17594c59a84147bc8f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c14d87026ec3a2d740a92467f20825f748ac288b29d9c40c9f9b6d26f41c61991da9e46c92cd72e1772f4ba82baca6f644201dc98ce3bea1e7f88b52998f7c21
|
7
|
+
data.tar.gz: ff2c49f39722e4e717be0567aa29d2d01d6402942f7cb3b28dc039b702465658cf5878a204c70d88f34be30c5a6fa97b059b1fa8e0a57c0713cbab3afd4988bd
|
data/.gitignore
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
account :usd_gateway
|
2
|
+
account :scott
|
3
|
+
account :andrew
|
4
|
+
|
5
|
+
payment :master, :usd_gateway, [:native, 1000_000000]
|
6
|
+
payment :master, :scott, [:native, 1000_000000]
|
7
|
+
payment :master, :andrew, [:native, 1000_000000]
|
8
|
+
|
9
|
+
close_ledger
|
10
|
+
|
11
|
+
require_trust_auth :usd_gateway
|
12
|
+
|
13
|
+
close_ledger
|
14
|
+
|
15
|
+
trust :scott, :usd_gateway, "USD"
|
16
|
+
trust :andrew, :usd_gateway, "USD"
|
17
|
+
|
18
|
+
close_ledger
|
19
|
+
|
20
|
+
allow_trust :usd_gateway, :scott, "USD"
|
21
|
+
|
22
|
+
# close_ledger
|
23
|
+
|
24
|
+
# payment :usd_gateway, :scott, ["USD", :usd_gateway, 1000_000000]
|
data/examples/pathed_payment.rb
CHANGED
@@ -27,8 +27,8 @@ payment :eur_gateway, :bartek, ["EUR", :eur_gateway, 1000_000000]
|
|
27
27
|
|
28
28
|
close_ledger
|
29
29
|
|
30
|
-
offer :
|
30
|
+
offer :andrew, {buy:["USD", :usd_gateway], with:["EUR", :eur_gateway]}, 200_000000, 1.0
|
31
31
|
|
32
32
|
close_ledger
|
33
33
|
|
34
|
-
payment :scott, :bartek, ["EUR", :eur_gateway, 10], path: [["USD", :usd_gateway]
|
34
|
+
payment :scott, :bartek, ["EUR", :eur_gateway, 10], path: [["USD", :usd_gateway]]
|
data/examples/trade.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
account :usd_gateway
|
2
|
+
account :eur_gateway
|
3
|
+
account :scott
|
4
|
+
account :bartek
|
5
|
+
|
6
|
+
payment :master, :usd_gateway, [:native, 1000_000000]
|
7
|
+
payment :master, :eur_gateway, [:native, 1000_000000]
|
8
|
+
|
9
|
+
payment :master, :scott, [:native, 1000_000000]
|
10
|
+
payment :master, :bartek, [:native, 1000_000000]
|
11
|
+
|
12
|
+
close_ledger
|
13
|
+
|
14
|
+
trust :scott, :usd_gateway, "USD"
|
15
|
+
trust :bartek, :usd_gateway, "USD"
|
16
|
+
trust :scott, :eur_gateway, "EUR"
|
17
|
+
trust :bartek, :eur_gateway, "EUR"
|
18
|
+
|
19
|
+
close_ledger
|
20
|
+
|
21
|
+
payment :usd_gateway, :scott, ["USD", :usd_gateway, 1000_000000]
|
22
|
+
payment :eur_gateway, :bartek, ["EUR", :eur_gateway, 1000_000000]
|
23
|
+
|
24
|
+
close_ledger
|
25
|
+
|
26
|
+
offer :bartek, {buy:["USD", :usd_gateway], with:["EUR", :eur_gateway]}, 1000_000000, 1.0
|
27
|
+
|
28
|
+
close_ledger
|
29
|
+
|
30
|
+
offer :scott, {sell:["USD", :usd_gateway], for:["EUR", :eur_gateway]}, 500_000000, 1.0
|
31
|
+
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module StellarCoreCommander
|
2
|
+
|
3
|
+
class OperationBuilder
|
4
|
+
include Contracts
|
5
|
+
|
6
|
+
Currency = [String, Symbol]
|
7
|
+
Amount = Any #TODO
|
8
|
+
|
9
|
+
OfferCurrencies = Or[
|
10
|
+
{sell:Currency, for: Currency},
|
11
|
+
{buy:Currency, with: Currency},
|
12
|
+
]
|
13
|
+
|
14
|
+
Contract Transactor => Any
|
15
|
+
def initialize(transactor)
|
16
|
+
@transactor = transactor
|
17
|
+
end
|
18
|
+
|
19
|
+
Contract Symbol, Symbol, Amount, Or[{}, {path: Any}] => Any
|
20
|
+
def payment(from, to, amount, options={})
|
21
|
+
from = get_account from
|
22
|
+
to = get_account to
|
23
|
+
|
24
|
+
if amount.first != :native
|
25
|
+
amount = [:iso4217] + amount
|
26
|
+
amount[2] = get_account(amount[2])
|
27
|
+
amount[1] = amount[1].ljust(4, "\x00")
|
28
|
+
end
|
29
|
+
|
30
|
+
attrs = {
|
31
|
+
account: from,
|
32
|
+
destination: to,
|
33
|
+
sequence: next_sequence(from),
|
34
|
+
amount: amount,
|
35
|
+
}
|
36
|
+
|
37
|
+
if options[:path]
|
38
|
+
attrs[:path] = options[:path].map{|p| make_currency p}
|
39
|
+
end
|
40
|
+
|
41
|
+
Stellar::Transaction.payment(attrs).to_envelope(from)
|
42
|
+
end
|
43
|
+
|
44
|
+
Contract Symbol, Symbol, String => Any
|
45
|
+
def trust(account, issuer, code)
|
46
|
+
change_trust account, issuer, code, (2**63)-1
|
47
|
+
end
|
48
|
+
|
49
|
+
Contract Symbol, Symbol, String, Num => Any
|
50
|
+
def change_trust(account, issuer, code, limit)
|
51
|
+
account = get_account account
|
52
|
+
|
53
|
+
Stellar::Transaction.change_trust({
|
54
|
+
account: account,
|
55
|
+
sequence: next_sequence(account),
|
56
|
+
line: make_currency([code, issuer]),
|
57
|
+
limit: limit
|
58
|
+
}).to_envelope(account)
|
59
|
+
end
|
60
|
+
|
61
|
+
Contract Symbol, Symbol, String, Num => Any
|
62
|
+
def allow_trust(account, trustor, code)
|
63
|
+
currency = make_currency([code, account])
|
64
|
+
account = get_account account
|
65
|
+
trustor = get_account trustor
|
66
|
+
|
67
|
+
|
68
|
+
Stellar::Transaction.allow_trust({
|
69
|
+
account: account,
|
70
|
+
sequence: next_sequence(account),
|
71
|
+
currency: currency,
|
72
|
+
trustor: trustor,
|
73
|
+
authorize: true,
|
74
|
+
}).to_envelope(account)
|
75
|
+
end
|
76
|
+
|
77
|
+
Contract Symbol, OfferCurrencies, Num, Num => Any
|
78
|
+
def offer(account, currencies, amount, price)
|
79
|
+
account = get_account account
|
80
|
+
|
81
|
+
if currencies.has_key?(:sell)
|
82
|
+
taker_pays = make_currency currencies[:for]
|
83
|
+
taker_gets = make_currency currencies[:sell]
|
84
|
+
else
|
85
|
+
taker_pays = make_currency currencies[:buy]
|
86
|
+
taker_gets = make_currency currencies[:with]
|
87
|
+
end
|
88
|
+
|
89
|
+
Stellar::Transaction.create_offer({
|
90
|
+
account: account,
|
91
|
+
sequence: next_sequence(account),
|
92
|
+
taker_gets: taker_gets,
|
93
|
+
taker_pays: taker_pays,
|
94
|
+
amount: amount,
|
95
|
+
price: price,
|
96
|
+
}).to_envelope(account)
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
Contract Symbol => Any
|
101
|
+
def require_trust_auth(account)
|
102
|
+
set_flags account, [:auth_required_flag]
|
103
|
+
end
|
104
|
+
|
105
|
+
Contract Symbol, ArrayOf[Symbol] => Any
|
106
|
+
def set_flags(account, flags)
|
107
|
+
account = get_account account
|
108
|
+
|
109
|
+
tx = Stellar::Transaction.set_options({
|
110
|
+
account: account,
|
111
|
+
sequence: next_sequence(account),
|
112
|
+
set: make_account_flags(flags),
|
113
|
+
})
|
114
|
+
|
115
|
+
tx.to_envelope(account)
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
delegate :get_account, to: :@transactor
|
121
|
+
delegate :next_sequence, to: :@transactor
|
122
|
+
|
123
|
+
Contract Currency => [Symbol, String, Stellar::KeyPair]
|
124
|
+
def make_currency(input)
|
125
|
+
code, issuer = *input
|
126
|
+
code = code.ljust(4, "\x00")
|
127
|
+
issuer = get_account issuer
|
128
|
+
|
129
|
+
[:iso4217, code, issuer]
|
130
|
+
end
|
131
|
+
|
132
|
+
def make_account_flags(flags=nil)
|
133
|
+
flags ||= []
|
134
|
+
flags.map{|f| Stellar::AccountFlags.send(f)}
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
@@ -148,7 +148,7 @@ module StellarCoreCommander
|
|
148
148
|
body = ActiveSupport::JSON.decode(response.body)
|
149
149
|
|
150
150
|
unless body["wasReceived"] == true
|
151
|
-
raise "transaction failed: #{body
|
151
|
+
raise "transaction failed: #{body.inspect}"
|
152
152
|
end
|
153
153
|
|
154
154
|
hex_tr = body["result"]
|
@@ -11,19 +11,16 @@ module StellarCoreCommander
|
|
11
11
|
|
12
12
|
class FailedTransaction < StandardError ; end
|
13
13
|
|
14
|
-
Currency = [String, Symbol]
|
15
|
-
Amount = Any #TODO
|
16
|
-
|
17
14
|
Contract Process => Any
|
18
15
|
def initialize(process)
|
19
16
|
@process = process
|
20
17
|
@named = {}.with_indifferent_access
|
21
18
|
@unverified = []
|
19
|
+
@operation_builder = OperationBuilder.new(self)
|
22
20
|
account :master, Stellar::KeyPair.from_raw_seed("allmylifemyhearthasbeensearching")
|
23
21
|
end
|
24
22
|
|
25
23
|
Contract String => Any
|
26
|
-
|
27
24
|
#
|
28
25
|
# Runs the provided recipe against the process identified by @process
|
29
26
|
#
|
@@ -53,85 +50,59 @@ module StellarCoreCommander
|
|
53
50
|
add_named name, keypair
|
54
51
|
end
|
55
52
|
|
56
|
-
Contract Symbol, Symbol, Amount, Or[{}, {path: Any}] => Any
|
57
|
-
def payment(from, to, amount, options={})
|
58
|
-
from = get_account from
|
59
|
-
to = get_account to
|
60
|
-
|
61
|
-
if amount.first != :native
|
62
|
-
amount = [:iso4217] + amount
|
63
|
-
amount[2] = get_account(amount[2])
|
64
|
-
amount[1] = amount[1].ljust(4, "\x00")
|
65
|
-
end
|
66
|
-
|
67
|
-
attrs = {
|
68
|
-
account: from,
|
69
|
-
destination: to,
|
70
|
-
sequence: next_sequence(from),
|
71
|
-
amount: amount,
|
72
|
-
}
|
73
53
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
envelope =
|
54
|
+
#
|
55
|
+
# @see StellarCoreCommander::OperationBuilder#payment
|
56
|
+
def payment(*args)
|
57
|
+
envelope = @operation_builder.payment(*args)
|
78
58
|
|
79
59
|
submit_transaction envelope do |result|
|
80
60
|
payment_result = result.result.results!.first.tr!.payment_result!
|
81
|
-
|
82
61
|
raise FailedTransaction unless payment_result.code.value >= 0
|
83
62
|
end
|
84
63
|
end
|
85
64
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
def change_trust(account, issuer, code, limit)
|
93
|
-
account = get_account account
|
94
|
-
|
95
|
-
tx = Stellar::Transaction.change_trust({
|
96
|
-
account: account,
|
97
|
-
sequence: next_sequence(account),
|
98
|
-
line: make_currency([code, issuer]),
|
99
|
-
limit: limit
|
100
|
-
})
|
101
|
-
|
102
|
-
envelope = tx.to_envelope(account)
|
65
|
+
#
|
66
|
+
# @see StellarCoreCommander::OperationBuilder#trust
|
67
|
+
def trust(*args)
|
68
|
+
envelope = @operation_builder.trust(*args)
|
69
|
+
submit_transaction envelope
|
70
|
+
end
|
103
71
|
|
72
|
+
#
|
73
|
+
# @see StellarCoreCommander::OperationBuilder#change_trust
|
74
|
+
def change_trust(*args)
|
75
|
+
envelope = @operation_builder.change_trust(*args)
|
104
76
|
submit_transaction envelope
|
105
77
|
end
|
106
78
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
tx = Stellar::Transaction.create_offer({
|
114
|
-
account: account,
|
115
|
-
sequence: next_sequence(account),
|
116
|
-
taker_gets: taker_gets,
|
117
|
-
taker_pays: taker_pays,
|
118
|
-
amount: amount,
|
119
|
-
price: price,
|
120
|
-
})
|
121
|
-
|
122
|
-
envelope = tx.to_envelope(account)
|
79
|
+
#
|
80
|
+
# @see StellarCoreCommander::OperationBuilder#offer
|
81
|
+
def offer(*args)
|
82
|
+
envelope = @operation_builder.offer(*args)
|
83
|
+
submit_transaction envelope
|
84
|
+
end
|
123
85
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
86
|
+
#
|
87
|
+
# @see StellarCoreCommander::OperationBuilder#require_trust_auth
|
88
|
+
def require_trust_auth(*args)
|
89
|
+
envelope = @operation_builder.require_trust_auth(*args)
|
90
|
+
submit_transaction envelope
|
91
|
+
end
|
131
92
|
|
132
|
-
|
133
|
-
|
93
|
+
#
|
94
|
+
# @see StellarCoreCommander::OperationBuilder#set_flags
|
95
|
+
def set_flags(*args)
|
96
|
+
envelope = @operation_builder.set_flags(*args)
|
97
|
+
submit_transaction envelope
|
134
98
|
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# @see StellarCoreCommander::OperationBuilder#allow_trust
|
102
|
+
def allow_trust(*args)
|
103
|
+
envelope = @operation_builder.allow_trust(*args)
|
104
|
+
submit_transaction envelope
|
105
|
+
end
|
135
106
|
|
136
107
|
Contract None => Any
|
137
108
|
#
|
@@ -147,8 +118,8 @@ module StellarCoreCommander
|
|
147
118
|
result = validate_transaction envelope
|
148
119
|
after_confirmation.call(result) if after_confirmation
|
149
120
|
rescue FailedTransaction
|
150
|
-
require 'pry'; binding.pry
|
151
121
|
$stderr.puts "Failed to validate tx: #{Convert.to_hex envelope.tx.hash}"
|
122
|
+
$stderr.puts "failed result: #{result.to_xdr(:hex)}"
|
152
123
|
exit 1
|
153
124
|
end
|
154
125
|
end
|
@@ -157,25 +128,6 @@ module StellarCoreCommander
|
|
157
128
|
@unverified.clear
|
158
129
|
end
|
159
130
|
|
160
|
-
private
|
161
|
-
Contract Symbol, Any => Any
|
162
|
-
def add_named(name, object)
|
163
|
-
if @named.has_key?(name)
|
164
|
-
raise ArgumentError, "#{name} is already registered"
|
165
|
-
end
|
166
|
-
|
167
|
-
@named[name] = object
|
168
|
-
end
|
169
|
-
|
170
|
-
Contract Stellar::TransactionEnvelope, Or[nil, Proc] => Any
|
171
|
-
def submit_transaction(envelope, &after_confirmation)
|
172
|
-
hex = envelope.to_xdr(:hex)
|
173
|
-
@process.submit_transaction hex
|
174
|
-
|
175
|
-
# submit to process
|
176
|
-
@unverified << [envelope, after_confirmation]
|
177
|
-
end
|
178
|
-
|
179
131
|
Contract Symbol => Stellar::KeyPair
|
180
132
|
def get_account(name)
|
181
133
|
@named[name].tap do |found|
|
@@ -193,13 +145,23 @@ module StellarCoreCommander
|
|
193
145
|
base_sequence + inflight_count + 1
|
194
146
|
end
|
195
147
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
148
|
+
private
|
149
|
+
Contract Symbol, Any => Any
|
150
|
+
def add_named(name, object)
|
151
|
+
if @named.has_key?(name)
|
152
|
+
raise ArgumentError, "#{name} is already registered"
|
153
|
+
end
|
154
|
+
|
155
|
+
@named[name] = object
|
156
|
+
end
|
157
|
+
|
158
|
+
Contract Stellar::TransactionEnvelope, Or[nil, Proc] => Any
|
159
|
+
def submit_transaction(envelope, &after_confirmation)
|
160
|
+
hex = envelope.to_xdr(:hex)
|
161
|
+
@process.submit_transaction hex
|
201
162
|
|
202
|
-
|
163
|
+
# submit to process
|
164
|
+
@unverified << [envelope, after_confirmation]
|
203
165
|
end
|
204
166
|
|
205
167
|
Contract Stellar::TransactionEnvelope => Stellar::TransactionResult
|
@@ -209,12 +171,19 @@ module StellarCoreCommander
|
|
209
171
|
|
210
172
|
base64_result = @process.transaction_result(hex_hash)
|
211
173
|
|
212
|
-
raise "couldn't
|
174
|
+
raise "couldn't find result for #{hex_hash}" if base64_result.blank?
|
213
175
|
|
214
176
|
raw_result = Convert.from_base64(base64_result)
|
215
177
|
|
216
178
|
pair = Stellar::TransactionResultPair.from_xdr(raw_result)
|
217
|
-
pair.result
|
179
|
+
result = pair.result
|
180
|
+
|
181
|
+
# ensure success for every operation
|
182
|
+
expected = Stellar::TransactionResultCode.tx_success
|
183
|
+
actual = result.result.code
|
184
|
+
raise "transaction failed" unless expected == actual
|
185
|
+
|
186
|
+
result
|
218
187
|
end
|
219
188
|
|
220
189
|
end
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency "stellar-base", "
|
20
|
+
spec.add_dependency "stellar-base", "= 0.0.5"
|
21
21
|
spec.add_dependency "slop", "~> 3.6.0"
|
22
22
|
spec.add_dependency "faraday", "~> 0.9.1"
|
23
23
|
spec.add_dependency "faraday_middleware", "~> 0.9.1"
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stellar_core_commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Fleckenstein
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stellar-base
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: slop
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,12 +178,15 @@ files:
|
|
178
178
|
- README.md
|
179
179
|
- Rakefile
|
180
180
|
- bin/scc
|
181
|
+
- examples/allow_trust.rb
|
181
182
|
- examples/non_native_payment.rb
|
182
183
|
- examples/pathed_payment.rb
|
183
184
|
- examples/simple_payment.rb
|
185
|
+
- examples/trade.rb
|
184
186
|
- lib/stellar_core_commander.rb
|
185
187
|
- lib/stellar_core_commander/commander.rb
|
186
188
|
- lib/stellar_core_commander/convert.rb
|
189
|
+
- lib/stellar_core_commander/operation_builder.rb
|
187
190
|
- lib/stellar_core_commander/process.rb
|
188
191
|
- lib/stellar_core_commander/transactor.rb
|
189
192
|
- lib/stellar_core_commander/version.rb
|