stellar-base 0.26.0 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -32
  3. data/README.md +3 -3
  4. data/generated/stellar-base-generated.rb +15 -0
  5. data/generated/stellar/account_flags.rb +9 -4
  6. data/generated/stellar/account_merge_result.rb +1 -1
  7. data/generated/stellar/allow_trust_op.rb +3 -18
  8. data/generated/stellar/asset_code.rb +30 -0
  9. data/generated/stellar/begin_sponsoring_future_reserves_result.rb +2 -1
  10. data/generated/stellar/claimable_balance_entry.rb +2 -0
  11. data/generated/stellar/claimable_balance_entry/ext.rb +4 -0
  12. data/generated/stellar/claimable_balance_entry_extension_v1.rb +30 -0
  13. data/generated/stellar/claimable_balance_entry_extension_v1/ext.rb +24 -0
  14. data/generated/stellar/claimable_balance_flags.rb +22 -0
  15. data/generated/stellar/clawback_claimable_balance_op.rb +18 -0
  16. data/generated/stellar/clawback_claimable_balance_result.rb +26 -0
  17. data/generated/stellar/clawback_claimable_balance_result_code.rb +29 -0
  18. data/generated/stellar/clawback_op.rb +22 -0
  19. data/generated/stellar/clawback_result.rb +25 -0
  20. data/generated/stellar/clawback_result_code.rb +31 -0
  21. data/generated/stellar/create_passive_sell_offer_op.rb +1 -1
  22. data/generated/stellar/end_sponsoring_future_reserves_result.rb +2 -1
  23. data/generated/stellar/operation.rb +6 -0
  24. data/generated/stellar/operation/body.rb +12 -0
  25. data/generated/stellar/operation_result.rb +6 -0
  26. data/generated/stellar/operation_result/tr.rb +12 -0
  27. data/generated/stellar/operation_type.rb +7 -1
  28. data/generated/stellar/payment_result_code.rb +1 -1
  29. data/generated/stellar/revoke_sponsorship_op.rb +1 -2
  30. data/generated/stellar/set_options_result_code.rb +14 -11
  31. data/generated/stellar/set_trust_line_flags_op.rb +25 -0
  32. data/generated/stellar/set_trust_line_flags_result.rb +25 -0
  33. data/generated/stellar/set_trust_line_flags_result_code.rb +31 -0
  34. data/generated/stellar/transaction_result_code.rb +1 -1
  35. data/generated/stellar/trust_line_flags.rb +5 -1
  36. data/lib/stellar-base.rb +2 -2
  37. data/lib/stellar/compat.rb +2 -1
  38. data/lib/stellar/concerns/transaction.rb +4 -2
  39. data/lib/stellar/dsl.rb +4 -0
  40. data/lib/stellar/operation.rb +85 -16
  41. data/lib/stellar/trust_line_flags.rb +53 -0
  42. data/lib/stellar/version.rb +3 -0
  43. metadata +27 -12
  44. data/generated/stellar/allow_trust_op/asset.rb +0 -33
  45. data/lib/stellar/base/version.rb +0 -5
@@ -0,0 +1,31 @@
1
+ # This code was automatically generated using xdrgen
2
+ # DO NOT EDIT or your changes may be overwritten
3
+
4
+ require 'xdr'
5
+
6
+ # === xdr source ============================================================
7
+ #
8
+ # enum SetTrustLineFlagsResultCode
9
+ # {
10
+ # // codes considered as "success" for the operation
11
+ # SET_TRUST_LINE_FLAGS_SUCCESS = 0,
12
+ #
13
+ # // codes considered as "failure" for the operation
14
+ # SET_TRUST_LINE_FLAGS_MALFORMED = -1,
15
+ # SET_TRUST_LINE_FLAGS_NO_TRUST_LINE = -2,
16
+ # SET_TRUST_LINE_FLAGS_CANT_REVOKE = -3,
17
+ # SET_TRUST_LINE_FLAGS_INVALID_STATE = -4
18
+ # };
19
+ #
20
+ # ===========================================================================
21
+ module Stellar
22
+ class SetTrustLineFlagsResultCode < XDR::Enum
23
+ member :set_trust_line_flags_success, 0
24
+ member :set_trust_line_flags_malformed, -1
25
+ member :set_trust_line_flags_no_trust_line, -2
26
+ member :set_trust_line_flags_cant_revoke, -3
27
+ member :set_trust_line_flags_invalid_state, -4
28
+
29
+ seal
30
+ end
31
+ end
@@ -22,7 +22,7 @@ require 'xdr'
22
22
  # txNO_ACCOUNT = -8, // source account not found
