stellar-sdk 0.8.0 → 0.9.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{LICENSE.txt → LICENSE} +0 -0
- data/README.md +4 -5
- data/lib/stellar-sdk.rb +2 -3
- data/lib/stellar/account.rb +16 -18
- data/lib/stellar/amount.rb +9 -13
- data/lib/stellar/client.rb +153 -113
- data/lib/stellar/horizon/problem.rb +14 -16
- data/lib/stellar/sep10.rb +56 -93
- data/lib/stellar/transaction_page.rb +4 -6
- data/lib/stellar/version.rb +1 -1
- metadata +13 -217
- data/.github/CODEOWNERS +0 -2
- data/.gitignore +0 -17
- data/.travis.yml +0 -20
- data/.yardopts +0 -7
- data/CONTRIBUTING.md +0 -48
- data/Gemfile +0 -14
- data/Guardfile +0 -5
- data/Rakefile +0 -3
- data/examples/01_get_funded.rb +0 -37
- data/examples/02_payment.rb +0 -15
- data/examples/03_transaction_history.rb +0 -21
- data/examples/04_setting_trust.rb +0 -1
- data/examples/05_fiat_payment.rb +0 -13
- data/examples/06_fund_testnet_friendbot.rb +0 -15
- data/examples/07_sep10.rb +0 -125
- data/ruby-stellar-sdk.gemspec +0 -35
- data/spec/config.yml.sample +0 -12
- data/spec/fixtures/vcr_cassettes/Stellar_Account/_lookup/should_handle_404_request_when_performing_federation_lookup.yml +0 -133
- data/spec/fixtures/vcr_cassettes/Stellar_Account/_lookup/should_handle_domains_that_are_not_federation_servers.yml +0 -44
- data/spec/fixtures/vcr_cassettes/Stellar_Account/_lookup/should_peforms_federation_lookup.yml +0 -85
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_account_info/returns_the_current_details_for_the_account.yml +0 -190
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_account_merge/merges_source_account_into_destination.yml +0 -714
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_change_trust/given_an_asset_described_as_an_array/creates_updates_or_deletes_a_trustline.yml +0 -1156
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_create_account/creates_the_account.yml +0 -323
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_friendbot/requests_for_XLM_from_a_friendbot.yml +0 -246
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_load_account/loads_successfully.yml +0 -226
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_send_payment/alphanum12_asset/sends_a_alphanum12_asset_to_the_destination.yml +0 -747
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_send_payment/alphanum4_asset/sends_a_alphanum4_asset_to_the_destination.yml +0 -747
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_send_payment/memo/accepts_the_memo_attribute.yml +0 -725
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_send_payment/native_asset/sends_a_native_payment_to_the_account.yml +0 -562
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_send_payment/using_a_payment_channel/sends_a_payment_account_through_a_channel_account.yml +0 -757
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_send_payment/using_a_payment_channel/sends_a_payment_when_the_channel_is_the_same_as_from_.yml +0 -642
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_transactions/account_transactions/accepts_a_cursor_to_return_less_data.yml +0 -94
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_transactions/account_transactions/returns_a_list_of_transaction_for_an_account.yml +0 -94
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_transactions/all_transactions/accepts_a_cursor_to_return_less_data.yml +0 -94
- data/spec/fixtures/vcr_cassettes/Stellar_Client/_transactions/all_transactions/returns_a_list_of_transactions.yml +0 -94
- data/spec/lib/stellar/account_spec.rb +0 -59
- data/spec/lib/stellar/amount_spec.rb +0 -70
- data/spec/lib/stellar/client_spec.rb +0 -430
- data/spec/lib/stellar/sep10_spec.rb +0 -1148
- data/spec/spec_helper.rb +0 -14
- data/spec/support/config.rb +0 -3
- data/spec/support/vcr.rb +0 -10
- data/tasks/rspec.rake +0 -6
- data/tasks/travis.rake +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3da720d62d3ed03b2eba1ac3e1bcc733da7013952120bcbc2feb31ec53c2eb90
|
4
|
+
data.tar.gz: d23901b3e1d9b6d3107cdeae940dda89ca19c180efd3c63be07823493c5c147e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c944e5f554aa13148f1268d6a7d5adaf1f61f942234ae6c87eebce880cc9f419edbfecb384bb76129ef41782c6647667ece34b5bb9fab8b18e04a6e7de068532
|
7
|
+
data.tar.gz: dc25b0c39c815dd3817272547d98df7400ad97f55c70e7adc1b72b55661f16d62ea733413b0375c77562586cb025dcbc1b67b049418ac4bb9224e1ae977eaad8
|
data/{LICENSE.txt → LICENSE}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -7,19 +7,18 @@ This library helps you to integrate your application into the [Stellar network](
|
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
|
-
Add this
|
10
|
+
Add this lines to your application's Gemfile:
|
11
11
|
|
12
12
|
```ruby
|
13
13
|
gem 'stellar-sdk'
|
14
|
+
gem 'xdr', git: 'https://github.com/stellar/ruby-xdr.git', tag: 'v3.0.1'
|
14
15
|
```
|
15
16
|
|
16
17
|
And then execute:
|
17
18
|
|
18
19
|
$ bundle
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
$ gem install stellar-sdk
|
20
|
+
|
21
|
+
**Note** we need to add such explicit `xdr` dependency, because version 3.0.1 is not on RubyGems yet. When it's published, you can remove this line
|
23
22
|
|
24
23
|
Also requires libsodium. Installable via `brew install libsodium` on OS X.
|
25
24
|
|
data/lib/stellar-sdk.rb
CHANGED
data/lib/stellar/account.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "toml-rb"
|
2
|
+
require "uri"
|
3
|
+
require "faraday"
|
4
|
+
require "json"
|
5
5
|
|
6
6
|
module Stellar
|
7
7
|
class Account
|
8
|
-
include Contracts
|
9
|
-
|
10
8
|
delegate :address, to: :keypair
|
11
9
|
|
12
10
|
def self.random
|
@@ -25,7 +23,7 @@ module Stellar
|
|
25
23
|
end
|
26
24
|
|
27
25
|
def self.lookup(federated_name)
|
28
|
-
_, domain = federated_name.split(
|
26
|
+
_, domain = federated_name.split("*")
|
29
27
|
if domain.nil?
|
30
28
|
raise InvalidFederationAddress.new
|
31
29
|
end
|
@@ -33,25 +31,25 @@ module Stellar
|
|
33
31
|
domain_req = Faraday.new("https://#{domain}/.well-known/stellar.toml").get
|
34
32
|
|
35
33
|
unless domain_req.status == 200
|
36
|
-
raise InvalidStellarDomain.new(
|
34
|
+
raise InvalidStellarDomain.new("Domain does not contain stellar.toml file")
|
37
35
|
end
|
38
|
-
|
36
|
+
|
39
37
|
fed_server_url = TomlRB.parse(domain_req.body)["FEDERATION_SERVER"]
|
40
38
|
if fed_server_url.nil?
|
41
|
-
raise InvalidStellarTOML.new(
|
39
|
+
raise InvalidStellarTOML.new("Invalid Stellar TOML file")
|
42
40
|
end
|
43
41
|
|
44
|
-
unless fed_server_url
|
45
|
-
raise InvalidFederationURL.new(
|
42
|
+
unless fed_server_url&.match?(URI::DEFAULT_PARSER.make_regexp)
|
43
|
+
raise InvalidFederationURL.new("Invalid Federation Server URL")
|
46
44
|
end
|
47
45
|
|
48
|
-
lookup_req = Faraday.new(fed_server_url).get
|
46
|
+
lookup_req = Faraday.new(fed_server_url).get { |req|
|
49
47
|
req.params[:q] = federated_name
|
50
|
-
req.params[:type] =
|
51
|
-
|
48
|
+
req.params[:type] = "name"
|
49
|
+
}
|
52
50
|
|
53
51
|
unless lookup_req.status == 200
|
54
|
-
raise AccountNotFound.new(
|
52
|
+
raise AccountNotFound.new("Account not found")
|
55
53
|
end
|
56
54
|
|
57
55
|
JSON.parse(lookup_req.body)["account_id"]
|
@@ -64,7 +62,7 @@ module Stellar
|
|
64
62
|
|
65
63
|
attr_reader :keypair
|
66
64
|
|
67
|
-
|
65
|
+
# @param [Stellar::KeyPair] keypair
|
68
66
|
def initialize(keypair)
|
69
67
|
@keypair = keypair
|
70
68
|
end
|
@@ -84,4 +82,4 @@ module Stellar
|
|
84
82
|
|
85
83
|
class InvalidFederationURL < StandardError
|
86
84
|
end
|
87
|
-
end
|
85
|
+
end
|
data/lib/stellar/amount.rb
CHANGED
@@ -1,25 +1,21 @@
|
|
1
1
|
module Stellar
|
2
2
|
class Amount
|
3
|
-
include Contracts
|
4
|
-
|
5
3
|
attr_reader :amount
|
6
4
|
attr_reader :asset
|
7
5
|
|
8
|
-
|
9
|
-
|
6
|
+
# @param [Fixnum] amount
|
7
|
+
# @param [Stellar::Asset] asset
|
8
|
+
def initialize(amount, asset = Stellar::Asset.native)
|
10
9
|
# TODO: how are we going to handle decimal considerations?
|
11
|
-
|
10
|
+
|
12
11
|
@amount = amount
|
13
|
-
@asset
|
12
|
+
@asset = asset
|
14
13
|
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
[Or[:alphanum4, :alphanum12], String, KeyPair, Pos],
|
19
|
-
[:native, Pos],
|
20
|
-
]
|
15
|
+
# @return [Array(Symbol, Fixnum)] in case of a native asset
|
16
|
+
# @return [Array(Symbol, String, Stellar::KeyPair, Fixnum)] in case of alphanum asset
|
21
17
|
def to_payment
|
22
|
-
case asset.type
|
18
|
+
case asset.type
|
23
19
|
when AssetType.asset_type_native
|
24
20
|
[:native, amount]
|
25
21
|
when AssetType.asset_type_credit_alphanum4
|
@@ -34,7 +30,7 @@ module Stellar
|
|
34
30
|
end
|
35
31
|
|
36
32
|
def inspect
|
37
|
-
"#<Stellar::Amount #{asset}(#{amount})>"
|
33
|
+
"#<Stellar::Amount #{asset}(#{amount})>"
|
38
34
|
end
|
39
35
|
end
|
40
36
|
end
|
data/lib/stellar/client.rb
CHANGED
@@ -1,35 +1,40 @@
|
|
1
|
-
require
|
1
|
+
require "hyperclient"
|
2
2
|
require "active_support/core_ext/object/blank"
|
3
|
-
require
|
3
|
+
require "securerandom"
|
4
4
|
|
5
5
|
module Stellar
|
6
|
-
class
|
6
|
+
class AccountRequiresMemoError < StandardError
|
7
|
+
attr_reader :account_id, :operation_index
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
def initialize(message, account_id, operation_index)
|
10
|
+
super(message)
|
11
|
+
@account_id = account_id
|
12
|
+
@operation_index = operation_index
|
13
|
+
end
|
14
|
+
end
|
11
15
|
|
16
|
+
class Client
|
12
17
|
DEFAULT_FEE = 100
|
13
18
|
|
14
|
-
HORIZON_LOCALHOST_URL =
|
15
|
-
HORIZON_MAINNET_URL =
|
16
|
-
HORIZON_TESTNET_URL =
|
17
|
-
FRIENDBOT_URL =
|
19
|
+
HORIZON_LOCALHOST_URL = "http://127.0.0.1:8000"
|
20
|
+
HORIZON_MAINNET_URL = "https://horizon.stellar.org"
|
21
|
+
HORIZON_TESTNET_URL = "https://horizon-testnet.stellar.org"
|
22
|
+
FRIENDBOT_URL = "https://friendbot.stellar.org".freeze
|
18
23
|
|
19
|
-
def self.default(options={})
|
24
|
+
def self.default(options = {})
|
20
25
|
new options.merge(
|
21
26
|
horizon: HORIZON_MAINNET_URL
|
22
27
|
)
|
23
28
|
end
|
24
29
|
|
25
|
-
def self.default_testnet(options={})
|
30
|
+
def self.default_testnet(options = {})
|
26
31
|
new options.merge(
|
27
|
-
horizon:
|
28
|
-
friendbot: HORIZON_TESTNET_URL
|
32
|
+
horizon: HORIZON_TESTNET_URL,
|
33
|
+
friendbot: HORIZON_TESTNET_URL
|
29
34
|
)
|
30
35
|
end
|
31
36
|
|
32
|
-
def self.localhost(options={})
|
37
|
+
def self.localhost(options = {})
|
33
38
|
new options.merge(
|
34
39
|
horizon: HORIZON_LOCALHOST_URL
|
35
40
|
)
|
@@ -37,10 +42,10 @@ module Stellar
|
|
37
42
|
|
38
43
|
attr_reader :horizon
|
39
44
|
|
40
|
-
|
45
|
+
# @option options [String] :horizon The Horizon server URL.
|
41
46
|
def initialize(options)
|
42
47
|
@options = options
|
43
|
-
@horizon = Hyperclient.new(options[:horizon])
|
48
|
+
@horizon = Hyperclient.new(options[:horizon]) { |client|
|
44
49
|
client.faraday_block = lambda do |conn|
|
45
50
|
conn.use Faraday::Response::RaiseError
|
46
51
|
conn.use FaradayMiddleware::FollowRedirects
|
@@ -49,40 +54,39 @@ module Stellar
|
|
49
54
|
conn.adapter :excon
|
50
55
|
end
|
51
56
|
client.headers = {
|
52
|
-
|
57
|
+
"Accept" => "application/hal+json,application/problem+json,application/json",
|
53
58
|
"X-Client-Name" => "ruby-stellar-sdk",
|
54
|
-
"X-Client-Version" => VERSION
|
59
|
+
"X-Client-Version" => VERSION
|
55
60
|
}
|
56
|
-
|
61
|
+
}
|
57
62
|
end
|
58
63
|
|
59
|
-
|
64
|
+
# @param [Stellar::Account|String] account_or_address
|
60
65
|
def account_info(account_or_address)
|
61
|
-
if account_or_address.is_a?(Stellar::Account)
|
62
|
-
|
66
|
+
account_id = if account_or_address.is_a?(Stellar::Account)
|
67
|
+
account_or_address.address
|
63
68
|
else
|
64
|
-
|
69
|
+
account_or_address
|
65
70
|
end
|
66
|
-
@horizon.account(account_id:account_id)._get
|
71
|
+
@horizon.account(account_id: account_id)._get
|
67
72
|
end
|
68
73
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
def account_merge(options={})
|
74
|
-
account = options[:account]
|
74
|
+
# @option options [Stellar::Account] :account
|
75
|
+
# @option options [Stellar::Account] :destination
|
76
|
+
def account_merge(options = {})
|
77
|
+
account = options[:account]
|
75
78
|
destination = options[:destination]
|
76
|
-
sequence
|
79
|
+
sequence = options[:sequence] || (account_info(account).sequence.to_i + 1)
|
77
80
|
|
78
|
-
transaction = Stellar::
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
81
|
+
transaction = Stellar::TransactionBuilder.new(
|
82
|
+
source_account: destination.keypair,
|
83
|
+
sequence_number: sequence
|
84
|
+
).add_operation(
|
85
|
+
Stellar::Operation.account_merge(destination: destination.keypair)
|
86
|
+
).set_timeout(0).build
|
83
87
|
|
84
|
-
|
85
|
-
|
88
|
+
envelope = transaction.to_envelope(account.keypair)
|
89
|
+
submit_transaction(tx_envelope: envelope)
|
86
90
|
end
|
87
91
|
|
88
92
|
def friendbot(account)
|
@@ -91,70 +95,65 @@ module Stellar
|
|
91
95
|
Faraday.post(uri.to_s)
|
92
96
|
end
|
93
97
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
def create_account(options={})
|
100
|
-
funder = options[:funder]
|
98
|
+
# @option options [Stellar::Account] :account
|
99
|
+
# @option options [Stellar::Account] :funder
|
100
|
+
# @option options [Integer] :starting_balance
|
101
|
+
def create_account(options = {})
|
102
|
+
funder = options[:funder]
|
101
103
|
sequence = options[:sequence] || (account_info(funder).sequence.to_i + 1)
|
102
104
|
# In the future, the fee should be grabbed from the network's last transactions,
|
103
105
|
# instead of using a hard-coded default value.
|
104
106
|
fee = options[:fee] || DEFAULT_FEE
|
105
107
|
|
106
|
-
payment = Stellar::
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
108
|
+
payment = Stellar::TransactionBuilder.new(
|
109
|
+
source_account: funder.keypair,
|
110
|
+
sequence_number: sequence,
|
111
|
+
base_fee: fee
|
112
|
+
).add_operation(
|
113
|
+
Stellar::Operation.create_account({
|
114
|
+
destination: options[:account].keypair,
|
115
|
+
starting_balance: options[:starting_balance]
|
116
|
+
})
|
117
|
+
).set_timeout(0).build
|
118
|
+
|
119
|
+
envelope = payment.to_envelope(funder.keypair)
|
120
|
+
submit_transaction(tx_envelope: envelope)
|
116
121
|
end
|
117
122
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
def send_payment(options={})
|
124
|
-
from_account = options[:from]
|
123
|
+
# @option options [Stellar::Account] :from The source account
|
124
|
+
# @option options [Stellar::Account] :to The destination account
|
125
|
+
# @option options [Stellar::Amount] :amount The amount to send
|
126
|
+
def send_payment(options = {})
|
127
|
+
from_account = options[:from]
|
125
128
|
tx_source_account = options[:transaction_source] || from_account
|
126
129
|
op_source_account = from_account if tx_source_account.present?
|
127
130
|
|
128
131
|
sequence = options[:sequence] ||
|
129
132
|
(account_info(tx_source_account).sequence.to_i + 1)
|
130
133
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
payment = Stellar::Transaction.payment(payment_details)
|
134
|
+
payment = Stellar::TransactionBuilder.new(
|
135
|
+
source_account: tx_source_account.keypair,
|
136
|
+
sequence_number: sequence
|
137
|
+
).add_operation(
|
138
|
+
Stellar::Operation.payment(
|
139
|
+
source_account: op_source_account.keypair,
|
140
|
+
destination: options[:to].keypair,
|
141
|
+
amount: options[:amount].to_payment
|
142
|
+
)
|
143
|
+
).set_memo(options[:memo]).set_timeout(0).build
|
144
144
|
|
145
145
|
signers = [tx_source_account, op_source_account].uniq(&:address)
|
146
146
|
to_envelope_args = signers.map(&:keypair)
|
147
147
|
|
148
|
-
|
149
|
-
|
148
|
+
envelope = payment.to_envelope(*to_envelope_args)
|
149
|
+
submit_transaction(tx_envelope: envelope)
|
150
150
|
end
|
151
151
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
})
|
157
|
-
def transactions(options={})
|
152
|
+
# @option options [Stellar::Account] :account
|
153
|
+
# @option options [Integer] :limit
|
154
|
+
# @option options [Integer] :cursor
|
155
|
+
# @return [Stellar::TransactionPage]
|
156
|
+
def transactions(options = {})
|
158
157
|
args = options.slice(:limit, :cursor)
|
159
158
|
|
160
159
|
resource = if options[:account]
|
@@ -167,13 +166,11 @@ module Stellar
|
|
167
166
|
TransactionPage.new(resource)
|
168
167
|
end
|
169
168
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
limit: Maybe[Integer],
|
176
|
-
] => Any)
|
169
|
+
# @param [Array(Symbol,String,Stellar::KeyPair|Stellar::Account)] asset
|
170
|
+
# @param [Stellar::Account] source
|
171
|
+
# @param [Integer] sequence
|
172
|
+
# @param [Integer] fee
|
173
|
+
# @param [Integer] limit
|
177
174
|
def change_trust(
|
178
175
|
asset:,
|
179
176
|
source:,
|
@@ -186,27 +183,79 @@ module Stellar
|
|
186
183
|
args = {
|
187
184
|
account: source.keypair,
|
188
185
|
sequence: sequence,
|
189
|
-
line: asset
|
186
|
+
line: asset
|
190
187
|
}
|
191
|
-
args[:limit] = limit
|
188
|
+
args[:limit] = limit unless limit.nil?
|
192
189
|
|
193
190
|
tx = Stellar::Transaction.change_trust(args)
|
194
191
|
|
195
|
-
|
196
|
-
|
192
|
+
envelope = tx.to_envelope(source.keypair)
|
193
|
+
submit_transaction(tx_envelope: envelope)
|
194
|
+
end
|
195
|
+
|
196
|
+
# @param [Stellar::TransactionEnvelope] tx_envelope
|
197
|
+
# @option options [Boolean] :skip_memo_required_check (false)
|
198
|
+
def submit_transaction(tx_envelope:, options: {skip_memo_required_check: false})
|
199
|
+
unless options[:skip_memo_required_check]
|
200
|
+
check_memo_required(tx_envelope)
|
201
|
+
end
|
202
|
+
@horizon.transactions._post(tx: Base64.encode64(tx_envelope.to_xdr))
|
203
|
+
end
|
204
|
+
|
205
|
+
# Required by SEP-0029
|
206
|
+
# @param [Stellar::TransactionEnvelope] tx_envelope
|
207
|
+
def check_memo_required(tx_envelope)
|
208
|
+
tx = tx_envelope.tx
|
209
|
+
|
210
|
+
if tx.is_a?(Stellar::FeeBumpTransaction)
|
211
|
+
tx = tx.inner_tx.v1!.tx
|
212
|
+
end
|
213
|
+
|
214
|
+
# Check transactions where the .memo field is nil or of type MemoType.memo_none
|
215
|
+
if !tx.memo.nil? && tx.memo.type != Stellar::MemoType.memo_none
|
216
|
+
return
|
217
|
+
end
|
218
|
+
|
219
|
+
destinations = Set.new
|
220
|
+
ot = Stellar::OperationType
|
221
|
+
|
222
|
+
tx.operations.each_with_index do |op, idx|
|
223
|
+
destination = case op.body.type
|
224
|
+
when ot.payment, ot.path_payment_strict_receive, ot.path_payment_strict_send
|
225
|
+
op.body.value.destination
|
226
|
+
when ot.account_merge
|
227
|
+
# There is no AccountMergeOp, op.body is an Operation object
|
228
|
+
# and op.body.value is a PublicKey (or AccountID) object.
|
229
|
+
op.body.value
|
230
|
+
else
|
231
|
+
next
|
232
|
+
end
|
233
|
+
|
234
|
+
if destinations.include?(destination) || destination.switch == Stellar::CryptoKeyType.key_type_muxed_ed25519
|
235
|
+
next
|
236
|
+
end
|
237
|
+
|
238
|
+
destinations.add(destination)
|
239
|
+
kp = Stellar::KeyPair.from_public_key(destination.value)
|
240
|
+
|
241
|
+
begin
|
242
|
+
info = account_info(kp.address)
|
243
|
+
rescue Faraday::ResourceNotFound
|
244
|
+
# Don't raise an error if its a 404, but throw one otherwise
|
245
|
+
next
|
246
|
+
end
|
247
|
+
if info.data["config.memo_required"] == "MQ=="
|
248
|
+
# MQ== is the base64 encoded string for the string "1"
|
249
|
+
raise AccountRequiresMemoError.new("account requires memo", destination, idx)
|
250
|
+
end
|
251
|
+
end
|
197
252
|
end
|
198
253
|
|
199
|
-
Contract(C::KeywordArgs[
|
200
|
-
server: Stellar::KeyPair,
|
201
|
-
client: Stellar::KeyPair,
|
202
|
-
anchor_name: String,
|
203
|
-
timeout: C::Optional[Integer]
|
204
|
-
] => String)
|
205
254
|
# DEPRECATED: this function has been moved Stellar::SEP10.build_challenge_tx and
|
206
255
|
# will be removed in the next major version release.
|
207
256
|
#
|
208
257
|
# A wrapper function for Stellar::SEP10::build_challenge_tx.
|
209
|
-
#
|
258
|
+
#
|
210
259
|
# @param server [Stellar::KeyPair] Keypair for server's signing account.
|
211
260
|
# @param client [Stellar::KeyPair] Keypair for the account whishing to authenticate with the server.
|
212
261
|
# @param anchor_name [String] Anchor's name to be used in the manage_data key.
|
@@ -219,10 +268,6 @@ module Stellar
|
|
219
268
|
)
|
220
269
|
end
|
221
270
|
|
222
|
-
Contract(C::KeywordArgs[
|
223
|
-
challenge: String,
|
224
|
-
server: Stellar::KeyPair
|
225
|
-
] => C::Bool)
|
226
271
|
# DEPRECATED: this function has been moved to Stellar::SEP10::read_challenge_tx and
|
227
272
|
# will be removed in the next major version release.
|
228
273
|
#
|
@@ -233,18 +278,14 @@ module Stellar
|
|
233
278
|
#
|
234
279
|
# @return [Boolean]
|
235
280
|
def verify_challenge_tx(challenge:, server:)
|
236
|
-
Stellar::SEP10.verify_challenge_tx(
|
281
|
+
Stellar::SEP10.verify_challenge_tx(challenge_xdr: challenge, server: server)
|
237
282
|
true
|
238
283
|
end
|
239
284
|
|
240
|
-
Contract(C::KeywordArgs[
|
241
|
-
transaction_envelope: Stellar::TransactionEnvelope,
|
242
|
-
keypair: Stellar::KeyPair
|
243
|
-
] => C::Bool)
|
244
285
|
# DEPRECATED: this function has been moved to Stellar::SEP10::verify_tx_signed_by and
|
245
286
|
# will be removed in the next major version release.
|
246
287
|
#
|
247
|
-
# @param transaction_envelope [Stellar::TransactionEnvelope]
|
288
|
+
# @param transaction_envelope [Stellar::TransactionEnvelope]
|
248
289
|
# @param keypair [Stellar::KeyPair]
|
249
290
|
#
|
250
291
|
# @return [Boolean]
|
@@ -254,6 +295,5 @@ module Stellar
|
|
254
295
|
tx_envelope: transaction_envelope, keypair: keypair
|
255
296
|
)
|
256
297
|
end
|
257
|
-
|
258
298
|
end
|
259
299
|
end
|