xpring 0.1.2

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,135 @@
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
+ DEFAULT_DEADLINE_OFFSET = 60
18
+ MAX_LEDGER_VERSION_OFFSET = 10
19
+ X_ADDRESS_REQUIRED_MSG = "Please use the X-Address format. See: https://xrpaddress.info"
20
+ private_constant :MAX_LEDGER_VERSION_OFFSET, :X_ADDRESS_REQUIRED_MSG
21
+
22
+ attr_reader :grpc_url, :credentials, :deadline_offset
23
+
24
+ # @param grpc_url [#to_s]
25
+ # @param credentials [GRPC::Core::ChannelCredentials,
26
+ # :this_channel_is_insecure]
27
+ # @param deadline_offset [Integer, nil] how many seconds each network call
28
+ # is allowed to take
29
+ def initialize(grpc_url, credentials: :this_channel_is_insecure, deadline_offset: nil)
30
+ @grpc_url = grpc_url.to_s
31
+ @credentials = credentials
32
+ @deadline_offset = deadline_offset || DEFAULT_DEADLINE_OFFSET
33
+ end
34
+
35
+ # @param address [#to_s] classic address
36
+ # @return [Integer, nil]
37
+ def balance_of(address)
38
+ account_data(address.to_s)&.account_data
39
+ &.balance&.value&.xrp_amount&.drops
40
+ end
41
+
42
+ # @param transaction [#to_s]
43
+ # @return [Symbol, nil]
44
+ def status_of(transaction)
45
+ transaction_data(transaction.to_s)&.meta
46
+ &.transaction_result&.result_type
47
+ end
48
+
49
+ # @param amount [#to_s]
50
+ # @param to [#to_s]
51
+ # @param from [Xpring::Wallet]
52
+ # @raise [Xpring::Error]
53
+ # @return [Org::Xrpl::Rpc::V1::SubmitTransactionResponse]
54
+ def send_xrp(amount:, to:, from:)
55
+ to = to.to_s
56
+
57
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) unless Util.valid_x_address?(to)
58
+
59
+ classic_from_address = Util.decode(from.address)[:address]
60
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) unless classic_from_address
61
+
62
+ classic_to_address = Util.decode(to)[:address]
63
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) unless classic_to_address
64
+
65
+ account_data = account_data(classic_from_address)
66
+ raise Error.new(X_ADDRESS_REQUIRED_MSG) if account_data.nil?
67
+
68
+ transaction_hash = {
69
+ Account: classic_from_address,
70
+ Fee: minimum_fee.to_s, # ripple-binary-codec requires string
71
+ LastLedgerSequence: next_sequence_for_transaction,
72
+ Sequence: account_data.account_data.sequence.value,
73
+ SigningPubKey: from.public_key,
74
+ Amount: amount.to_s, # ripple-binary-codec requires string
75
+ Destination: classic_to_address,
76
+ TransactionType: "Payment",
77
+ }
78
+
79
+ client.submit_transaction(Org::Xrpl::Rpc::V1::SubmitTransactionRequest.new(
80
+ signed_transaction: Signer.sign(
81
+ transaction_hash: transaction_hash,
82
+ from_wallet: from,
83
+ ),
84
+ ))
85
+ end
86
+
87
+ private
88
+
89
+ def deadline
90
+ Time.now + deadline_offset
91
+ end
92
+
93
+ def client
94
+ @client ||= Org::Xrpl::Rpc::V1::XRPLedgerAPIService::Stub.new(
95
+ grpc_url,
96
+ credentials,
97
+ )
98
+ end
99
+
100
+ def fee_response
101
+ client.get_fee(Org::Xrpl::Rpc::V1::GetFeeRequest.new, deadline: deadline)
102
+ rescue GRPC::DeadlineExceeded
103
+ end
104
+
105
+ def minimum_fee
106
+ fee_response.fee.minimum_fee.drops
107
+ end
108
+
109
+ def account_data(address)
110
+ client.get_account_info(
111
+ Org::Xrpl::Rpc::V1::GetAccountInfoRequest.new(
112
+ account: Org::Xrpl::Rpc::V1::AccountAddress.new(
113
+ address: address,
114
+ ),
115
+ ),
116
+ deadline: deadline,
117
+ )
118
+ rescue GRPC::NotFound, GRPC::DeadlineExceeded
119
+ end
120
+
121
+ def transaction_data(transaction)
122
+ client.get_transaction(
123
+ Org::Xrpl::Rpc::V1::GetTransactionRequest.new(
124
+ hash: Util.byte_string_from_string(transaction),
125
+ ),
126
+ deadline: deadline,
127
+ )
128
+ rescue GRPC::NotFound, GRPC::DeadlineExceeded
129
+ end
130
+
131
+ def next_sequence_for_transaction
132
+ fee_response.ledger_current_index + MAX_LEDGER_VERSION_OFFSET
133
+ end
134
+ end
135
+ end