auction-ruby-base 0.1.1

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.
Files changed (226) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +15 -0
  4. data/.yardopts +8 -0
  5. data/CHANGELOG.md +58 -0
  6. data/CONTRIBUTING.md +48 -0
  7. data/Gemfile +15 -0
  8. data/Guardfile +5 -0
  9. data/LICENSE.txt +202 -0
  10. data/README.md +83 -0
  11. data/Rakefile +4 -0
  12. data/auction-ruby-base.gemspec +35 -0
  13. data/examples/create_account.rb +26 -0
  14. data/examples/low_level_transaction_post.rb +46 -0
  15. data/examples/mid_level_transaction_post.rb +33 -0
  16. data/examples/non_native_payment.rb +60 -0
  17. data/examples/offer.rb +75 -0
  18. data/examples/transaction_merge.rb +23 -0
  19. data/generated/stellar-base-generated.rb +174 -0
  20. data/generated/stellar/account_entry.rb +55 -0
  21. data/generated/stellar/account_entry/ext.rb +24 -0
  22. data/generated/stellar/account_flags.rb +31 -0
  23. data/generated/stellar/account_merge_result.rb +26 -0
  24. data/generated/stellar/account_merge_result_code.rb +30 -0
  25. data/generated/stellar/affirm_fail_op.rb +22 -0
  26. data/generated/stellar/affirm_fail_result.rb +25 -0
  27. data/generated/stellar/affirm_fail_result_code.rb +22 -0
  28. data/generated/stellar/affirm_pass_op.rb +24 -0
  29. data/generated/stellar/affirm_pass_result.rb +25 -0
  30. data/generated/stellar/affirm_pass_result_code.rb +22 -0
  31. data/generated/stellar/allow_trust_op.rb +38 -0
  32. data/generated/stellar/allow_trust_op/asset.rb +33 -0
  33. data/generated/stellar/allow_trust_result.rb +25 -0
  34. data/generated/stellar/allow_trust_result_code.rb +31 -0
  35. data/generated/stellar/asset.rb +47 -0
  36. data/generated/stellar/asset/alpha_num12.rb +22 -0
  37. data/generated/stellar/asset/alpha_num4.rb +22 -0
  38. data/generated/stellar/asset_type.rb +24 -0
  39. data/generated/stellar/auth.rb +20 -0
  40. data/generated/stellar/auth_cert.rb +22 -0
  41. data/generated/stellar/authenticated_message.rb +32 -0
  42. data/generated/stellar/authenticated_message/v0.rb +24 -0
  43. data/generated/stellar/bucket_entry.rb +28 -0
  44. data/generated/stellar/bucket_entry_type.rb +22 -0
  45. data/generated/stellar/change_trust_op.rb +22 -0
  46. data/generated/stellar/change_trust_result.rb +25 -0
  47. data/generated/stellar/change_trust_result_code.rb +31 -0
  48. data/generated/stellar/claim_offer_atom.rb +33 -0
  49. data/generated/stellar/create_account_op.rb +20 -0
  50. data/generated/stellar/create_account_result.rb +25 -0
  51. data/generated/stellar/create_account_result_code.rb +32 -0
  52. data/generated/stellar/create_bid_op.rb +20 -0
  53. data/generated/stellar/create_bid_result.rb +25 -0
  54. data/generated/stellar/create_bid_result_code.rb +22 -0
  55. data/generated/stellar/create_lot_op.rb +46 -0
  56. data/generated/stellar/create_lot_result.rb +25 -0
  57. data/generated/stellar/create_lot_result_code.rb +22 -0
  58. data/generated/stellar/create_passive_offer_op.rb +24 -0
  59. data/generated/stellar/crypto_key_type.rb +20 -0
  60. data/generated/stellar/curve25519_public.rb +18 -0
  61. data/generated/stellar/curve25519_secret.rb +18 -0
  62. data/generated/stellar/decorated_signature.rb +20 -0
  63. data/generated/stellar/dont_have.rb +20 -0
  64. data/generated/stellar/envelope_type.rb +24 -0
  65. data/generated/stellar/error.rb +20 -0
  66. data/generated/stellar/error_code.rb +28 -0
  67. data/generated/stellar/hello.rb +34 -0
  68. data/generated/stellar/hmac_sha256_key.rb +18 -0
  69. data/generated/stellar/hmac_sha256_mac.rb +18 -0
  70. data/generated/stellar/inflation_payout.rb +20 -0
  71. data/generated/stellar/inflation_result.rb +26 -0
  72. data/generated/stellar/inflation_result_code.rb +24 -0
  73. data/generated/stellar/ip_addr_type.rb +22 -0
  74. data/generated/stellar/ledger_entry.rb +52 -0
  75. data/generated/stellar/ledger_entry/data.rb +49 -0
  76. data/generated/stellar/ledger_entry/ext.rb +24 -0
  77. data/generated/stellar/ledger_entry_change.rb +35 -0
  78. data/generated/stellar/ledger_entry_change_type.rb +26 -0
  79. data/generated/stellar/ledger_entry_type.rb +32 -0
  80. data/generated/stellar/ledger_header.rb +69 -0
  81. data/generated/stellar/ledger_header/ext.rb +24 -0
  82. data/generated/stellar/ledger_header_history_entry.rb +33 -0
  83. data/generated/stellar/ledger_header_history_entry/ext.rb +24 -0
  84. data/generated/stellar/ledger_key.rb +87 -0
  85. data/generated/stellar/ledger_key/account.rb +20 -0
  86. data/generated/stellar/ledger_key/lot.rb +22 -0
  87. data/generated/stellar/ledger_key/message.rb +22 -0
  88. data/generated/stellar/ledger_key/offer.rb +22 -0
  89. data/generated/stellar/ledger_key/participant.rb +22 -0
  90. data/generated/stellar/ledger_key/proof.rb +22 -0
  91. data/generated/stellar/ledger_key/trust_line.rb +22 -0
  92. data/generated/stellar/ledger_scp_messages.rb +20 -0
  93. data/generated/stellar/ledger_upgrade.rb +31 -0
  94. data/generated/stellar/ledger_upgrade_type.rb +24 -0
  95. data/generated/stellar/lot_branch.rb +21 -0
  96. data/generated/stellar/lot_entry.rb +64 -0
  97. data/generated/stellar/lot_entry/ext.rb +24 -0
  98. data/generated/stellar/lot_type.rb +21 -0
  99. data/generated/stellar/manage_offer_effect.rb +24 -0
  100. data/generated/stellar/manage_offer_op.rb +28 -0
  101. data/generated/stellar/manage_offer_result.rb +26 -0
  102. data/generated/stellar/manage_offer_result_code.rb +50 -0
  103. data/generated/stellar/manage_offer_success_result.rb +34 -0
  104. data/generated/stellar/manage_offer_success_result/offer.rb +30 -0
  105. data/generated/stellar/memo.rb +38 -0
  106. data/generated/stellar/memo_type.rb +28 -0
  107. data/generated/stellar/message_entry.rb +38 -0
  108. data/generated/stellar/message_entry/ext.rb +24 -0
  109. data/generated/stellar/message_type.rb +51 -0
  110. data/generated/stellar/offer_entry.rb +49 -0
  111. data/generated/stellar/offer_entry/ext.rb +24 -0
  112. data/generated/stellar/offer_entry_flags.rb +21 -0
  113. data/generated/stellar/operation.rb +65 -0
  114. data/generated/stellar/operation/body.rb +88 -0
  115. data/generated/stellar/operation_meta.rb +18 -0
  116. data/generated/stellar/operation_result.rb +67 -0
  117. data/generated/stellar/operation_result/tr.rb +89 -0
  118. data/generated/stellar/operation_result_code.rb +25 -0
  119. data/generated/stellar/operation_type.rb +52 -0
  120. data/generated/stellar/participant_entry.rb +39 -0
  121. data/generated/stellar/participant_entry/ext.rb +24 -0
  122. data/generated/stellar/participant_state.rb +25 -0
  123. data/generated/stellar/path_payment_op.rb +32 -0
  124. data/generated/stellar/path_payment_result.rb +38 -0
  125. data/generated/stellar/path_payment_result/success.rb +22 -0
  126. data/generated/stellar/path_payment_result_code.rb +47 -0
  127. data/generated/stellar/payment_op.rb +22 -0
  128. data/generated/stellar/payment_result.rb +25 -0
  129. data/generated/stellar/payment_result_code.rb +41 -0
  130. data/generated/stellar/peer_address.rb +33 -0
  131. data/generated/stellar/peer_address/ip.rb +29 -0
  132. data/generated/stellar/price.rb +20 -0
  133. data/generated/stellar/proof_entry.rb +42 -0
  134. data/generated/stellar/proof_entry/ext.rb +24 -0
  135. data/generated/stellar/provide_proof_op.rb +24 -0
  136. data/generated/stellar/provide_proof_result.rb +25 -0
  137. data/generated/stellar/provide_proof_result_code.rb +22 -0
  138. data/generated/stellar/public_key.rb +23 -0
  139. data/generated/stellar/register_participant_op.rb +22 -0
  140. data/generated/stellar/register_participant_result.rb +25 -0
  141. data/generated/stellar/register_participant_result_code.rb +22 -0
  142. data/generated/stellar/scp_ballot.rb +20 -0
  143. data/generated/stellar/scp_envelope.rb +20 -0
  144. data/generated/stellar/scp_history_entry.rb +23 -0
  145. data/generated/stellar/scp_history_entry_v0.rb +20 -0
  146. data/generated/stellar/scp_nomination.rb +22 -0
  147. data/generated/stellar/scp_quorum_set.rb +22 -0
  148. data/generated/stellar/scp_statement.rb +58 -0
  149. data/generated/stellar/scp_statement/pledges.rb +63 -0
  150. data/generated/stellar/scp_statement/pledges/confirm.rb +30 -0
  151. data/generated/stellar/scp_statement/pledges/externalize.rb +26 -0
  152. data/generated/stellar/scp_statement/pledges/prepare.rb +32 -0
  153. data/generated/stellar/scp_statement_type.rb +26 -0
  154. data/generated/stellar/send_message_op.rb +22 -0
  155. data/generated/stellar/send_message_result.rb +25 -0
  156. data/generated/stellar/send_message_result_code.rb +22 -0
  157. data/generated/stellar/set_options_op.rb +41 -0
  158. data/generated/stellar/set_options_result.rb +25 -0
  159. data/generated/stellar/set_options_result_code.rb +40 -0
  160. data/generated/stellar/signer.rb +20 -0
  161. data/generated/stellar/simple_payment_result.rb +22 -0
  162. data/generated/stellar/stellar_message.rb +74 -0
  163. data/generated/stellar/stellar_value.rb +41 -0
  164. data/generated/stellar/stellar_value/ext.rb +24 -0
  165. data/generated/stellar/threshold_indexes.rb +26 -0
  166. data/generated/stellar/time_bounds.rb +20 -0
  167. data/generated/stellar/transaction.rb +50 -0
  168. data/generated/stellar/transaction/ext.rb +24 -0
  169. data/generated/stellar/transaction_envelope.rb +20 -0
  170. data/generated/stellar/transaction_history_entry.rb +33 -0
  171. data/generated/stellar/transaction_history_entry/ext.rb +24 -0
  172. data/generated/stellar/transaction_history_result_entry.rb +33 -0
  173. data/generated/stellar/transaction_history_result_entry/ext.rb +24 -0
  174. data/generated/stellar/transaction_meta.rb +23 -0
  175. data/generated/stellar/transaction_result.rb +43 -0
  176. data/generated/stellar/transaction_result/ext.rb +24 -0
  177. data/generated/stellar/transaction_result/result.rb +30 -0
  178. data/generated/stellar/transaction_result_code.rb +45 -0
  179. data/generated/stellar/transaction_result_pair.rb +20 -0
  180. data/generated/stellar/transaction_result_set.rb +18 -0
  181. data/generated/stellar/transaction_set.rb +20 -0
  182. data/generated/stellar/trust_line_entry.rb +41 -0
  183. data/generated/stellar/trust_line_entry/ext.rb +24 -0
  184. data/generated/stellar/trust_line_flags.rb +21 -0
  185. data/lib/stellar-base.rb +33 -0
  186. data/lib/stellar/account_flags.rb +28 -0
  187. data/lib/stellar/asset.rb +69 -0
  188. data/lib/stellar/base.rb +1 -0
  189. data/lib/stellar/base/version.rb +5 -0
  190. data/lib/stellar/convert.rb +32 -0
  191. data/lib/stellar/key_pair.rb +112 -0
  192. data/lib/stellar/networks.rb +45 -0
  193. data/lib/stellar/operation.rb +384 -0
  194. data/lib/stellar/path_payment_result.rb +17 -0
  195. data/lib/stellar/price.rb +32 -0
  196. data/lib/stellar/thresholds.rb +39 -0
  197. data/lib/stellar/transaction.rb +205 -0
  198. data/lib/stellar/transaction_envelope.rb +32 -0
  199. data/lib/stellar/util/continued_fraction.rb +96 -0
  200. data/lib/stellar/util/strkey.rb +43 -0
  201. data/spec/lib/stellar/account_flags_spec.rb +19 -0
  202. data/spec/lib/stellar/asset_spec.rb +45 -0
  203. data/spec/lib/stellar/convert_spec.rb +61 -0
  204. data/spec/lib/stellar/key_pair_spec.rb +238 -0
  205. data/spec/lib/stellar/networks_spec.rb +77 -0
  206. data/spec/lib/stellar/operation_spec.rb +13 -0
  207. data/spec/lib/stellar/path_payment_result_spec.rb +95 -0
  208. data/spec/lib/stellar/price_spec.rb +34 -0
  209. data/spec/lib/stellar/thresholds_spec.rb +62 -0
  210. data/spec/lib/stellar/transaction_envelope_spec.rb +93 -0
  211. data/spec/lib/stellar/transaction_spec.rb +83 -0
  212. data/spec/lib/stellar/util/strkey_spec.rb +46 -0
  213. data/spec/spec_helper.rb +16 -0
  214. data/spec/support/matchers/be_strkey.rb +9 -0
  215. data/spec/support/matchers/eq_bytes.rb +5 -0
  216. data/spec/support/matchers/have_length.rb +5 -0
  217. data/tasks/rspec.rake +6 -0
  218. data/tasks/travis.rake +1 -0
  219. data/tasks/xdr.rake +50 -0
  220. data/xdr/Stellar-SCP.x +86 -0
  221. data/xdr/Stellar-ledger-entries.x +351 -0
  222. data/xdr/Stellar-ledger.x +288 -0
  223. data/xdr/Stellar-overlay.x +146 -0
  224. data/xdr/Stellar-transaction.x +936 -0
  225. data/xdr/Stellar-types.x +55 -0
  226. metadata +495 -0
