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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +15 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +58 -0
- data/CONTRIBUTING.md +48 -0
- data/Gemfile +15 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +202 -0
- data/README.md +83 -0
- data/Rakefile +4 -0
- data/auction-ruby-base.gemspec +35 -0
- data/examples/create_account.rb +26 -0
- data/examples/low_level_transaction_post.rb +46 -0
- data/examples/mid_level_transaction_post.rb +33 -0
- data/examples/non_native_payment.rb +60 -0
- data/examples/offer.rb +75 -0
- data/examples/transaction_merge.rb +23 -0
- data/generated/stellar-base-generated.rb +174 -0
- data/generated/stellar/account_entry.rb +55 -0
- data/generated/stellar/account_entry/ext.rb +24 -0
- data/generated/stellar/account_flags.rb +31 -0
- data/generated/stellar/account_merge_result.rb +26 -0
- data/generated/stellar/account_merge_result_code.rb +30 -0
- data/generated/stellar/affirm_fail_op.rb +22 -0
- data/generated/stellar/affirm_fail_result.rb +25 -0
- data/generated/stellar/affirm_fail_result_code.rb +22 -0
- data/generated/stellar/affirm_pass_op.rb +24 -0
- data/generated/stellar/affirm_pass_result.rb +25 -0
- data/generated/stellar/affirm_pass_result_code.rb +22 -0
- data/generated/stellar/allow_trust_op.rb +38 -0
- data/generated/stellar/allow_trust_op/asset.rb +33 -0
- data/generated/stellar/allow_trust_result.rb +25 -0
- data/generated/stellar/allow_trust_result_code.rb +31 -0
- data/generated/stellar/asset.rb +47 -0
- data/generated/stellar/asset/alpha_num12.rb +22 -0
- data/generated/stellar/asset/alpha_num4.rb +22 -0
- data/generated/stellar/asset_type.rb +24 -0
- data/generated/stellar/auth.rb +20 -0
- data/generated/stellar/auth_cert.rb +22 -0
- data/generated/stellar/authenticated_message.rb +32 -0
- data/generated/stellar/authenticated_message/v0.rb +24 -0
- data/generated/stellar/bucket_entry.rb +28 -0
- data/generated/stellar/bucket_entry_type.rb +22 -0
- data/generated/stellar/change_trust_op.rb +22 -0
- data/generated/stellar/change_trust_result.rb +25 -0
- data/generated/stellar/change_trust_result_code.rb +31 -0
- data/generated/stellar/claim_offer_atom.rb +33 -0
- data/generated/stellar/create_account_op.rb +20 -0
- data/generated/stellar/create_account_result.rb +25 -0
- data/generated/stellar/create_account_result_code.rb +32 -0
- data/generated/stellar/create_bid_op.rb +20 -0
- data/generated/stellar/create_bid_result.rb +25 -0
- data/generated/stellar/create_bid_result_code.rb +22 -0
- data/generated/stellar/create_lot_op.rb +46 -0
- data/generated/stellar/create_lot_result.rb +25 -0
- data/generated/stellar/create_lot_result_code.rb +22 -0
- data/generated/stellar/create_passive_offer_op.rb +24 -0
- data/generated/stellar/crypto_key_type.rb +20 -0
- data/generated/stellar/curve25519_public.rb +18 -0
- data/generated/stellar/curve25519_secret.rb +18 -0
- data/generated/stellar/decorated_signature.rb +20 -0
- data/generated/stellar/dont_have.rb +20 -0
- data/generated/stellar/envelope_type.rb +24 -0
- data/generated/stellar/error.rb +20 -0
- data/generated/stellar/error_code.rb +28 -0
- data/generated/stellar/hello.rb +34 -0
- data/generated/stellar/hmac_sha256_key.rb +18 -0
- data/generated/stellar/hmac_sha256_mac.rb +18 -0
- data/generated/stellar/inflation_payout.rb +20 -0
- data/generated/stellar/inflation_result.rb +26 -0
- data/generated/stellar/inflation_result_code.rb +24 -0
- data/generated/stellar/ip_addr_type.rb +22 -0
- data/generated/stellar/ledger_entry.rb +52 -0
- data/generated/stellar/ledger_entry/data.rb +49 -0
- data/generated/stellar/ledger_entry/ext.rb +24 -0
- data/generated/stellar/ledger_entry_change.rb +35 -0
- data/generated/stellar/ledger_entry_change_type.rb +26 -0
- data/generated/stellar/ledger_entry_type.rb +32 -0
- data/generated/stellar/ledger_header.rb +69 -0
- data/generated/stellar/ledger_header/ext.rb +24 -0
- data/generated/stellar/ledger_header_history_entry.rb +33 -0
- data/generated/stellar/ledger_header_history_entry/ext.rb +24 -0
- data/generated/stellar/ledger_key.rb +87 -0
- data/generated/stellar/ledger_key/account.rb +20 -0
- data/generated/stellar/ledger_key/lot.rb +22 -0
- data/generated/stellar/ledger_key/message.rb +22 -0
- data/generated/stellar/ledger_key/offer.rb +22 -0
- data/generated/stellar/ledger_key/participant.rb +22 -0
- data/generated/stellar/ledger_key/proof.rb +22 -0
- data/generated/stellar/ledger_key/trust_line.rb +22 -0
- data/generated/stellar/ledger_scp_messages.rb +20 -0
- data/generated/stellar/ledger_upgrade.rb +31 -0
- data/generated/stellar/ledger_upgrade_type.rb +24 -0
- data/generated/stellar/lot_branch.rb +21 -0
- data/generated/stellar/lot_entry.rb +64 -0
- data/generated/stellar/lot_entry/ext.rb +24 -0
- data/generated/stellar/lot_type.rb +21 -0
- data/generated/stellar/manage_offer_effect.rb +24 -0
- data/generated/stellar/manage_offer_op.rb +28 -0
- data/generated/stellar/manage_offer_result.rb +26 -0
- data/generated/stellar/manage_offer_result_code.rb +50 -0
- data/generated/stellar/manage_offer_success_result.rb +34 -0
- data/generated/stellar/manage_offer_success_result/offer.rb +30 -0
- data/generated/stellar/memo.rb +38 -0
- data/generated/stellar/memo_type.rb +28 -0
- data/generated/stellar/message_entry.rb +38 -0
- data/generated/stellar/message_entry/ext.rb +24 -0
- data/generated/stellar/message_type.rb +51 -0
- data/generated/stellar/offer_entry.rb +49 -0
- data/generated/stellar/offer_entry/ext.rb +24 -0
- data/generated/stellar/offer_entry_flags.rb +21 -0
- data/generated/stellar/operation.rb +65 -0
- data/generated/stellar/operation/body.rb +88 -0
- data/generated/stellar/operation_meta.rb +18 -0
- data/generated/stellar/operation_result.rb +67 -0
- data/generated/stellar/operation_result/tr.rb +89 -0
- data/generated/stellar/operation_result_code.rb +25 -0
- data/generated/stellar/operation_type.rb +52 -0
- data/generated/stellar/participant_entry.rb +39 -0
- data/generated/stellar/participant_entry/ext.rb +24 -0
- data/generated/stellar/participant_state.rb +25 -0
- data/generated/stellar/path_payment_op.rb +32 -0
- data/generated/stellar/path_payment_result.rb +38 -0
- data/generated/stellar/path_payment_result/success.rb +22 -0
- data/generated/stellar/path_payment_result_code.rb +47 -0
- data/generated/stellar/payment_op.rb +22 -0
- data/generated/stellar/payment_result.rb +25 -0
- data/generated/stellar/payment_result_code.rb +41 -0
- data/generated/stellar/peer_address.rb +33 -0
- data/generated/stellar/peer_address/ip.rb +29 -0
- data/generated/stellar/price.rb +20 -0
- data/generated/stellar/proof_entry.rb +42 -0
- data/generated/stellar/proof_entry/ext.rb +24 -0
- data/generated/stellar/provide_proof_op.rb +24 -0
- data/generated/stellar/provide_proof_result.rb +25 -0
- data/generated/stellar/provide_proof_result_code.rb +22 -0
- data/generated/stellar/public_key.rb +23 -0
- data/generated/stellar/register_participant_op.rb +22 -0
- data/generated/stellar/register_participant_result.rb +25 -0
- data/generated/stellar/register_participant_result_code.rb +22 -0
- data/generated/stellar/scp_ballot.rb +20 -0
- data/generated/stellar/scp_envelope.rb +20 -0
- data/generated/stellar/scp_history_entry.rb +23 -0
- data/generated/stellar/scp_history_entry_v0.rb +20 -0
- data/generated/stellar/scp_nomination.rb +22 -0
- data/generated/stellar/scp_quorum_set.rb +22 -0
- data/generated/stellar/scp_statement.rb +58 -0
- data/generated/stellar/scp_statement/pledges.rb +63 -0
- data/generated/stellar/scp_statement/pledges/confirm.rb +30 -0
- data/generated/stellar/scp_statement/pledges/externalize.rb +26 -0
- data/generated/stellar/scp_statement/pledges/prepare.rb +32 -0
- data/generated/stellar/scp_statement_type.rb +26 -0
- data/generated/stellar/send_message_op.rb +22 -0
- data/generated/stellar/send_message_result.rb +25 -0
- data/generated/stellar/send_message_result_code.rb +22 -0
- data/generated/stellar/set_options_op.rb +41 -0
- data/generated/stellar/set_options_result.rb +25 -0
- data/generated/stellar/set_options_result_code.rb +40 -0
- data/generated/stellar/signer.rb +20 -0
- data/generated/stellar/simple_payment_result.rb +22 -0
- data/generated/stellar/stellar_message.rb +74 -0
- data/generated/stellar/stellar_value.rb +41 -0
- data/generated/stellar/stellar_value/ext.rb +24 -0
- data/generated/stellar/threshold_indexes.rb +26 -0
- data/generated/stellar/time_bounds.rb +20 -0
- data/generated/stellar/transaction.rb +50 -0
- data/generated/stellar/transaction/ext.rb +24 -0
- data/generated/stellar/transaction_envelope.rb +20 -0
- data/generated/stellar/transaction_history_entry.rb +33 -0
- data/generated/stellar/transaction_history_entry/ext.rb +24 -0
- data/generated/stellar/transaction_history_result_entry.rb +33 -0
- data/generated/stellar/transaction_history_result_entry/ext.rb +24 -0
- data/generated/stellar/transaction_meta.rb +23 -0
- data/generated/stellar/transaction_result.rb +43 -0
- data/generated/stellar/transaction_result/ext.rb +24 -0
- data/generated/stellar/transaction_result/result.rb +30 -0
- data/generated/stellar/transaction_result_code.rb +45 -0
- data/generated/stellar/transaction_result_pair.rb +20 -0
- data/generated/stellar/transaction_result_set.rb +18 -0
- data/generated/stellar/transaction_set.rb +20 -0
- data/generated/stellar/trust_line_entry.rb +41 -0
- data/generated/stellar/trust_line_entry/ext.rb +24 -0
- data/generated/stellar/trust_line_flags.rb +21 -0
- data/lib/stellar-base.rb +33 -0
- data/lib/stellar/account_flags.rb +28 -0
- data/lib/stellar/asset.rb +69 -0
- data/lib/stellar/base.rb +1 -0
- data/lib/stellar/base/version.rb +5 -0
- data/lib/stellar/convert.rb +32 -0
- data/lib/stellar/key_pair.rb +112 -0
- data/lib/stellar/networks.rb +45 -0
- data/lib/stellar/operation.rb +384 -0
- data/lib/stellar/path_payment_result.rb +17 -0
- data/lib/stellar/price.rb +32 -0
- data/lib/stellar/thresholds.rb +39 -0
- data/lib/stellar/transaction.rb +205 -0
- data/lib/stellar/transaction_envelope.rb +32 -0
- data/lib/stellar/util/continued_fraction.rb +96 -0
- data/lib/stellar/util/strkey.rb +43 -0
- data/spec/lib/stellar/account_flags_spec.rb +19 -0
- data/spec/lib/stellar/asset_spec.rb +45 -0
- data/spec/lib/stellar/convert_spec.rb +61 -0
- data/spec/lib/stellar/key_pair_spec.rb +238 -0
- data/spec/lib/stellar/networks_spec.rb +77 -0
- data/spec/lib/stellar/operation_spec.rb +13 -0
- data/spec/lib/stellar/path_payment_result_spec.rb +95 -0
- data/spec/lib/stellar/price_spec.rb +34 -0
- data/spec/lib/stellar/thresholds_spec.rb +62 -0
- data/spec/lib/stellar/transaction_envelope_spec.rb +93 -0
- data/spec/lib/stellar/transaction_spec.rb +83 -0
- data/spec/lib/stellar/util/strkey_spec.rb +46 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/matchers/be_strkey.rb +9 -0
- data/spec/support/matchers/eq_bytes.rb +5 -0
- data/spec/support/matchers/have_length.rb +5 -0
- data/tasks/rspec.rake +6 -0
- data/tasks/travis.rake +1 -0
- data/tasks/xdr.rake +50 -0
- data/xdr/Stellar-SCP.x +86 -0
- data/xdr/Stellar-ledger-entries.x +351 -0
- data/xdr/Stellar-ledger.x +288 -0
- data/xdr/Stellar-overlay.x +146 -0
- data/xdr/Stellar-transaction.x +936 -0
- data/xdr/Stellar-types.x +55 -0
- 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
|