23
23
  # txINSUFFICIENT_FEE = -9, // fee is too small
24
24
  # txBAD_AUTH_EXTRA = -10, // unused signatures attached to transaction
25
- # txINTERNAL_ERROR = -11, // an unknown error occured
25
+ # txINTERNAL_ERROR = -11, // an unknown error occurred
26
26
  #
27
27
  # txNOT_SUPPORTED = -12, // transaction type not supported
28
28
  # txFEE_BUMP_INNER_FAILED = -13, // fee bump inner transaction failed
@@ -11,7 +11,10 @@ require 'xdr'
11
11
  # AUTHORIZED_FLAG = 1,
12
12
  # // issuer has authorized account to maintain and reduce liabilities for its
13
13
  # // credit
14
- # AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG = 2
14
+ # AUTHORIZED_TO_MAINTAIN_LIABILITIES_FLAG = 2,
15
+ # // issuer has specified that it may clawback its credit, and that claimable
16
+ # // balances created with its credit may also be clawed back
17
+ # TRUSTLINE_CLAWBACK_ENABLED_FLAG = 4
15
18
  # };
16
19
  #
17
20
  # ===========================================================================
@@ -19,6 +22,7 @@ module Stellar
19
22
  class TrustLineFlags < XDR::Enum
20
23
  member :authorized_flag, 1
21
24
  member :authorized_to_maintain_liabilities_flag, 2
25
+ member :trustline_clawback_enabled_flag, 4
22
26
 
23
27
  seal
24
28
  end
data/lib/stellar-base.rb CHANGED
@@ -16,8 +16,7 @@ silence_warnings do
16
16
  end
17
17
  Stellar.load_all!
18
18
 
19
- require_relative "stellar/base/version"
20
- Stellar::VERSION = Stellar::Base::VERSION
19
+ require_relative "stellar/version"
21
20
 
22
21
  Stellar::ONE = 1_0000000
23
22
  Stellar::Deprecation = ActiveSupport::Deprecation.new("next release", "stellar-base")
@@ -35,6 +34,7 @@ require_relative "./stellar/path_payment_strict_receive_result"
35
34
  require_relative "./stellar/price"
36
35
  require_relative "./stellar/signer_key"
37
36
  require_relative "./stellar/thresholds"
37
+ require_relative "./stellar/trust_line_flags"
38
38
 
39
39
  require_relative "./stellar/concerns/transaction"
40
40
  require_relative "./stellar/fee_bump_transaction"
@@ -4,5 +4,6 @@ class << Stellar::Operation
4
4
 
5
5
  deprecate deprecator: Stellar::Deprecation,
6
6
  manage_offer: :manage_sell_offer,
7
- create_passive_offer: :create_passive_sell_offer
7
+ create_passive_offer: :create_passive_sell_offer,
8
+ allow_trust: :set_trust_line_flags
8
9
  end
@@ -19,7 +19,7 @@ module Stellar::Concerns
19
19
  end
20
20
 
21
21
  def merge(other)
22
- cloned = Marshal.load Marshal.dump(self)
22
+ cloned = from_xdr(to_xdr)
23
23
  cloned.operations += other.to_operations
24
24
  cloned
25
25
  end
@@ -32,7 +32,9 @@ module Stellar::Concerns
32
32
  #
33
33
  # @return [Array<Operation>] the operations
34
34
  def to_operations
35
- cloned = Marshal.load Marshal.dump(operations)
35
+ codec = XDR::VarArray[Stellar::Operation]
36
+ ops = respond_to?(:operations) ? operations : inner_tx.value.tx.operations
37
+ cloned = codec.from_xdr(codec.to_xdr(ops))
36
38
  cloned.each do |op|
