xpring 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.
@@ -0,0 +1,31 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: org/xrpl/rpc/v1/submit.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'org/xrpl/rpc/v1/meta_pb'
7
+ Google::Protobuf::DescriptorPool.generated_pool.build do
8
+ add_file("org/xrpl/rpc/v1/submit.proto", :syntax => :proto3) do
9
+ add_message "org.xrpl.rpc.v1.SubmitTransactionRequest" do
10
+ optional :signed_transaction, :bytes, 1
11
+ optional :fail_hard, :bool, 2
12
+ end
13
+ add_message "org.xrpl.rpc.v1.SubmitTransactionResponse" do
14
+ optional :engine_result, :message, 1, "org.xrpl.rpc.v1.TransactionResult"
15
+ optional :engine_result_code, :int64, 2
16
+ optional :engine_result_message, :string, 3
17
+ optional :hash, :bytes, 4
18
+ end
19
+ end
20
+ end
21
+
22
+ module Org
23
+ module Xrpl
24
+ module Rpc
25
+ module V1
26
+ SubmitTransactionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.SubmitTransactionRequest").msgclass
27
+ SubmitTransactionResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.SubmitTransactionResponse").msgclass
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,199 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: org/xrpl/rpc/v1/transaction.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'org/xrpl/rpc/v1/common_pb'
7
+ require 'org/xrpl/rpc/v1/amount_pb'
8
+ require 'org/xrpl/rpc/v1/account_pb'
9
+ Google::Protobuf::DescriptorPool.generated_pool.build do
10
+ add_file("org/xrpl/rpc/v1/transaction.proto", :syntax => :proto3) do
11
+ add_message "org.xrpl.rpc.v1.Transaction" do
12
+ optional :account, :message, 1, "org.xrpl.rpc.v1.Account"
13
+ optional :fee, :message, 2, "org.xrpl.rpc.v1.XRPDropsAmount"
14
+ optional :sequence, :message, 3, "org.xrpl.rpc.v1.Sequence"
15
+ optional :signing_public_key, :message, 5, "org.xrpl.rpc.v1.SigningPublicKey"
16
+ optional :transaction_signature, :message, 6, "org.xrpl.rpc.v1.TransactionSignature"
17
+ optional :flags, :message, 7, "org.xrpl.rpc.v1.Flags"
18
+ optional :last_ledger_sequence, :message, 8, "org.xrpl.rpc.v1.LastLedgerSequence"
19
+ optional :source_tag, :message, 9, "org.xrpl.rpc.v1.SourceTag"
20
+ repeated :memos, :message, 10, "org.xrpl.rpc.v1.Memo"
21
+ repeated :signers, :message, 11, "org.xrpl.rpc.v1.Signer"
22
+ optional :account_transaction_id, :message, 12, "org.xrpl.rpc.v1.AccountTransactionID"
23
+ oneof :transaction_data do
24
+ optional :payment, :message, 4, "org.xrpl.rpc.v1.Payment"
25
+ optional :account_set, :message, 13, "org.xrpl.rpc.v1.AccountSet"
26
+ optional :account_delete, :message, 14, "org.xrpl.rpc.v1.AccountDelete"
27
+ optional :check_cancel, :message, 15, "org.xrpl.rpc.v1.CheckCancel"
28
+ optional :check_cash, :message, 16, "org.xrpl.rpc.v1.CheckCash"
29
+ optional :check_create, :message, 17, "org.xrpl.rpc.v1.CheckCreate"
30
+ optional :deposit_preauth, :message, 18, "org.xrpl.rpc.v1.DepositPreauth"
31
+ optional :escrow_cancel, :message, 19, "org.xrpl.rpc.v1.EscrowCancel"
32
+ optional :escrow_create, :message, 20, "org.xrpl.rpc.v1.EscrowCreate"
33
+ optional :escrow_finish, :message, 21, "org.xrpl.rpc.v1.EscrowFinish"
34
+ optional :offer_cancel, :message, 22, "org.xrpl.rpc.v1.OfferCancel"
35
+ optional :offer_create, :message, 23, "org.xrpl.rpc.v1.OfferCreate"
36
+ optional :payment_channel_claim, :message, 24, "org.xrpl.rpc.v1.PaymentChannelClaim"
37
+ optional :payment_channel_create, :message, 25, "org.xrpl.rpc.v1.PaymentChannelCreate"
38
+ optional :payment_channel_fund, :message, 26, "org.xrpl.rpc.v1.PaymentChannelFund"
39
+ optional :set_regular_key, :message, 27, "org.xrpl.rpc.v1.SetRegularKey"
40
+ optional :signer_list_set, :message, 28, "org.xrpl.rpc.v1.SignerListSet"
41
+ optional :trust_set, :message, 29, "org.xrpl.rpc.v1.TrustSet"
42
+ end
43
+ end
44
+ add_message "org.xrpl.rpc.v1.Memo" do
45
+ optional :memo_data, :message, 1, "org.xrpl.rpc.v1.MemoData"
46
+ optional :memo_format, :message, 2, "org.xrpl.rpc.v1.MemoFormat"
47
+ optional :memo_type, :message, 3, "org.xrpl.rpc.v1.MemoType"
48
+ end
49
+ add_message "org.xrpl.rpc.v1.Signer" do
50
+ optional :account, :message, 1, "org.xrpl.rpc.v1.Account"
51
+ optional :transaction_signature, :message, 2, "org.xrpl.rpc.v1.TransactionSignature"
52
+ optional :signing_public_key, :message, 3, "org.xrpl.rpc.v1.SigningPublicKey"
53
+ end
54
+ add_message "org.xrpl.rpc.v1.AccountSet" do
55
+ optional :clear_flag, :message, 1, "org.xrpl.rpc.v1.ClearFlag"
56
+ optional :domain, :message, 2, "org.xrpl.rpc.v1.Domain"
57
+ optional :email_hash, :message, 3, "org.xrpl.rpc.v1.EmailHash"
58
+ optional :message_key, :message, 4, "org.xrpl.rpc.v1.MessageKey"
59
+ optional :set_flag, :message, 5, "org.xrpl.rpc.v1.SetFlag"
60
+ optional :transfer_rate, :message, 6, "org.xrpl.rpc.v1.TransferRate"
61
+ optional :tick_size, :message, 7, "org.xrpl.rpc.v1.TickSize"
62
+ end
63
+ add_message "org.xrpl.rpc.v1.AccountDelete" do
64
+ optional :destination, :message, 1, "org.xrpl.rpc.v1.Destination"
65
+ optional :destination_tag, :message, 2, "org.xrpl.rpc.v1.DestinationTag"
66
+ end
67
+ add_message "org.xrpl.rpc.v1.CheckCancel" do
68
+ optional :check_id, :message, 1, "org.xrpl.rpc.v1.CheckID"
69
+ end
70
+ add_message "org.xrpl.rpc.v1.CheckCash" do
71
+ optional :check_id, :message, 1, "org.xrpl.rpc.v1.CheckID"
72
+ oneof :amount_oneof do
73
+ optional :amount, :message, 2, "org.xrpl.rpc.v1.Amount"
74
+ optional :deliver_min, :message, 3, "org.xrpl.rpc.v1.DeliverMin"
75
+ end
76
+ end
77
+ add_message "org.xrpl.rpc.v1.CheckCreate" do
78
+ optional :destination, :message, 1, "org.xrpl.rpc.v1.Destination"
79
+ optional :send_max, :message, 2, "org.xrpl.rpc.v1.SendMax"
80
+ optional :destination_tag, :message, 3, "org.xrpl.rpc.v1.DestinationTag"
81
+ optional :expiration, :message, 4, "org.xrpl.rpc.v1.Expiration"
82
+ optional :invoice_id, :message, 5, "org.xrpl.rpc.v1.InvoiceID"
83
+ end
84
+ add_message "org.xrpl.rpc.v1.DepositPreauth" do
85
+ oneof :authorization_oneof do
86
+ optional :authorize, :message, 1, "org.xrpl.rpc.v1.Authorize"
87
+ optional :unauthorize, :message, 2, "org.xrpl.rpc.v1.Unauthorize"
88
+ end
89
+ end
90
+ add_message "org.xrpl.rpc.v1.EscrowCancel" do
91
+ optional :owner, :message, 1, "org.xrpl.rpc.v1.Owner"
92
+ optional :offer_sequence, :message, 2, "org.xrpl.rpc.v1.OfferSequence"
93
+ end
94
+ add_message "org.xrpl.rpc.v1.EscrowCreate" do
95
+ optional :amount, :message, 1, "org.xrpl.rpc.v1.Amount"
96
+ optional :destination, :message, 2, "org.xrpl.rpc.v1.Destination"
97
+ optional :cancel_after, :message, 3, "org.xrpl.rpc.v1.CancelAfter"
98
+ optional :finish_after, :message, 4, "org.xrpl.rpc.v1.FinishAfter"
99
+ optional :condition, :message, 5, "org.xrpl.rpc.v1.Condition"
100
+ optional :destination_tag, :message, 6, "org.xrpl.rpc.v1.DestinationTag"
101
+ end
102
+ add_message "org.xrpl.rpc.v1.EscrowFinish" do
103
+ optional :owner, :message, 1, "org.xrpl.rpc.v1.Owner"
104
+ optional :offer_sequence, :message, 2, "org.xrpl.rpc.v1.OfferSequence"
105
+ optional :condition, :message, 3, "org.xrpl.rpc.v1.Condition"
106
+ optional :fulfillment, :message, 4, "org.xrpl.rpc.v1.Fulfillment"
107
+ end
108
+ add_message "org.xrpl.rpc.v1.OfferCancel" do
109
+ optional :offer_sequence, :message, 1, "org.xrpl.rpc.v1.OfferSequence"
110
+ end
111
+ add_message "org.xrpl.rpc.v1.OfferCreate" do
112
+ optional :expiration, :message, 1, "org.xrpl.rpc.v1.Expiration"
113
+ optional :offer_sequence, :message, 2, "org.xrpl.rpc.v1.OfferSequence"
114
+ optional :taker_gets, :message, 3, "org.xrpl.rpc.v1.TakerGets"
115
+ optional :taker_pays, :message, 4, "org.xrpl.rpc.v1.TakerPays"
116
+ end
117
+ add_message "org.xrpl.rpc.v1.Payment" do
118
+ optional :amount, :message, 1, "org.xrpl.rpc.v1.Amount"
119
+ optional :destination, :message, 2, "org.xrpl.rpc.v1.Destination"
120
+ optional :destination_tag, :message, 3, "org.xrpl.rpc.v1.DestinationTag"
121
+ optional :invoice_id, :message, 4, "org.xrpl.rpc.v1.InvoiceID"
122
+ repeated :paths, :message, 5, "org.xrpl.rpc.v1.Payment.Path"
123
+ optional :send_max, :message, 6, "org.xrpl.rpc.v1.SendMax"
124
+ optional :deliver_min, :message, 7, "org.xrpl.rpc.v1.DeliverMin"
125
+ end
126
+ add_message "org.xrpl.rpc.v1.Payment.PathElement" do
127
+ optional :account, :message, 1, "org.xrpl.rpc.v1.AccountAddress"
128
+ optional :currency, :message, 2, "org.xrpl.rpc.v1.Currency"
129
+ optional :issuer, :message, 3, "org.xrpl.rpc.v1.AccountAddress"
130
+ end
131
+ add_message "org.xrpl.rpc.v1.Payment.Path" do
132
+ repeated :elements, :message, 1, "org.xrpl.rpc.v1.Payment.PathElement"
133
+ end
134
+ add_message "org.xrpl.rpc.v1.PaymentChannelClaim" do
135
+ optional :channel, :message, 1, "org.xrpl.rpc.v1.Channel"
136
+ optional :balance, :message, 2, "org.xrpl.rpc.v1.Balance"
137
+ optional :amount, :message, 3, "org.xrpl.rpc.v1.Amount"
138
+ optional :payment_channel_signature, :message, 4, "org.xrpl.rpc.v1.PaymentChannelSignature"
139
+ optional :public_key, :message, 5, "org.xrpl.rpc.v1.PublicKey"
140
+ end
141
+ add_message "org.xrpl.rpc.v1.PaymentChannelCreate" do
142
+ optional :amount, :message, 1, "org.xrpl.rpc.v1.Amount"
143
+ optional :destination, :message, 2, "org.xrpl.rpc.v1.Destination"
144
+ optional :settle_delay, :message, 3, "org.xrpl.rpc.v1.SettleDelay"
145
+ optional :public_key, :message, 4, "org.xrpl.rpc.v1.PublicKey"
146
+ optional :cancel_after, :message, 5, "org.xrpl.rpc.v1.CancelAfter"
147
+ optional :destination_tag, :message, 6, "org.xrpl.rpc.v1.DestinationTag"
148
+ end
149
+ add_message "org.xrpl.rpc.v1.PaymentChannelFund" do
150
+ optional :channel, :message, 1, "org.xrpl.rpc.v1.Channel"
151
+ optional :amount, :message, 2, "org.xrpl.rpc.v1.Amount"
152
+ optional :expiration, :message, 3, "org.xrpl.rpc.v1.Expiration"
153
+ end
154
+ add_message "org.xrpl.rpc.v1.SetRegularKey" do
155
+ optional :regular_key, :message, 1, "org.xrpl.rpc.v1.RegularKey"
156
+ end
157
+ add_message "org.xrpl.rpc.v1.SignerListSet" do
158
+ optional :signer_quorum, :message, 1, "org.xrpl.rpc.v1.SignerQuorum"
159
+ repeated :signer_entries, :message, 2, "org.xrpl.rpc.v1.SignerEntry"
160
+ end
161
+ add_message "org.xrpl.rpc.v1.TrustSet" do
162
+ optional :limit_amount, :message, 1, "org.xrpl.rpc.v1.LimitAmount"
163
+ optional :quality_in, :message, 2, "org.xrpl.rpc.v1.QualityIn"
164
+ optional :quality_out, :message, 3, "org.xrpl.rpc.v1.QualityOut"
165
+ end
166
+ end
167
+ end
168
+
169
+ module Org
170
+ module Xrpl
171
+ module Rpc
172
+ module V1
173
+ Transaction = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.Transaction").msgclass
174
+ Memo = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.Memo").msgclass
175
+ Signer = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.Signer").msgclass
176
+ AccountSet = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.AccountSet").msgclass
177
+ AccountDelete = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.AccountDelete").msgclass
178
+ CheckCancel = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.CheckCancel").msgclass
179
+ CheckCash = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.CheckCash").msgclass
180
+ CheckCreate = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.CheckCreate").msgclass
181
+ DepositPreauth = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.DepositPreauth").msgclass
182
+ EscrowCancel = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.EscrowCancel").msgclass
183
+ EscrowCreate = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.EscrowCreate").msgclass
184
+ EscrowFinish = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.EscrowFinish").msgclass
185
+ OfferCancel = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.OfferCancel").msgclass
186
+ OfferCreate = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.OfferCreate").msgclass
187
+ Payment = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.Payment").msgclass
188
+ Payment::PathElement = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.Payment.PathElement").msgclass
189
+ Payment::Path = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.Payment.Path").msgclass
190
+ PaymentChannelClaim = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.PaymentChannelClaim").msgclass
191
+ PaymentChannelCreate = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.PaymentChannelCreate").msgclass
192
+ PaymentChannelFund = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.PaymentChannelFund").msgclass
193
+ SetRegularKey = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.SetRegularKey").msgclass
194
+ SignerListSet = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.SignerListSet").msgclass
195
+ TrustSet = Google::Protobuf::DescriptorPool.generated_pool.lookup("org.xrpl.rpc.v1.TrustSet").msgclass
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,23 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: org/xrpl/rpc/v1/xrp_ledger.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ require 'org/xrpl/rpc/v1/get_account_info_pb'
7
+ require 'org/xrpl/rpc/v1/get_fee_pb'
8
+ require 'org/xrpl/rpc/v1/submit_pb'
9
+ require 'org/xrpl/rpc/v1/get_transaction_pb'
10
+ require 'org/xrpl/rpc/v1/get_account_transaction_history_pb'
11
+ Google::Protobuf::DescriptorPool.generated_pool.build do
12
+ add_file("org/xrpl/rpc/v1/xrp_ledger.proto", :syntax => :proto3) do
13
+ end
14
+ end
15
+
16
+ module Org
17
+ module Xrpl
18
+ module Rpc
19
+ module V1
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # Source: org/xrpl/rpc/v1/xrp_ledger.proto for package 'org.xrpl.rpc.v1'
3
+
4
+ require 'grpc'
5
+ require 'org/xrpl/rpc/v1/xrp_ledger_pb'
6
+
7
+ module Org
8
+ module Xrpl
9
+ module Rpc
10
+ module V1
11
+ module XRPLedgerAPIService
12
+ # RPCs available to interact with the XRP Ledger.
13
+ class Service
14
+
15
+ include GRPC::GenericService
16
+
17
+ self.marshal_class_method = :encode
18
+ self.unmarshal_class_method = :decode
19
+ self.service_name = 'org.xrpl.rpc.v1.XRPLedgerAPIService'
20
+
21
+ # Get account info for an account on the XRP Ledger.
22
+ rpc :GetAccountInfo, GetAccountInfoRequest, GetAccountInfoResponse
23
+ # Get the fee for a transaction on the XRP Ledger.
24
+ rpc :GetFee, GetFeeRequest, GetFeeResponse
25
+ # Submit a signed transaction to the XRP Ledger.
26
+ rpc :SubmitTransaction, SubmitTransactionRequest, SubmitTransactionResponse
27
+ # Get the status of a transaction
28
+ rpc :GetTransaction, GetTransactionRequest, GetTransactionResponse
29
+ rpc :GetAccountTransactionHistory, GetAccountTransactionHistoryRequest, GetAccountTransactionHistoryResponse
30
+ end
31
+
32
+ Stub = Service.rpc_stub_class
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "xpring/version"
4
+ require "xpring/wallet"
5
+ require "xpring/util"
6
+ require "xpring/client"
7
+ require "xpring/error"
8
+
9
+ # Entrypoint of library
10
+ module Xpring
11
+ @debug = false
12
+
13
+ # @return [true, false]
14
+ def self.debug?
15
+ @debug
16
+ end
17
+
18
+ # @return [true, false]
19
+ def self.toggle_debug!
20
+ @debug = !@debug
21
+ end
22
+
23
+ # @param value [#to_s]
24
+ # @return [nil]
25
+ def self.debug_log(value)
26
+ puts value if debug?
27
+ end
28
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "grpc"
4
+ require "xpring/util"
5
+ require "xpring/error"
6
+ require "xpring/signer"
7
+ require "org/xrpl/rpc/v1/get_account_info_pb"
8
+ require "org/xrpl/rpc/v1/get_transaction_pb"
9
+ require "org/xrpl/rpc/v1/account_pb"
10
+ require "org/xrpl/rpc/v1/submit_pb"
11
+ require "org/xrpl/rpc/v1/xrp_ledger_services_pb"
12
+ require "org/xrpl/rpc/v1/get_fee_pb"
13
+
14
+ module Xpring
15
+ # Make GRPC network calls to XRP ledger
16
+ class Client
17
+ MAX_LEDGER_VERSION_OFFSET = 10
18
+ X_ADDRESS_REQUIRED_MSG = "Please use the X-Address format. See: https://xrpaddress.info"
19
+ private_constant :MAX_LEDGER_VERSION_OFFSET, :X_ADDRESS_REQUIRED_MSG
20
+
21
+ attr_reader :grpc_url, :credentials
22
+
23
+ # @param grpc_url [#to_s]
24
+ # @param credentials [GRPC::Core::ChannelCredentials,
25
+ # :this_channel_is_insecure]
26
+ def initialize(grpc_url, credentials: :this_channel_is_insecure)
27
+ @grpc_url = grpc_url.to_s
28
+ @credentials = credentials
29
+ end
30
+
31
+ # @param address [#to_s] classic address
32
+ # @return [Integer, nil]
33
+ def balance_of(address)
34
+ account_data(address.to_s)&.account_data
35
+ &.balance&.value&.xrp_amount&.drops
36
+ end
37
+
38
+ # @param transaction [#to_s]
39
+ # @return [Symbol, nil]
40
+ def status_of(transaction)
41
+ transaction_data(transaction.to_s)&.meta
42
+ &.transaction_result&.result_type
43
+ end
44
+
45
+ # @param amount [#to_s]
46
+ # @param to [#to_s]
47
+ # @param from [Xpring::Wallet]
48
+ # @raise [Xpring::Error]
49
+ # @return [Org::Xrpl::Rpc::V1::SubmitTransactionResponse]
50
+ def send_xrp(amount:, to:, from:)
51
+ to = to.to_s
52
+
53
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) unless Util.valid_x_address?(to)
54
+
55
+ classic_from_address = Util.decode(from.address)[:address]
56
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) unless classic_from_address
57
+
58
+ classic_to_address = Util.decode(to)[:address]
59
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) unless classic_to_address
60
+
61
+ account_data = account_data(classic_from_address)
62
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) if account_data.nil?
63
+
64
+ transaction_hash = {
65
+ Account: classic_from_address,
66
+ Fee: minimum_fee.to_s, # ripple-binary-codec requires string
67
+ LastLedgerSequence: next_sequence_for_transaction,
68
+ Sequence: account_data.account_data.sequence.value,
69
+ SigningPubKey: from.public_key,
70
+ Amount: amount.to_s, # ripple-binary-codec requires string
71
+ Destination: classic_to_address,
72
+ TransactionType: "Payment",
73
+ }
74
+
75
+ client.submit_transaction(Org::Xrpl::Rpc::V1::SubmitTransactionRequest.new(
76
+ signed_transaction: Signer.sign(
77
+ transaction_hash: transaction_hash,
78
+ from_wallet: from,
79
+ ),
80
+ ))
81
+ end
82
+
83
+ private
84
+
85
+ def client
86
+ @client ||= Org::Xrpl::Rpc::V1::XRPLedgerAPIService::Stub.new(
87
+ grpc_url,
88
+ credentials,
89
+ )
90
+ end
91
+
92
+ def fee_response
93
+ client.get_fee(Org::Xrpl::Rpc::V1::GetFeeRequest.new)
94
+ end
95
+
96
+ def minimum_fee
97
+ fee_response.fee.minimum_fee.drops
98
+ end
99
+
100
+ def account_data(address)
101
+ client.get_account_info(Org::Xrpl::Rpc::V1::GetAccountInfoRequest.new(
102
+ account: Org::Xrpl::Rpc::V1::AccountAddress.new(
103
+ address: address,
104
+ ),
105
+ ))
106
+ rescue GRPC::NotFound
107
+ end
108
+
109
+ def transaction_data(transaction)
110
+ client.get_transaction(Org::Xrpl::Rpc::V1::GetTransactionRequest.new(
111
+ hash: Util.byte_string_from_string(transaction),
112
+ ))
113
+ rescue GRPC::NotFound
114
+ end
115
+
116
+ def next_sequence_for_transaction
117
+ fee_response.ledger_current_index + MAX_LEDGER_VERSION_OFFSET
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Xpring
4
+ class Error < StandardError
5
+ end
6
+ end