auction-ruby-base 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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