37
39
  op.source_account ||= source_account
38
40
  end
data/lib/stellar/dsl.rb CHANGED
@@ -27,6 +27,9 @@ module Stellar
27
27
  )
28
28
  end
29
29
 
30
+ # @param [Asset, String, nil] subject
31
+ # @return [Stellar::Asset] instance of the Stellar::Asset
32
+ # @raise [TypeError] if subject cannot be converted to Stellar::Asset
30
33
  def Asset(subject = nil)
31
34
  case subject
32
35
  when Asset
@@ -45,6 +48,7 @@ module Stellar
45
48
  # Generates Stellar::Keypair from subject, use Stellar::Client.to_keypair as shortcut.
46
49
  # @param subject [String|Stellar::Account|Stellar::PublicKey|Stellar::SignerKey|Stellar::Keypair] subject.
47
50
  # @return [Stellar::Keypair] Stellar::Keypair instance.
51
+ # @raise [TypeError] if subject cannot be converted to Stellar::KeyPair
48
52
  def KeyPair(subject = nil)
49
53
  case subject
50
54
  when ->(subj) { subj.respond_to?(:to_keypair) }
@@ -3,6 +3,11 @@ require "bigdecimal"
3
3
  module Stellar
4
4
  class Operation
5
5
  MAX_INT64 = 2**63 - 1
6
+ TRUST_LINE_FLAGS_MAPPING = {
7
+ full: Stellar::TrustLineFlags.authorized_flag,
8
+ maintain_liabilities: Stellar::TrustLineFlags.authorized_to_maintain_liabilities_flag,
9
+ clawback_enabled: Stellar::TrustLineFlags.trustline_clawback_enabled_flag
10
+ }.freeze
6
11
 
7
12
  class << self
8
13
  include Stellar::DSL
@@ -17,16 +22,17 @@ module Stellar
17
22
  # @return [Stellar::Operation] the built operation
18
23
  def make(attributes = {})
19
24
  source_account = attributes[:source_account]
20
- body = Stellar::Operation::Body.new(*attributes[:body])
21
-
22
- op = Stellar::Operation.new(body: body)
23
25
 
24
- if source_account
25
- raise ArgumentError, "Bad :source_account" unless source_account.is_a?(Stellar::KeyPair)
26
- op.source_account = source_account.muxed_account
26
+ if source_account && !source_account.is_a?(Stellar::KeyPair)
27
+ raise ArgumentError, "Bad :source_account"
27
28
  end
28
29
 
29
- op
30
+ body = Stellar::Operation::Body.new(*attributes[:body])
31
+
32
+ Stellar::Operation.new(
33
+ body: body,
34
+ source_account: source_account&.muxed_account
35
+ )
30
36
  end
31
37
 
32
38
  #
@@ -300,7 +306,7 @@ module Stellar
300
306
  op = ManageBuyOfferOp.new({
301
307
  buying: buying,
302
308
  selling: selling,
303
- amount: amount,
309
+ buy_amount: amount,
304
310
  price: price,
305
311
  offer_id: offer_id
306
312
  })
@@ -371,11 +377,31 @@ module Stellar
371
377
  }))
372
378
  end
373
379
 
380
+ # @param asset [Stellar::Asset]
381
+ # @param trustor [Stellar::KeyPair]
382
+ # @param flags [{String, Symbol, Stellar::TrustLineFlags => true, false}] flags to to set or clear
383
+ # @param source_account [Stellar::KeyPair] source account (default is `nil`, which will use the source account of transaction)
384
+ def set_trust_line_flags(asset:, trustor:, flags: {}, source_account: nil)
385
+ op = Stellar::SetTrustLineFlagsOp.new
386
+ op.trustor = KeyPair(trustor).account_id
387
+ op.asset = Asset(asset)
388
+ op.attributes = Stellar::TrustLineFlags.set_clear_masks(flags)
389
+
390
+ make(
391
+ source_account: source_account,
392
+ body: [:set_trust_line_flags, op]
393
+ )
394
+ end
395
+
396
+ # DEPRECATED in favor of `set_trustline_flags`
374
397
  #
