stellar-sdk 0.29.0 → 0.32.0
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/CHANGELOG.md +21 -9
- data/lib/stellar/federation.rb +2 -2
- data/lib/stellar/sep10.rb +6 -2
- data/lib/stellar-sdk.rb +2 -13
- metadata +24 -77
- data/lib/stellar/amount.rb +0 -36
- data/lib/stellar/client.rb +0 -300
- data/lib/stellar/compat.rb +0 -4
- data/lib/stellar/horizon/problem.rb +0 -45
- data/lib/stellar/transaction_page.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc413ea9aa784fc3d1eeed1da90b83d1aaa632535cb558097417ae1b8d2d02a5
|
4
|
+
data.tar.gz: ce20f654f1ea87992e2f70f0b0a0ff06d1e4137821f90fee16f2e8fb5d827125
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7a95e5b86775a8c18d0f1ca3ea92da701bfe9ea2467b751e981d4bd1897fb0af35e300d49692bd5494670a1d7dcdb0cc584db8e95ca052d5e2ef6659ff7eef5
|
7
|
+
data.tar.gz: 75872a8c29f68e256a8362eb44b715cb27d97591db2fd69992de4213b76c33a7214b990043e9dcd826c24327275f7bb21a8f38a6a257dfa2d6a38923ced33b00
|
data/CHANGELOG.md
CHANGED
@@ -5,18 +5,30 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
6
6
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
7
7
|
|
8
|
-
## [0.
|
8
|
+
## [0.31.0](https://github.com/astroband/ruby-stellar-sdk/compare/v0.30.0...v0.31.0) (2022-02-20)
|
9
|
+
### Features
|
10
|
+
- `Stellar::SEP10` uses 5 minutes grace period for challenge tx ([#256](https://github.com/astroband/ruby-stellar-sdk/issues/256)) ([0d02663](https://github.com/astroband/ruby-stellar-sdk/commit/0d02663ff41a878f5c4d373f31988313e6ee4f46))
|
11
|
+
|
12
|
+
## [0.30.0](https://www.github.com/astroband/ruby-stellar-sdk/compare/v0.29.0...v0.30.0) (2021-10-14)
|
13
|
+
### Features
|
14
|
+
- `stellar-sdk` now depends on `stellar-horizon`
|
15
|
+
### Refactoring
|
16
|
+
- `Stellar::Amount` class moved to `stellar-base` gem
|
17
|
+
- `Stellar::Horizon::Problem` class moved to `stellar-horizon` gem
|
18
|
+
- `Stellar::TransactionPage` is now `Stellar::Horizon::TransactionPage` in `stellar-horizon` gem
|
19
|
+
- `toml-rb` gem is replaced with `tomlrb` gem to work around [segfaults in Ruby 3.0](https://github.com/mjackson/citrus/issues/60)
|
9
20
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
21
|
+
## [0.29.0](https://www.github.com/astroband/ruby-stellar-sdk/compare/v0.28.0...v0.29.0) (2021-09-07)
|
22
|
+
### Deprecations
|
23
|
+
- `Stellar::Client` class is marked as deprecated in favour of new `stellar-horizon` gem
|
24
|
+
### Features
|
25
|
+
- support for client domain in SEP-10
|
14
26
|
|
15
27
|
## [0.28.0](https://www.github.com/astroband/ruby-stellar-sdk/compare/v0.27.0...v0.28.0) (2021-07-17)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
28
|
+
### Deprecations
|
29
|
+
- `Stellar::Account.lookup` is deprecated, use `Stellar::Federation.lookup` instead
|
30
|
+
### Refactoring
|
31
|
+
- `Stellar::Account` class is now part of `stellar-base` gem
|
20
32
|
|
21
33
|
## [0.27.0](https://github.com/astroband/ruby-stellar-sdk/compare/v0.26.0...v0.27.0) (2021-05-08)
|
22
34
|
- No changes
|
data/lib/stellar/federation.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "tomlrb"
|
2
2
|
require "uri"
|
3
3
|
require "faraday"
|
4
4
|
require "json"
|
@@ -17,7 +17,7 @@ module Stellar
|
|
17
17
|
raise InvalidStellarDomain, "Domain does not contain stellar.toml file"
|
18
18
|
end
|
19
19
|
|
20
|
-
fed_server_url =
|
20
|
+
fed_server_url = Tomlrb.parse(domain_req.body)["FEDERATION_SERVER"]
|
21
21
|
if fed_server_url.nil?
|
22
22
|
raise InvalidStellarTOML, "Invalid Stellar TOML file"
|
23
23
|
end
|
data/lib/stellar/sep10.rb
CHANGED
@@ -4,6 +4,10 @@ module Stellar
|
|
4
4
|
class SEP10
|
5
5
|
include Stellar::DSL
|
6
6
|
|
7
|
+
# We use a small grace period for the challenge transaction time bounds
|
8
|
+
# to compensate possible clock drift on client's machine
|
9
|
+
GRACE_PERIOD = 5.minutes
|
10
|
+
|
7
11
|
# Helper method to create a valid {SEP0010}[https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0010.md]
|
8
12
|
# challenge transaction which you can use for Stellar Web Authentication.
|
9
13
|
#
|
@@ -154,10 +158,10 @@ module Stellar
|
|
154
158
|
raise InvalidSep10ChallengeError, "The transaction is not signed by the server"
|
155
159
|
end
|
156
160
|
|
157
|
-
time_bounds = transaction.time_bounds
|
161
|
+
time_bounds = transaction.cond.time_bounds
|
158
162
|
now = Time.now.to_i
|
159
163
|
|
160
|
-
if time_bounds.blank? || !now.between?(time_bounds.min_time, time_bounds.max_time)
|
164
|
+
if time_bounds.blank? || !now.between?(time_bounds.min_time - GRACE_PERIOD, time_bounds.max_time + GRACE_PERIOD)
|
161
165
|
raise InvalidSep10ChallengeError, "The transaction has expired"
|
162
166
|
end
|
163
167
|
|
data/lib/stellar-sdk.rb
CHANGED
@@ -1,23 +1,12 @@
|
|
1
1
|
require "stellar-base"
|
2
|
+
require "stellar-horizon"
|
2
3
|
|
3
4
|
module Stellar
|
4
5
|
module SDK
|
5
6
|
VERSION = ::Stellar::VERSION
|
6
7
|
end
|
8
|
+
Client = Horizon::Client
|
7
9
|
|
8
|
-
autoload :Amount
|
9
|
-
autoload :Client
|
10
10
|
autoload :Federation
|
11
11
|
autoload :SEP10
|
12
|
-
|
13
|
-
module Horizon
|
14
|
-
extend ActiveSupport::Autoload
|
15
|
-
|
16
|
-
autoload :Problem
|
17
|
-
autoload :Result
|
18
|
-
end
|
19
|
-
|
20
|
-
autoload :TransactionPage
|
21
12
|
end
|
22
|
-
|
23
|
-
require_relative "stellar/compat"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stellar-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.32.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Fleckenstein
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2022-05-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: stellar-base
|
@@ -18,61 +18,55 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.32.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - '='
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 0.
|
28
|
+
version: 0.32.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
|
-
name:
|
30
|
+
name: stellar-horizon
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: 5.0.0
|
36
|
-
- - "<"
|
33
|
+
- - '='
|
37
34
|
- !ruby/object:Gem::Version
|
38
|
-
version:
|
35
|
+
version: 0.32.0
|
39
36
|
type: :runtime
|
40
37
|
prerelease: false
|
41
38
|
version_requirements: !ruby/object:Gem::Requirement
|
42
39
|
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 5.0.0
|
46
|
-
- - "<"
|
40
|
+
- - '='
|
47
41
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
42
|
+
version: 0.32.0
|
49
43
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
44
|
+
name: activesupport
|
51
45
|
requirement: !ruby/object:Gem::Requirement
|
52
46
|
requirements:
|
53
47
|
- - ">="
|
54
48
|
- !ruby/object:Gem::Version
|
55
|
-
version: 0.
|
49
|
+
version: 5.0.0
|
56
50
|
- - "<"
|
57
51
|
- !ruby/object:Gem::Version
|
58
|
-
version: '
|
52
|
+
version: '8.0'
|
59
53
|
type: :runtime
|
60
54
|
prerelease: false
|
61
55
|
version_requirements: !ruby/object:Gem::Requirement
|
62
56
|
requirements:
|
63
57
|
- - ">="
|
64
58
|
- !ruby/object:Gem::Version
|
65
|
-
version: 0.
|
59
|
+
version: 5.0.0
|
66
60
|
- - "<"
|
67
61
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
62
|
+
version: '8.0'
|
69
63
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
64
|
+
name: faraday
|
71
65
|
requirement: !ruby/object:Gem::Requirement
|
72
66
|
requirements:
|
73
67
|
- - ">="
|
74
68
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
69
|
+
version: 1.6.0
|
76
70
|
- - "<"
|
77
71
|
- !ruby/object:Gem::Version
|
78
72
|
version: '2.0'
|
@@ -82,17 +76,17 @@ dependencies:
|
|
82
76
|
requirements:
|
83
77
|
- - ">="
|
84
78
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
79
|
+
version: 1.6.0
|
86
80
|
- - "<"
|
87
81
|
- !ruby/object:Gem::Version
|
88
82
|
version: '2.0'
|
89
83
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
84
|
+
name: tomlrb
|
91
85
|
requirement: !ruby/object:Gem::Requirement
|
92
86
|
requirements:
|
93
87
|
- - ">="
|
94
88
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
89
|
+
version: 2.0.1
|
96
90
|
- - "<"
|
97
91
|
- !ruby/object:Gem::Version
|
98
92
|
version: '3.0'
|
@@ -102,52 +96,10 @@ dependencies:
|
|
102
96
|
requirements:
|
103
97
|
- - ">="
|
104
98
|
- !ruby/object:Gem::Version
|
105
|
-
version:
|
99
|
+
version: 2.0.1
|
106
100
|
- - "<"
|
107
101
|
- !ruby/object:Gem::Version
|
108
102
|
version: '3.0'
|
109
|
-
- !ruby/object:Gem::Dependency
|
110
|
-
name: bundler
|
111
|
-
requirement: !ruby/object:Gem::Requirement
|
112
|
-
requirements:
|
113
|
-
- - "~>"
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: '2.2'
|
116
|
-
type: :development
|
117
|
-
prerelease: false
|
118
|
-
version_requirements: !ruby/object:Gem::Requirement
|
119
|
-
requirements:
|
120
|
-
- - "~>"
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: '2.2'
|
123
|
-
- !ruby/object:Gem::Dependency
|
124
|
-
name: rake
|
125
|
-
requirement: !ruby/object:Gem::Requirement
|
126
|
-
requirements:
|
127
|
-
- - "~>"
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
version: '13'
|
130
|
-
type: :development
|
131
|
-
prerelease: false
|
132
|
-
version_requirements: !ruby/object:Gem::Requirement
|
133
|
-
requirements:
|
134
|
-
- - "~>"
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
version: '13'
|
137
|
-
- !ruby/object:Gem::Dependency
|
138
|
-
name: rspec
|
139
|
-
requirement: !ruby/object:Gem::Requirement
|
140
|
-
requirements:
|
141
|
-
- - "~>"
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
version: '3.9'
|
144
|
-
type: :development
|
145
|
-
prerelease: false
|
146
|
-
version_requirements: !ruby/object:Gem::Requirement
|
147
|
-
requirements:
|
148
|
-
- - "~>"
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: '3.9'
|
151
103
|
description:
|
152
104
|
email:
|
153
105
|
executables: []
|
@@ -161,23 +113,18 @@ files:
|
|
161
113
|
- LICENSE
|
162
114
|
- README.md
|
163
115
|
- lib/stellar-sdk.rb
|
164
|
-
- lib/stellar/amount.rb
|
165
|
-
- lib/stellar/client.rb
|
166
|
-
- lib/stellar/compat.rb
|
167
116
|
- lib/stellar/federation.rb
|
168
|
-
- lib/stellar/horizon/problem.rb
|
169
117
|
- lib/stellar/sep10.rb
|
170
|
-
- lib/stellar/transaction_page.rb
|
171
118
|
homepage: https://github.com/astroband/ruby-stellar-sdk
|
172
119
|
licenses:
|
173
120
|
- Apache-2.0
|
174
121
|
metadata:
|
175
122
|
bug_tracker_uri: https://github.com/astroband/ruby-stellar-sdk/issues
|
176
|
-
changelog_uri: https://github.com/astroband/ruby-stellar-sdk/blob/v0.
|
177
|
-
documentation_uri: https://rubydoc.info/gems/stellar-sdk/0.
|
123
|
+
changelog_uri: https://github.com/astroband/ruby-stellar-sdk/blob/v0.32.0/sdk/CHANGELOG.md
|
124
|
+
documentation_uri: https://rubydoc.info/gems/stellar-sdk/0.32.0/
|
178
125
|
github_repo: ssh://github.com/astroband/ruby-stellar-sdk
|
179
126
|
homepage_uri: https://github.com/astroband/ruby-stellar-sdk/tree/main/sdk
|
180
|
-
source_code_uri: https://github.com/astroband/ruby-stellar-sdk/tree/v0.
|
127
|
+
source_code_uri: https://github.com/astroband/ruby-stellar-sdk/tree/v0.32.0/sdk
|
181
128
|
post_install_message:
|
182
129
|
rdoc_options: []
|
183
130
|
require_paths:
|
@@ -193,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
140
|
- !ruby/object:Gem::Version
|
194
141
|
version: '0'
|
195
142
|
requirements: []
|
196
|
-
rubygems_version: 3.1.
|
143
|
+
rubygems_version: 3.1.6
|
197
144
|
signing_key:
|
198
145
|
specification_version: 4
|
199
146
|
summary: Stellar client library
|
data/lib/stellar/amount.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Stellar
|
2
|
-
class Amount
|
3
|
-
attr_reader :amount
|
4
|
-
attr_reader :asset
|
5
|
-
|
6
|
-
# @param [Fixnum] amount
|
7
|
-
# @param [Stellar::Asset] asset
|
8
|
-
def initialize(amount, asset = Stellar::Asset.native)
|
9
|
-
# TODO: how are we going to handle decimal considerations?
|
10
|
-
|
11
|
-
@amount = amount
|
12
|
-
@asset = asset
|
13
|
-
end
|
14
|
-
|
15
|
-
# @return [Array(Symbol, Fixnum)] in case of a native asset
|
16
|
-
# @return [Array(Symbol, String, Stellar::KeyPair, Fixnum)] in case of alphanum asset
|
17
|
-
def to_payment
|
18
|
-
case asset.type
|
19
|
-
when AssetType.asset_type_native
|
20
|
-
[:native, amount]
|
21
|
-
when AssetType.asset_type_credit_alphanum4
|
22
|
-
keypair = KeyPair.from_public_key(asset.issuer.value)
|
23
|
-
[:alphanum4, asset.code, keypair, amount]
|
24
|
-
when AssetType.asset_type_credit_alphanum12
|
25
|
-
keypair = KeyPair.from_public_key(asset.issuer.value)
|
26
|
-
[:alphanum12, asset.code, keypair, amount]
|
27
|
-
else
|
28
|
-
raise "Unknown asset type: #{asset.type}"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def inspect
|
33
|
-
"#<Stellar::Amount #{asset}(#{amount})>"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/stellar/client.rb
DELETED
@@ -1,300 +0,0 @@
|
|
1
|
-
require "hyperclient"
|
2
|
-
require "active_support/core_ext/object/blank"
|
3
|
-
require "securerandom"
|
4
|
-
|
5
|
-
module Stellar
|
6
|
-
class AccountRequiresMemoError < StandardError
|
7
|
-
attr_reader :account_id, :operation_index
|
8
|
-
|
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
|
15
|
-
|
16
|
-
class Client
|
17
|
-
DEFAULT_FEE = 100
|
18
|
-
|
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
|
23
|
-
|
24
|
-
def self.default(options = {})
|
25
|
-
new options.merge(
|
26
|
-
horizon: HORIZON_MAINNET_URL
|
27
|
-
)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.default_testnet(options = {})
|
31
|
-
new options.merge(
|
32
|
-
horizon: HORIZON_TESTNET_URL,
|
33
|
-
friendbot: HORIZON_TESTNET_URL
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.localhost(options = {})
|
38
|
-
new options.merge(
|
39
|
-
horizon: HORIZON_LOCALHOST_URL
|
40
|
-
)
|
41
|
-
end
|
42
|
-
|
43
|
-
attr_reader :horizon
|
44
|
-
|
45
|
-
# @option options [String] :horizon The Horizon server URL.
|
46
|
-
def initialize(options)
|
47
|
-
ActiveSupport::Deprecation.warn("`Stellar::Horizon` is deprecated and will be removed from `stellar-sdk` next relase. Use `stellar-horizon` gem for requesting Horizon API")
|
48
|
-
|
49
|
-
@options = options
|
50
|
-
@horizon = Hyperclient.new(options[:horizon]) { |client|
|
51
|
-
client.faraday_block = lambda do |conn|
|
52
|
-
conn.use Faraday::Response::RaiseError
|
53
|
-
conn.use FaradayMiddleware::FollowRedirects
|
54
|
-
conn.request :url_encoded
|
55
|
-
conn.response :hal_json, content_type: /\bjson$/
|
56
|
-
conn.adapter :excon
|
57
|
-
end
|
58
|
-
client.headers = {
|
59
|
-
"Accept" => "application/hal+json,application/problem+json,application/json",
|
60
|
-
"X-Client-Name" => "ruby-stellar-sdk",
|
61
|
-
"X-Client-Version" => VERSION
|
62
|
-
}
|
63
|
-
}
|
64
|
-
end
|
65
|
-
|
66
|
-
# @param [Stellar::Account|String] account_or_address
|
67
|
-
def account_info(account_or_address)
|
68
|
-
account_id = if account_or_address.is_a?(Stellar::Account)
|
69
|
-
account_or_address.address
|
70
|
-
else
|
71
|
-
account_or_address
|
72
|
-
end
|
73
|
-
@horizon.account(account_id: account_id)._get
|
74
|
-
end
|
75
|
-
|
76
|
-
# @option options [Stellar::Account] :account
|
77
|
-
# @option options [Stellar::Account] :destination
|
78
|
-
def account_merge(options = {})
|
79
|
-
account = options[:account]
|
80
|
-
destination = options[:destination]
|
81
|
-
sequence = options[:sequence] || (account_info(account).sequence.to_i + 1)
|
82
|
-
|
83
|
-
transaction = Stellar::TransactionBuilder.account_merge(
|
84
|
-
source_account: destination.keypair,
|
85
|
-
sequence_number: sequence,
|
86
|
-
destination: destination.keypair
|
87
|
-
)
|
88
|
-
|
89
|
-
envelope = transaction.to_envelope(account.keypair)
|
90
|
-
submit_transaction(tx_envelope: envelope)
|
91
|
-
end
|
92
|
-
|
93
|
-
def friendbot(account)
|
94
|
-
uri = URI.parse(FRIENDBOT_URL)
|
95
|
-
uri.query = "addr=#{account.address}"
|
96
|
-
Faraday.post(uri.to_s)
|
97
|
-
end
|
98
|
-
|
99
|
-
# @option options [Stellar::Account] :account
|
100
|
-
# @option options [Stellar::Account] :funder
|
101
|
-
# @option options [Integer] :starting_balance
|
102
|
-
def create_account(options = {})
|
103
|
-
funder = options[:funder]
|
104
|
-
sequence = options[:sequence] || (account_info(funder).sequence.to_i + 1)
|
105
|
-
# In the future, the fee should be grabbed from the network's last transactions,
|
106
|
-
# instead of using a hard-coded default value.
|
107
|
-
fee = options[:fee] || DEFAULT_FEE
|
108
|
-
|
109
|
-
payment = Stellar::TransactionBuilder.create_account(
|
110
|
-
source_account: funder.keypair,
|
111
|
-
sequence_number: sequence,
|
112
|
-
base_fee: fee,
|
113
|
-
destination: options[:account].keypair,
|
114
|
-
starting_balance: options[:starting_balance]
|
115
|
-
)
|
116
|
-
envelope = payment.to_envelope(funder.keypair)
|
117
|
-
submit_transaction(tx_envelope: envelope)
|
118
|
-
end
|
119
|
-
|
120
|
-
# @option options [Stellar::Account] :from The source account
|
121
|
-
# @option options [Stellar::Account] :to The destination account
|
122
|
-
# @option options [Stellar::Amount] :amount The amount to send
|
123
|
-
def send_payment(options = {})
|
124
|
-
from_account = options[:from]
|
125
|
-
tx_source_account = options[:transaction_source] || from_account
|
126
|
-
op_source_account = from_account if tx_source_account.present?
|
127
|
-
|
128
|
-
sequence = options[:sequence] ||
|
129
|
-
(account_info(tx_source_account).sequence.to_i + 1)
|
130
|
-
|
131
|
-
payment = Stellar::TransactionBuilder.new(
|
132
|
-
source_account: tx_source_account.keypair,
|
133
|
-
sequence_number: sequence
|
134
|
-
).add_operation(
|
135
|
-
Stellar::Operation.payment(
|
136
|
-
source_account: op_source_account.keypair,
|
137
|
-
destination: options[:to].keypair,
|
138
|
-
amount: options[:amount].to_payment
|
139
|
-
)
|
140
|
-
).set_memo(options[:memo]).set_timeout(0).build
|
141
|
-
|
142
|
-
signers = [tx_source_account, op_source_account].uniq(&:address)
|
143
|
-
to_envelope_args = signers.map(&:keypair)
|
144
|
-
|
145
|
-
envelope = payment.to_envelope(*to_envelope_args)
|
146
|
-
submit_transaction(tx_envelope: envelope)
|
147
|
-
end
|
148
|
-
|
149
|
-
# @option options [Stellar::Account] :account
|
150
|
-
# @option options [Integer] :limit
|
151
|
-
# @option options [Integer] :cursor
|
152
|
-
# @return [Stellar::TransactionPage]
|
153
|
-
def transactions(options = {})
|
154
|
-
args = options.slice(:limit, :cursor)
|
155
|
-
|
156
|
-
resource = if options[:account]
|
157
|
-
args = args.merge(account_id: options[:account].address)
|
158
|
-
@horizon.account_transactions(args)
|
159
|
-
else
|
160
|
-
@horizon.transactions(args)
|
161
|
-
end
|
162
|
-
|
163
|
-
TransactionPage.new(resource)
|
164
|
-
end
|
165
|
-
|
166
|
-
# @param [Array(Symbol,String,Stellar::KeyPair|Stellar::Account)] asset
|
167
|
-
# @param [Stellar::Account] source
|
168
|
-
# @param [Integer] sequence
|
169
|
-
# @param [Integer] fee
|
170
|
-
# @param [Integer] limit
|
171
|
-
def change_trust(
|
172
|
-
asset:,
|
173
|
-
source:,
|
174
|
-
sequence: nil,
|
175
|
-
fee: DEFAULT_FEE,
|
176
|
-
limit: nil
|
177
|
-
)
|
178
|
-
sequence ||= (account_info(source).sequence.to_i + 1)
|
179
|
-
|
180
|
-
op_args = {
|
181
|
-
account: source.keypair,
|
182
|
-
sequence: sequence,
|
183
|
-
line: asset
|
184
|
-
}
|
185
|
-
op_args[:limit] = limit unless limit.nil?
|
186
|
-
|
187
|
-
tx = Stellar::TransactionBuilder.change_trust(
|
188
|
-
source_account: source.keypair,
|
189
|
-
sequence_number: sequence,
|
190
|
-
**op_args
|
191
|
-
)
|
192
|
-
|
193
|
-
envelope = tx.to_envelope(source.keypair)
|
194
|
-
submit_transaction(tx_envelope: envelope)
|
195
|
-
end
|
196
|
-
|
197
|
-
# @param [Stellar::TransactionEnvelope] tx_envelope
|
198
|
-
# @option options [Boolean] :skip_memo_required_check (false)
|
199
|
-
def submit_transaction(tx_envelope:, options: {skip_memo_required_check: false})
|
200
|
-
unless options[:skip_memo_required_check]
|
201
|
-
check_memo_required(tx_envelope)
|
202
|
-
end
|
203
|
-
@horizon.transactions._post(tx: tx_envelope.to_xdr(:base64))
|
204
|
-
end
|
205
|
-
|
206
|
-
# Required by SEP-0029
|
207
|
-
# @param [Stellar::TransactionEnvelope] tx_envelope
|
208
|
-
def check_memo_required(tx_envelope)
|
209
|
-
tx = tx_envelope.tx
|
210
|
-
|
211
|
-
if tx.is_a?(Stellar::FeeBumpTransaction)
|
212
|
-
tx = tx.inner_tx.v1!.tx
|
213
|
-
end
|
214
|
-
|
215
|
-
# Check transactions where the .memo field is nil or of type MemoType.memo_none
|
216
|
-
if !tx.memo.nil? && tx.memo.type != Stellar::MemoType.memo_none
|
217
|
-
return
|
218
|
-
end
|
219
|
-
|
220
|
-
destinations = Set.new
|
221
|
-
ot = Stellar::OperationType
|
222
|
-
|
223
|
-
tx.operations.each_with_index do |op, idx|
|
224
|
-
destination = case op.body.type
|
225
|
-
when ot.payment, ot.path_payment_strict_receive, ot.path_payment_strict_send
|
226
|
-
op.body.value.destination
|
227
|
-
when ot.account_merge
|
228
|
-
# There is no AccountMergeOp, op.body is an Operation object
|
229
|
-
# and op.body.value is a PublicKey (or AccountID) object.
|
230
|
-
op.body.value
|
231
|
-
else
|
232
|
-
next
|
233
|
-
end
|
234
|
-
|
235
|
-
if destinations.include?(destination) || destination.switch == Stellar::CryptoKeyType.key_type_muxed_ed25519
|
236
|
-
next
|
237
|
-
end
|
238
|
-
|
239
|
-
destinations.add(destination)
|
240
|
-
kp = Stellar::KeyPair.from_public_key(destination.value)
|
241
|
-
|
242
|
-
begin
|
243
|
-
info = account_info(kp.address)
|
244
|
-
rescue Faraday::ResourceNotFound
|
245
|
-
# Don't raise an error if its a 404, but throw one otherwise
|
246
|
-
next
|
247
|
-
end
|
248
|
-
if info.data["config.memo_required"] == "MQ=="
|
249
|
-
# MQ== is the base64 encoded string for the string "1"
|
250
|
-
raise AccountRequiresMemoError.new("account requires memo", destination, idx)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
# DEPRECATED: this function has been moved Stellar::SEP10.build_challenge_tx and
|
256
|
-
# will be removed in the next major version release.
|
257
|
-
#
|
258
|
-
# A wrapper function for Stellar::SEP10::build_challenge_tx.
|
259
|
-
#
|
260
|
-
# @param server [Stellar::KeyPair] Keypair for server's signing account.
|
261
|
-
# @param client [Stellar::KeyPair] Keypair for the account whishing to authenticate with the server.
|
262
|
-
# @param anchor_name [String] Anchor's name to be used in the manage_data key.
|
263
|
-
# @param timeout [Integer] Challenge duration (default to 5 minutes).
|
264
|
-
#
|
265
|
-
# @return [String] A base64 encoded string of the raw TransactionEnvelope xdr struct for the transaction.
|
266
|
-
def build_challenge_tx(server:, client:, anchor_name:, timeout: 300)
|
267
|
-
Stellar::SEP10.build_challenge_tx(
|
268
|
-
server: server, client: client, anchor_name: anchor_name, timeout: timeout
|
269
|
-
)
|
270
|
-
end
|
271
|
-
|
272
|
-
# DEPRECATED: this function has been moved to Stellar::SEP10::read_challenge_tx and
|
273
|
-
# will be removed in the next major version release.
|
274
|
-
#
|
275
|
-
# A wrapper function for Stellar::SEP10.verify_challenge_transaction
|
276
|
-
#
|
277
|
-
# @param challenge [String] SEP0010 transaction challenge in base64.
|
278
|
-
# @param server [Stellar::KeyPair] Stellar::KeyPair for server where the challenge was generated.
|
279
|
-
#
|
280
|
-
# @return [Boolean]
|
281
|
-
def verify_challenge_tx(challenge:, server:)
|
282
|
-
Stellar::SEP10.verify_challenge_tx(challenge_xdr: challenge, server: server)
|
283
|
-
true
|
284
|
-
end
|
285
|
-
|
286
|
-
# DEPRECATED: this function has been moved to Stellar::SEP10::verify_tx_signed_by and
|
287
|
-
# will be removed in the next major version release.
|
288
|
-
#
|
289
|
-
# @param transaction_envelope [Stellar::TransactionEnvelope]
|
290
|
-
# @param keypair [Stellar::KeyPair]
|
291
|
-
#
|
292
|
-
# @return [Boolean]
|
293
|
-
#
|
294
|
-
def verify_tx_signed_by(transaction_envelope:, keypair:)
|
295
|
-
Stellar::SEP10.verify_tx_signed_by(
|
296
|
-
tx_envelope: transaction_envelope, keypair: keypair
|
297
|
-
)
|
298
|
-
end
|
299
|
-
end
|
300
|
-
end
|
data/lib/stellar/compat.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module Stellar
|
2
|
-
module Horizon
|
3
|
-
class Problem
|
4
|
-
def initialize(attributes)
|
5
|
-
@attributes = attributes.reverse_merge({
|
6
|
-
type: "about:blank",
|
7
|
-
title: "Unknown Error",
|
8
|
-
status: 500
|
9
|
-
})
|
10
|
-
|
11
|
-
@meta = @attributes.except!(:type, :title, :status, :detail, :instance)
|
12
|
-
end
|
13
|
-
|
14
|
-
# @return [String]
|
15
|
-
def type
|
16
|
-
@attributes[:type]
|
17
|
-
end
|
18
|
-
|
19
|
-
# @return [String]
|
20
|
-
def title
|
21
|
-
@attributes[:title]
|
22
|
-
end
|
23
|
-
|
24
|
-
# @return [Integer]
|
25
|
-
def status
|
26
|
-
@attributes[:status]
|
27
|
-
end
|
28
|
-
|
29
|
-
# @return [String]
|
30
|
-
def detail
|
31
|
-
@attributes[:detail]
|
32
|
-
end
|
33
|
-
|
34
|
-
# @return [String]
|
35
|
-
def instance
|
36
|
-
@attributes[:instance]
|
37
|
-
end
|
38
|
-
|
39
|
-
# @return [{String => Object}]
|
40
|
-
def meta
|
41
|
-
@attributes[:instance]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Stellar
|
2
|
-
class TransactionPage
|
3
|
-
include Enumerable
|
4
|
-
|
5
|
-
# @param [Hyperclient::Link] resource
|
6
|
-
def initialize(resource)
|
7
|
-
@resource = resource
|
8
|
-
end
|
9
|
-
|
10
|
-
def each
|
11
|
-
@resource.records.each do |tx|
|
12
|
-
yield tx if block_given?
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# @return [Stellar::TransactionPage]
|
17
|
-
def next_page
|
18
|
-
self.class.new(@resource.next)
|
19
|
-
end
|
20
|
-
|
21
|
-
def next_page!
|
22
|
-
@resource = @resource.next
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|