@@ -0,0 +1,45 @@
1
+ module Stellar
2
+ # Provides a container for well-known network passphrases, such as the main network and SDF test network
3
+ module Networks
4
+
5
+ PUBLIC = "Public Global Stellar Network ; September 2015"
6
+ TESTNET = "Test SDF Network ; September 2015"
7
+
8
+ end
9
+
10
+ # Configures the default stellar network passphrase for the current process. Unless otherwise
11
+ # specified in a method that needs the passphrase, this value will be used.
12
+ #
13
+ # NOTE: This method is not thread-safe. It's best to just call this at startup once and use the other
14
+ # methods of specifying a network if you need two threads in the same process to communicate with
15
+ # different networks
16
+ #
17
+ # @see Stellar.default_network
18
+ # @see Stellar.on_network
19
+ def self.default_network=(passphrase)
20
+ @default_network = passphrase
21
+ end
22
+
23
+ # Returns the passphrase for the currently-configured network, as set by Stellar.default_network
24
+ # or Stellar.on_network
25
+ def self.current_network
26
+ Thread.current["stellar_network_passphrase"] ||
27
+ @default_network ||
28
+ Stellar::Networks::TESTNET
29
+ end
30
+
31
+ # Returns the id for the currently configured network, suitable for use in generating
32
+ # a signature base string or making the root account's keypair.
33
+ def self.current_network_id
34
+ Digest::SHA256.digest(self.current_network)
35
+ end
36
+
37
+ # Executes the provided block in the context of the provided network.
38
+ def self.on_network(passphrase, &block)
39
+ old = Thread.current["stellar_network_passphrase"]
40
+ Thread.current["stellar_network_passphrase"] = passphrase
41
+ block.call
42
+ ensure
43
+ Thread.current["stellar_network_passphrase"] = old
44
+ end
45
+ end
@@ -0,0 +1,384 @@
1
+ require 'bigdecimal'
2
+
3
+ module Stellar
4
+ class Operation
5
+
6
+
7
+ #
8
+ # Construct a new Stellar::Operation from the provided
9
+ # source account and body
10
+ #
11
+ # @param [Hash] attributes the attributes to create the operation with
12
+ # @option attributes [Stellar::KeyPair] :source_account
13
+ # @option attributes [Stellar::Operation::Body] :body
14
+ #
15
+ # @return [Stellar::Operation] the built operation
16
+ def self.make(attributes={})
17
+ source_account = attributes[:source_account]
18
+ body = Stellar::Operation::Body.new(*attributes[:body])
19
+
20
+ op = Stellar::Operation.new(body:body)
21
+
22
+ if source_account
23
+ raise ArgumentError, "Bad :source_account" unless source_account.is_a?(Stellar::KeyPair)
24
+ op.source_account = source_account.account_id
25
+ end
26
+
27
+ return op
28
+ end
29
+
30
+
31
+ #
32
+ # Helper method to create a valid PaymentOp, wrapped
33
+ # in the necessary XDR structs to be included within a
34
+ # transactions `operations` array.
35
+ #
36
+ # @see Stellar::Asset
37
+ #
38
+ # @param [Hash] attributes the attributes to create the operation with
39
+ # @option attributes [Stellar::KeyPair] :destination the receiver of the payment
40
+ # @option attributes [Array] :amount the amount to pay
41
+ # @return [Stellar::Operation] the built operation, containing a
42
+ # Stellar::PaymentOp body
43
+ def self.payment(attributes={})
44
+ destination = attributes[:destination]
45
+ asset, amount = extract_amount(attributes[:amount])
46
+
47
+ raise ArgumentError unless destination.is_a?(KeyPair)
48
+
49
+
50
+ op = PaymentOp.new
51
+ op.asset = asset
52
+ op.amount = amount
53
+ op.destination = destination.account_id
54
+
55
+ return make(attributes.merge({
56
+ body:[:payment, op]
57
+ }))
58
+ end
59
+
60
+ #
61
+ # Helper method to create a valid PathPaymentOp, wrapped
62
+ # in the necessary XDR structs to be included within a
63
+ # transactions `operations` array.
64
+ #
65
+ # @see Stellar::Asset
66
+ #
67
+ # @param [Hash] attributes the attributes to create the operation with
68
+ # @option attributes [Stellar::KeyPair] :destination the receiver of the payment
69
+ # @option attributes [Array] :amount the amount to pay
70
+ # @option attributes [Array] :with the source asset and maximum allowed source amount to pay with
71
+ # @option attributes [Array<Stellar::Asset>] :path the payment path to use
72
+ #
73
+ # @return [Stellar::Operation] the built operation, containing a
74
+ # Stellar::PaymentOp body
75
+ def self.path_payment(attributes={})
76
+ destination = attributes[:destination]
77
+ asset, amount = extract_amount(attributes[:amount])
78
+ send_asset, send_max = extract_amount(attributes[:with])
79
+ path = (attributes[:path] || []).map{|p| Stellar::Asset.send(*p)}
80
+
81
+ raise ArgumentError unless destination.is_a?(KeyPair)
82
+
83
+ op = PathPaymentOp.new
84
+ op.send_asset = send_asset
85
+ op.send_max = send_max
86
+ op.destination = destination.account_id
87
+ op.dest_asset = asset
88
+ op.dest_amount = amount
89
+ op.path = path
90
+
91
+ return make(attributes.merge({
92
+ body:[:path_payment, op]
93
+ }))
94
+ end
95
+
96
+ def self.create_account(attributes={})
97
+ destination = attributes[:destination]
98
+ code_kyc = attributes[:code_kyc]
99
+ raise ArgumentError unless destination.is_a?(KeyPair)
100
+
101
+ op = CreateAccountOp.new()
102
+ op.destination = destination.account_id
103
+ op.code_kyc = code_kyc
104
+ return make(attributes.merge({
105
+ body:[:create_account, op]
106
+ }))
107
+ end
108
+
109
+ def self.provide_proof(attributes={})
110
+ lot_id = attributes[:lot_id]
111
+ quantity = attributes[:quantity]
112
+ proof = attributes[:proof]
113
+ bank_id = attributes[:bank_id]
114
+
115
+ op = ProvideProofOp.new()
116
+ op.lot_id = lot_id
117
+ op.quantity = quantity
118
+ op.proof = attributes[:proof]
119
+ op.bank_id = attributes[:bank_id]
120
+ return make(attributes.merge({
121
+ body:[:provide_proof, op]
122
+ }))
123
+ end
124
+
125
+ def self.register_participant(attributes={})
126
+ lot_id = attributes[:lot_id]
127
+ account_id = attributes[:account_id]
128
+ best_bid = attributes[:best_bid]
129
+
130
+ op = RegisterParticipantOp.new()
131
+ op.lot_id = lot_id
132
+ op.account_id = account_id.account_id
133
+ op.best_bid = best_bid
134
+ return make(attributes.merge({
135
+ body:[:register_participant, op]
136
+ }))
137
+ end
138
+
139
+ def self.create_lot(attributes={})
140
+ lot_name = attributes[:lot_name]
141
+ type = attributes[:type]
142
+ lot_code = attributes[:lot_code]
143
+ lot_address = attributes[:lot_address]
144
+ lot_branch = attributes[:lot_branch]
145
+ lot_location = attributes[:lot_location]
146
+ start_price = attributes[:start_price]
147
+ best_price = attributes[:best_price]
148
+ min_step = attributes[:min_step]
149
+ max_step = attributes[:max_step]
150
+ published = attributes[:published]
151
+ auc_started = attributes[:auc_started]
152
+ duration = attributes[:duration]
153
+ pledge = attributes[:pledge]
154
+ publisher_id = attributes[:publisher_id]
155
+ details = attributes[:details]
156
+ op = CreateLotOp.new()
157
+ op.lot_name = lot_name
158
+ op.type = type
159
+ op.lot_code = lot_code
160
+ op.lot_address = lot_address
161
+ op.lot_branch = lot_branch
162
+ op.lot_location = lot_location
163
+ op.start_price = start_price
164
+ op.best_price = best_price
165
+ op.min_step = min_step
166
+ op.max_step = max_step
167
+ op.published = published
168
+ op.auc_started = auc_started
169
+ op.duration = duration
170
+ op.pledge = pledge
171
+ op.details = details
172
+ op.publisher_id = publisher_id
173
+ return make(attributes.merge({
174
+ body:[:create_lot, op]
175
+ }))
176
+ end
177
+
178
+ #
179
+ # Helper method to create a valid ChangeTrustOp, wrapped
180
+ # in the necessary XDR structs to be included within a
181
+ # transactions `operations` array.
182
+ #
183
+ # @param [Hash] attributes the attributes to create the operation with
184
+ # @option attributes [Stellar::Currrency] :line the asset to trust
185
+ # @option attributes [Fixnum] :limit the maximum amount to trust
186
+ #
187
+ # @return [Stellar::Operation] the built operation, containing a
188
+ # Stellar::ChangeTrustOp body
189
+ def self.change_trust(attributes={})
190
+ line = Asset.send(*attributes[:line])
191
+ limit =interpret_amount(attributes[:limit])
192
+
193
+ raise ArgumentError, "Bad :limit #{limit}" unless limit.is_a?(Integer)
194
+
195
+ op = ChangeTrustOp.new(line: line, limit: limit)
196
+
197
+ return make(attributes.merge({
198
+ body:[:change_trust, op]
199
+ }))
200
+ end
201
+
202
+ def self.manage_offer(attributes={})
203
+ buying = Asset.send(*attributes[:buying])
204
+ selling = Asset.send(*attributes[:selling])
205
+ amount = interpret_amount(attributes[:amount])
206
+ offer_id = attributes[:offer_id] || 0
207
+ price = interpret_price(attributes[:price])
208
+
209
+ op = ManageOfferOp.new({
210
+ buying: buying,
211
+ selling: selling,
212
+ amount: amount,
213
+ price: price,
214
+ offer_id: offer_id
215
+ })
216
+
217
+ return make(attributes.merge({
218
+ body:[:manage_offer, op]
219
+ }))
220
+ end
221
+
222
+ def self.create_passive_offer(attributes={})
223
+ buying = Asset.send(*attributes[:buying])
224
+ selling = Asset.send(*attributes[:selling])
225
+ amount = interpret_amount(attributes[:amount])
226
+ price = interpret_price(attributes[:price])
227
+
228
+ op = CreatePassiveOfferOp.new({
229
+ buying: buying,
230
+ selling: selling,
231
+ amount: amount,
232
+ price: price,
233
+ })
234
+
235
+ return make(attributes.merge({
236
+ body:[:create_passive_offer, op]
237
+ }))
238
+ end
239
+
240
+ #
241
+ # Helper method to create a valid SetOptionsOp, wrapped
242
+ # in the necessary XDR structs to be included within a
243
+ # transactions `operations` array.
244
+ #
245
+ # @param [Hash] attributes the attributes to create the operation with
246
+ # @option attributes [Stellar::KeyPair] :inflation_dest
247
+ # @option attributes [Array<Stellar::AccountFlags>] :set flags to set
248
+ # @option attributes [Array<Stellar::AccountFlags>] :clear flags to clear
249
+ # @option attributes [String] :thresholds
250
+ # @option attributes [Stellar::Signer] :signer
251
+ #
252
+ # @return [Stellar::Operation] the built operation, containing a
253
+ # Stellar::SetOptionsOp body
254
+ def self.set_options(attributes={})
255
+ op = SetOptionsOp.new()
256
+ op.set_flags = Stellar::AccountFlags.make_mask attributes[:set]
257
+ op.clear_flags = Stellar::AccountFlags.make_mask attributes[:clear]
258
+ op.master_weight = attributes[:master_weight]
259
+ op.low_threshold = attributes[:low_threshold]
260
+ op.med_threshold = attributes[:med_threshold]
261
+ op.high_threshold = attributes[:high_threshold]
262
+
263
+ op.signer = attributes[:signer]
264
+ op.home_domain = attributes[:home_domain]
265
+
266
+
267
+ inflation_dest = attributes[:inflation_dest]
268
+ if inflation_dest
269
+ raise ArgumentError, "Bad :inflation_dest" unless inflation_dest.is_a?(Stellar::KeyPair)
270
+ op.inflation_dest = inflation_dest.account_id
271
+ end
272
+
273
+
274
+ return make(attributes.merge({
275
+ body:[:set_options, op]
276
+ }))
277
+ end
278
+
279
+ #
280
+ # Helper method to create a valid AllowTrustOp, wrapped
281
+ # in the necessary XDR structs to be included within a
282
+ # transactions `operations` array.
283
+ #
284
+ # @param [Hash] attributes the attributes to create the operation with
285
+ # @option attributes [Stellar::KeyPair] :trustor
286
+ # @option attributes [Stellar::Asset] :asset
287
+ #
288
+ # @return [Stellar::Operation] the built operation, containing a
289
+ # Stellar::AllowTrustOp body
290
+ def self.allow_trust(attributes={})
291
+ op = AllowTrustOp.new()
292
+
293
+ trustor = attributes[:trustor]
294
+ authorize = attributes[:authorize]
295
+ asset = Asset.send(*attributes[:asset])
296
+
297
+ raise ArgumentError, "Bad :trustor" unless trustor.is_a?(Stellar::KeyPair)
298
+ raise ArgumentError, "Bad :authorize" unless authorize == !!authorize # check boolean
299
+ raise ArgumentError, "Bad :asset" unless asset.type == Stellar::AssetType.asset_type_credit_alphanum4
300
+
301
+ atc = AllowTrustOp::Asset.new(:asset_type_credit_alphanum4, asset.code)
302
+
303
+ op.trustor = trustor.account_id
304
+ op.authorize = authorize
305
+ op.asset = atc
306
+
307
+ return make(attributes.merge({
308
+ body:[:allow_trust, op]
309
+ }))
310
+ end
311
+
312
+ #
313
+ # Helper method to create an account merge operation
314
+ #
315
+ # @param [Hash] attributes the attributes to create the operation with
316
+ # @option attributes [Stellar::KeyPair] :destination
317
+ #
318
+ # @return [Stellar::Operation] the built operation
319
+ def self.account_merge(attributes={})
320
+ destination = attributes[:destination]
321
+
322
+ raise ArgumentError, "Bad :destination" unless destination.is_a?(KeyPair)
323
+
324
+ # TODO: add source_account support
325
+ return make(attributes.merge({
326
+ body:[:account_merge, destination.account_id]
327
+ }))
328
+ end
329
+
330
+ #
331
+ # Helper method to create an inflation operation
332
+ #
333
+ # @param [Hash] attributes the attributes to create the operation with
334
+ # @option attributes [Integer] :sequence
335
+ #
336
+ # @return [Stellar::Operation] the built operation
337
+ def self.inflation(attributes={})
338
+ sequence = attributes[:sequence]
339
+
340
+ raise ArgumentError, "Bad :sequence #{sequence}" unless sequence.is_a?(Integer)
341
+
342
+ # TODO: add source_account support
343
+ return make(attributes.merge({
344
+ body:[:inflation]
345
+ }))
346
+ end
347
+
348
+ private
349
+ def self.extract_amount(a)
350
+ amount = interpret_amount(a.last)
351
+ asset = Stellar::Asset.send(*a[0...-1])
352
+
353
+ return asset, amount
354
+ end
355
+
356
+ def self.interpret_amount(amount)
357
+ case amount
358
+ when String
359
+ (BigDecimal.new(amount) * Stellar::ONE).floor
360
+ when Integer
361
+ amount * Stellar::ONE
362
+ when Numeric
363
+ (amount * Stellar::ONE).floor
364
+ else
365
+ raise ArgumentError, "Invalid amount type: #{amount.class}. Must be String or Numeric"
366
+ end
367
+ end
368
+
369
+
370
+ def self.interpret_price(price)
371
+ case price
372
+ when String
373
+ bd = BigDecimal.new(price)
374
+ Price.from_f(bd)
375
+ when Numeric
376
+ Price.from_f(price)
377
+ when Stellar::Price
378
+ price
379
+ else
380
+ raise ArgumentError, "Invalid price type: #{price.class}. Must be String, Numeric, or Stellar::Price"
381
+ end
382
+ end
383
+ end
384
+ end
@@ -0,0 +1,17 @@
1
+ module Stellar
2
+ class PathPaymentResult
3
+ # send_amount returns the actual amount paid for the corresponding
4
+ # PathPaymentOp to this result.
5
+ #
6
+ def send_amount
7
+ s = success!
8
+ return s.last.amount if s.offers.blank?
9
+
10
+ source_asset = s.offers.first.asset_bought
11
+ source_offers = s.offers.take_while{|o| o.asset_bought == source_asset}
12
+
13
+ source_offers.map(&:amount_bought).sum
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module Stellar
2
+
3
+ # reopen class
4
+ class Price
5
+
6
+ MAX_PRECISION = (2**31) - 1
7
+
8
+ def self.from_f(number)
9
+ best_r = Util::ContinuedFraction.best_r(number, MAX_PRECISION)
10
+ new({
11
+ n: best_r.numerator,
12
+ d: best_r.denominator
13
+ })
14
+ end
15
+
16
+ def invert
17
+ self.class.new(n:d,d:n)
18
+ end
19
+
20
+ def to_f
21
+ n / d.to_f
22
+ end
23
+
24
+ def to_s
25
+ "#{n} / #{d}"
26
+ end
27
+
28
+ def inspect
29
+ "#<Stellar::Price #{self}>"
30
+ end
31
+ end
32
+ end