375
398
  # Helper method to create a valid AllowTrustOp, wrapped
376
399
  # in the necessary XDR structs to be included within a
377
400
  # transactions `operations` array.
378
401
  #
402
+ # @deprecated Use `set_trustline_flags` operation
403
+ # See {https://github.com/stellar/stellar-protocol/blob/master/core/cap-0035.md#allow-trust-operation-1 CAP-35 description}
404
+ # for more details
379
405
  # @param [Hash] attributes the attributes to create the operation with
380
406
  # @option attributes [Stellar::KeyPair] :trustor
381
407
  # @option attributes [Stellar::Asset] :asset
@@ -387,7 +413,8 @@ module Stellar
387
413
  op = AllowTrustOp.new
388
414
 
389
415
  trustor = attributes[:trustor]
390
- authorize = attributes[:authorize]
416
+ # we handle booleans here for the backward compatibility
417
+ authorize = attributes[:authorize].yield_self { |value| value == true ? :full : value }
391
418
  asset = attributes[:asset]
392
419
  if asset.is_a?(Array)
393
420
  asset = Asset.send(*asset)
@@ -395,20 +422,21 @@ module Stellar
395
422
 
396
423
  raise ArgumentError, "Bad :trustor" unless trustor.is_a?(Stellar::KeyPair)
397
424
 
398
- op.authorize = case authorize
399
- when :none, false then 0 # we handle booleans here for the backward compatibility
400
- when :full, true then TrustLineFlags.authorized_flag.value
401
- when :maintain_liabilities then TrustLineFlags.authorized_to_maintain_liabilities_flag.value
425
+ allowed_flags = TRUST_LINE_FLAGS_MAPPING.slice(:full, :maintain_liabilities)
426
+
427
+ # we handle booleans here for the backward compatibility
428
+ op.authorize = if allowed_flags.key?(authorize)
429
+ allowed_flags[authorize].value
430
+ elsif [:none, false].include?(authorize)
431
+ 0
402
432
  else
403
433
  raise ArgumentError, "Bad :authorize, supported values: :full, :maintain_liabilities, :none"
404
434
  end
405
435
 
406
436
  raise ArgumentError, "Bad :asset" unless asset.type == Stellar::AssetType.asset_type_credit_alphanum4
407
437
 
408
- atc = AllowTrustOp::Asset.new(:asset_type_credit_alphanum4, asset.code)
409
-
410
438
  op.trustor = trustor.account_id
411
- op.asset = atc
439
+ op.asset = AssetCode.new(:asset_type_credit_alphanum4, asset.code)
412
440
 
413
441
  make(attributes.merge({
414
442
  body: [:allow_trust, op]
@@ -493,6 +521,47 @@ module Stellar
493
521
  }))
494
522
  end
495
523
 
524
+ def clawback(source_account:, from:, amount:)
525
+ asset, amount = get_asset_amount(amount)
526
+
527
+ if amount == 0
528
+ raise ArgumentError, "Amount can not be zero"
529
+ end
530
+
531
+ if amount < 0
532
+ raise ArgumentError, "Negative amount is not allowed"
533
+ end
534
+
535
+ op = ClawbackOp.new(
536
+ amount: amount,
537
+ from: from.muxed_account,
538
+ asset: asset
539
+ )
540
+
541
+ make({
542
+ source_account: source_account,
543
+ body: [:clawback, op]
544
+ })
545
+ end
546
+
547
+ # Helper method to create clawback claimable balance operation
548
+ #
549
+ # @param [Stellar::KeyPair] source_account the attributes to create the operation with
550
+ # @param [String] balance_id `ClaimableBalanceID`, serialized in hex
551
+ #
552
+ # @return [Stellar::Operation] the built operation
553
+ def clawback_claimable_balance(source_account:, balance_id:)
554
+ balance_id = Stellar::ClaimableBalanceID.from_xdr(balance_id, :hex)
555
+ op = ClawbackClaimableBalanceOp.new(balance_id: balance_id)
556
+
557
+ make(
558
+ source_account: source_account,
559
+ body: [:clawback_claimable_balance, op]
560
+ )
561
+ rescue XDR::ReadError
562
+ raise ArgumentError, "Claimable balance id '#{balance_id}' is invalid"
563
+ end
564
+
496
565
  private
497
566
 
498
567
  def get_asset_amount(values)
@@ -0,0 +1,53 @@
1
+ module Stellar
2
+ class TrustLineFlags
3
+ # Converts an array of Stellar::TrustLineFlags members into
4
+ # an integers suitable for use in in a SetTrustLineFlagsOp.
5
+ #
6
+ # @param flags [Array<Stellar::TrustLineFlags>] the flags to combine
7
+ #
8
+ # @return [Fixnum] the combined result
9
+ def self.make_mask(flags)
10
+ normalize(flags).map(&:value).inject(&:|) || 0
11
+ end
12
+
13
+ # Converts an integer used in SetTrustLineFlagsOp on the set/clear flag options
14
+ # into an array of Stellar::TrustLineFlags members
15
+ #
16
+ # @param combined [Fixnum]
17
+ # @return [Array<Stellar::AccountFlags>]
18
+ def self.parse_mask(combined)
19
+ members.values.select { |m| (m.value & combined) != 0 }
20
+ end
21
+
22
+ # Converts each element of the input array to Stellar::TrustLineFlags instance.
23
+ #
24
+ # @param [Array<Stellar::TrustLineFlags,Symbol,#to_s>] input
25
+ # @return [Array<Stellar::TrustLineFlags>]
26
+ # @raise [TypeError] if any element of the input cannot be converted
27
+ def self.normalize(input)
28
+ input.map do |val|
29
+ case val
30
+ when Stellar::TrustLineFlags
31
+ val
32
+ when ->(_) { members.key?(val.to_s) }
33
+ from_name(val.to_s)
34
+ when ->(_) { members.key?("#{val}_flag") }
35
+ from_name("#{val}_flag")
36
+ else
37
+ raise TypeError, "unknown trustline flag: #{val}"
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.set_clear_masks(flags)
43
+ set_flags = []
44
+ clear_flags = []
45
+
46
+ Hash(flags).each do |flag, value|
47
+ value.present? ? set_flags.push(flag) : clear_flags.push(flag)
48
+ end
49
+
50
+ {set_flags: make_mask(set_flags), clear_flags: make_mask(clear_flags)}
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module Stellar
2
+ VERSION = "0.27.0"
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stellar-base
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Fleckenstein
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-02-05 00:00:00.000000000 Z
13
+ date: 2021-05-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -168,9 +168,9 @@ dependencies:
168
168
  - - "~>"
169
169
  - !ruby/object:Gem::Version
170
170
  version: '1.3'
171
- description: "The stellar-base library is the lowest-level stellar helper library.
172
- It consists of classes to read, write, \nhash, and sign the xdr structures that
173
- are used in stellar-core.\n"
171
+ description: |
172
+ The stellar-base library is the lowest-level stellar helper library. It consists of classes to read, write,
173
+ hash, and sign the xdr structures that are used in stellar-core.
174
174
  email:
175
175
  executables: []
176
176
  extensions: []
@@ -193,12 +193,12 @@ files:
193
193
  - generated/stellar/account_merge_result.rb
194
194
  - generated/stellar/account_merge_result_code.rb
195
195
  - generated/stellar/allow_trust_op.rb
196
- - generated/stellar/allow_trust_op/asset.rb
197
196
  - generated/stellar/allow_trust_result.rb
198
197
  - generated/stellar/allow_trust_result_code.rb
199
198
  - generated/stellar/asset.rb
200
199
  - generated/stellar/asset/alpha_num12.rb
201
200
  - generated/stellar/asset/alpha_num4.rb
201
+ - generated/stellar/asset_code.rb
202
202
  - generated/stellar/asset_type.rb
203
203
  - generated/stellar/auth.rb
204
204
  - generated/stellar/auth_cert.rb
@@ -225,11 +225,20 @@ files:
225
225
  - generated/stellar/claim_predicate_type.rb
226
226
  - generated/stellar/claimable_balance_entry.rb
227
227
  - generated/stellar/claimable_balance_entry/ext.rb
228
+ - generated/stellar/claimable_balance_entry_extension_v1.rb
229
+ - generated/stellar/claimable_balance_entry_extension_v1/ext.rb
230
+ - generated/stellar/claimable_balance_flags.rb
228
231
  - generated/stellar/claimable_balance_id.rb
229
232
  - generated/stellar/claimable_balance_id_type.rb
230
233
  - generated/stellar/claimant.rb
231
234
  - generated/stellar/claimant/v0.rb
232
235
  - generated/stellar/claimant_type.rb
236
+ - generated/stellar/clawback_claimable_balance_op.rb
237
+ - generated/stellar/clawback_claimable_balance_result.rb
238
+ - generated/stellar/clawback_claimable_balance_result_code.rb
239
+ - generated/stellar/clawback_op.rb
240
+ - generated/stellar/clawback_result.rb
241
+ - generated/stellar/clawback_result_code.rb
233
242
  - generated/stellar/create_account_op.rb
234
243
  - generated/stellar/create_account_result.rb
235
244
  - generated/stellar/create_account_result_code.rb
@@ -355,6 +364,9 @@ files:
355
364
  - generated/stellar/set_options_op.rb
356
365
  - generated/stellar/set_options_result.rb
357
366
  - generated/stellar/set_options_result_code.rb
367
+ - generated/stellar/set_trust_line_flags_op.rb
368
+ - generated/stellar/set_trust_line_flags_result.rb
369
+ - generated/stellar/set_trust_line_flags_result_code.rb
358
370
  - generated/stellar/signed_survey_request_message.rb
359
371
  - generated/stellar/signed_survey_response_message.rb
360
372
  - generated/stellar/signer.rb
@@ -406,7 +418,6 @@ files:
406
418
  - lib/stellar/account_flags.rb
407
419
  - lib/stellar/asset.rb
408
420
  - lib/stellar/base.rb
409
- - lib/stellar/base/version.rb
410
421
  - lib/stellar/claim_predicate.rb
411
422
  - lib/stellar/compat.rb
412
423
  - lib/stellar/concerns/transaction.rb
@@ -428,15 +439,19 @@ files:
428
439
  - lib/stellar/transaction_builder.rb
429
440
  - lib/stellar/transaction_envelope.rb
430
441
  - lib/stellar/transaction_v0.rb
442
+ - lib/stellar/trust_line_flags.rb
431
443
  - lib/stellar/util/strkey.rb
432
- homepage: https://github.com/astroband/ruby-stellar-sdk/tree/master/base
444
+ - lib/stellar/version.rb
445
+ homepage: https://github.com/astroband/ruby-stellar-sdk
433
446
  licenses:
434
447
  - Apache-2.0
435
448
  metadata:
449
+ bug_tracker_uri: https://github.com/astroband/ruby-stellar-sdk/issues
450
+ changelog_uri: https://github.com/astroband/ruby-stellar-sdk/blob/v0.27.0/base/CHANGELOG.md
451
+ documentation_uri: https://rubydoc.info/gems/stellar-base/0.27.0/
436
452
  github_repo: ssh://github.com/astroband/ruby-stellar-sdk
437
- documentation_uri: https://rubydoc.info/gems/stellar-base/0.26.0/
438
- changelog_uri: https://github.com/astroband/ruby-stellar-sdk/blob/v0.26.0/base/CHANGELOG.md
439
- source_code_uri: https://github.com/astroband/ruby-stellar-sdk/tree/v0.26.0/base
453
+ homepage_uri: https://github.com/astroband/ruby-stellar-sdk/tree/main/base
454
+ source_code_uri: https://github.com/astroband/ruby-stellar-sdk/tree/v0.27.0/base
440
455
  post_install_message:
441
456
  rdoc_options: []
442
457
  require_paths:
@@ -453,7 +468,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
453
468
  - !ruby/object:Gem::Version
454
469
  version: '0'
455
470
  requirements: []
456
- rubygems_version: 3.2.0.rc.2
471
+ rubygems_version: 3.2.16
457
472
  signing_key:
458
473
  specification_version: 4
459
474
  summary: 'Stellar client library: XDR'