digitalbits-base 0.27.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.
Files changed (252) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +202 -0
  3. data/README.md +84 -0
  4. data/generated/digitalbits-base-generated.rb +228 -0
  5. data/generated/digitalbits/account_entry.rb +55 -0
  6. data/generated/digitalbits/account_entry/ext.rb +28 -0
  7. data/generated/digitalbits/account_entry_extension_v1.rb +32 -0
  8. data/generated/digitalbits/account_entry_extension_v1/ext.rb +28 -0
  9. data/generated/digitalbits/account_entry_extension_v2.rb +34 -0
  10. data/generated/digitalbits/account_entry_extension_v2/ext.rb +24 -0
  11. data/generated/digitalbits/account_flags.rb +31 -0
  12. data/generated/digitalbits/account_merge_result.rb +26 -0
  13. data/generated/digitalbits/account_merge_result_code.rb +37 -0
  14. data/generated/digitalbits/allow_trust_op.rb +39 -0
  15. data/generated/digitalbits/allow_trust_op/asset.rb +33 -0
  16. data/generated/digitalbits/allow_trust_result.rb +25 -0
  17. data/generated/digitalbits/allow_trust_result_code.rb +33 -0
  18. data/generated/digitalbits/asset.rb +47 -0
  19. data/generated/digitalbits/asset/alpha_num12.rb +22 -0
  20. data/generated/digitalbits/asset/alpha_num4.rb +22 -0
  21. data/generated/digitalbits/asset_type.rb +24 -0
  22. data/generated/digitalbits/auth.rb +20 -0
  23. data/generated/digitalbits/auth_cert.rb +22 -0
  24. data/generated/digitalbits/authenticated_message.rb +32 -0
  25. data/generated/digitalbits/authenticated_message/v0.rb +24 -0
  26. data/generated/digitalbits/begin_sponsoring_future_reserves_op.rb +18 -0
  27. data/generated/digitalbits/begin_sponsoring_future_reserves_result.rb +25 -0
  28. data/generated/digitalbits/begin_sponsoring_future_reserves_result_code.rb +29 -0
  29. data/generated/digitalbits/bucket_entry.rb +34 -0
  30. data/generated/digitalbits/bucket_entry_type.rb +28 -0
  31. data/generated/digitalbits/bucket_metadata.rb +32 -0
  32. data/generated/digitalbits/bucket_metadata/ext.rb +24 -0
  33. data/generated/digitalbits/bump_sequence_op.rb +18 -0
  34. data/generated/digitalbits/bump_sequence_result.rb +25 -0
  35. data/generated/digitalbits/bump_sequence_result_code.rb +24 -0
  36. data/generated/digitalbits/change_trust_op.rb +22 -0
  37. data/generated/digitalbits/change_trust_result.rb +25 -0
  38. data/generated/digitalbits/change_trust_result_code.rb +34 -0
  39. data/generated/digitalbits/claim_claimable_balance_op.rb +18 -0
  40. data/generated/digitalbits/claim_claimable_balance_result.rb +25 -0
  41. data/generated/digitalbits/claim_claimable_balance_result_code.rb +31 -0
  42. data/generated/digitalbits/claim_offer_atom.rb +33 -0
  43. data/generated/digitalbits/claim_predicate.rb +43 -0
  44. data/generated/digitalbits/claim_predicate_type.rb +30 -0
  45. data/generated/digitalbits/claimable_balance_entry.rb +44 -0
  46. data/generated/digitalbits/claimable_balance_entry/ext.rb +24 -0
  47. data/generated/digitalbits/claimable_balance_id.rb +23 -0
  48. data/generated/digitalbits/claimable_balance_id_type.rb +20 -0
  49. data/generated/digitalbits/claimant.rb +31 -0
  50. data/generated/digitalbits/claimant/v0.rb +22 -0
  51. data/generated/digitalbits/claimant_type.rb +20 -0
  52. data/generated/digitalbits/create_account_op.rb +20 -0
  53. data/generated/digitalbits/create_account_result.rb +25 -0
  54. data/generated/digitalbits/create_account_result_code.rb +32 -0
  55. data/generated/digitalbits/create_claimable_balance_op.rb +22 -0
  56. data/generated/digitalbits/create_claimable_balance_result.rb +27 -0
  57. data/generated/digitalbits/create_claimable_balance_result_code.rb +30 -0
  58. data/generated/digitalbits/create_passive_sell_offer_op.rb +24 -0
  59. data/generated/digitalbits/crypto_key_type.rb +28 -0
  60. data/generated/digitalbits/curve25519_public.rb +18 -0
  61. data/generated/digitalbits/curve25519_secret.rb +18 -0
  62. data/generated/digitalbits/data_entry.rb +35 -0
  63. data/generated/digitalbits/data_entry/ext.rb +24 -0
  64. data/generated/digitalbits/decorated_signature.rb +20 -0
  65. data/generated/digitalbits/digital_bits_message.rb +84 -0
  66. data/generated/digitalbits/digital_bits_value.rb +43 -0
  67. data/generated/digitalbits/digital_bits_value/ext.rb +28 -0
  68. data/generated/digitalbits/digital_bits_value_type.rb +22 -0
  69. data/generated/digitalbits/dont_have.rb +20 -0
  70. data/generated/digitalbits/end_sponsoring_future_reserves_result.rb +25 -0
  71. data/generated/digitalbits/end_sponsoring_future_reserves_result_code.rb +25 -0
  72. data/generated/digitalbits/envelope_type.rb +32 -0
  73. data/generated/digitalbits/error.rb +20 -0
  74. data/generated/digitalbits/error_code.rb +28 -0
  75. data/generated/digitalbits/fee_bump_transaction.rb +39 -0
  76. data/generated/digitalbits/fee_bump_transaction/ext.rb +24 -0
  77. data/generated/digitalbits/fee_bump_transaction/inner_tx.rb +25 -0
  78. data/generated/digitalbits/fee_bump_transaction_envelope.rb +22 -0
  79. data/generated/digitalbits/hello.rb +34 -0
  80. data/generated/digitalbits/hmac_sha256_key.rb +18 -0
  81. data/generated/digitalbits/hmac_sha256_mac.rb +18 -0
  82. data/generated/digitalbits/inflation_payout.rb +20 -0
  83. data/generated/digitalbits/inflation_result.rb +26 -0
  84. data/generated/digitalbits/inflation_result_code.rb +24 -0
  85. data/generated/digitalbits/inner_transaction_result.rb +57 -0
  86. data/generated/digitalbits/inner_transaction_result/ext.rb +24 -0
  87. data/generated/digitalbits/inner_transaction_result/result.rb +54 -0
  88. data/generated/digitalbits/inner_transaction_result_pair.rb +20 -0
  89. data/generated/digitalbits/ip_addr_type.rb +22 -0
  90. data/generated/digitalbits/ledger_close_meta.rb +23 -0
  91. data/generated/digitalbits/ledger_close_meta_v0.rb +35 -0
  92. data/generated/digitalbits/ledger_close_value_signature.rb +20 -0
  93. data/generated/digitalbits/ledger_entry.rb +50 -0
  94. data/generated/digitalbits/ledger_entry/data.rb +41 -0
  95. data/generated/digitalbits/ledger_entry/ext.rb +28 -0
  96. data/generated/digitalbits/ledger_entry_change.rb +35 -0
  97. data/generated/digitalbits/ledger_entry_change_type.rb +26 -0
  98. data/generated/digitalbits/ledger_entry_extension_v1.rb +30 -0
  99. data/generated/digitalbits/ledger_entry_extension_v1/ext.rb +24 -0
  100. data/generated/digitalbits/ledger_entry_type.rb +28 -0
  101. data/generated/digitalbits/ledger_header.rb +69 -0
  102. data/generated/digitalbits/ledger_header/ext.rb +24 -0
  103. data/generated/digitalbits/ledger_header_history_entry.rb +33 -0
  104. data/generated/digitalbits/ledger_header_history_entry/ext.rb +24 -0
  105. data/generated/digitalbits/ledger_key.rb +69 -0
  106. data/generated/digitalbits/ledger_key/account.rb +20 -0
  107. data/generated/digitalbits/ledger_key/claimable_balance.rb +20 -0
  108. data/generated/digitalbits/ledger_key/data.rb +22 -0
  109. data/generated/digitalbits/ledger_key/offer.rb +22 -0
  110. data/generated/digitalbits/ledger_key/trust_line.rb +22 -0
  111. data/generated/digitalbits/ledger_scp_messages.rb +20 -0
  112. data/generated/digitalbits/ledger_upgrade.rb +35 -0
  113. data/generated/digitalbits/ledger_upgrade_type.rb +26 -0
  114. data/generated/digitalbits/liabilities.rb +20 -0
  115. data/generated/digitalbits/manage_buy_offer_op.rb +29 -0
  116. data/generated/digitalbits/manage_buy_offer_result.rb +26 -0
  117. data/generated/digitalbits/manage_buy_offer_result_code.rb +51 -0
  118. data/generated/digitalbits/manage_data_op.rb +20 -0
  119. data/generated/digitalbits/manage_data_result.rb +25 -0
  120. data/generated/digitalbits/manage_data_result_code.rb +32 -0
  121. data/generated/digitalbits/manage_offer_effect.rb +24 -0
  122. data/generated/digitalbits/manage_offer_success_result.rb +34 -0
  123. data/generated/digitalbits/manage_offer_success_result/offer.rb +30 -0
  124. data/generated/digitalbits/manage_sell_offer_op.rb +28 -0
  125. data/generated/digitalbits/manage_sell_offer_result.rb +26 -0
  126. data/generated/digitalbits/manage_sell_offer_result_code.rb +54 -0
  127. data/generated/digitalbits/memo.rb +38 -0
  128. data/generated/digitalbits/memo_type.rb +28 -0
  129. data/generated/digitalbits/message_type.rb +56 -0
  130. data/generated/digitalbits/muxed_account.rb +35 -0
  131. data/generated/digitalbits/muxed_account/med25519.rb +22 -0
  132. data/generated/digitalbits/offer_entry.rb +49 -0
  133. data/generated/digitalbits/offer_entry/ext.rb +24 -0
  134. data/generated/digitalbits/offer_entry_flags.rb +21 -0
  135. data/generated/digitalbits/operation.rb +69 -0
  136. data/generated/digitalbits/operation/body.rb +95 -0
  137. data/generated/digitalbits/operation_id.rb +32 -0
  138. data/generated/digitalbits/operation_id/id.rb +24 -0
  139. data/generated/digitalbits/operation_meta.rb +18 -0
  140. data/generated/digitalbits/operation_result.rb +71 -0
  141. data/generated/digitalbits/operation_result/tr.rb +97 -0
  142. data/generated/digitalbits/operation_result_code.rb +33 -0
  143. data/generated/digitalbits/operation_type.rb +56 -0
  144. data/generated/digitalbits/path_payment_strict_receive_op.rb +32 -0
  145. data/generated/digitalbits/path_payment_strict_receive_result.rb +39 -0
  146. data/generated/digitalbits/path_payment_strict_receive_result/success.rb +22 -0
  147. data/generated/digitalbits/path_payment_strict_receive_result_code.rb +56 -0
  148. data/generated/digitalbits/path_payment_strict_send_op.rb +32 -0
  149. data/generated/digitalbits/path_payment_strict_send_result.rb +38 -0
  150. data/generated/digitalbits/path_payment_strict_send_result/success.rb +22 -0
  151. data/generated/digitalbits/path_payment_strict_send_result_code.rb +55 -0
  152. data/generated/digitalbits/payment_op.rb +22 -0
  153. data/generated/digitalbits/payment_result.rb +25 -0
  154. data/generated/digitalbits/payment_result_code.rb +41 -0
  155. data/generated/digitalbits/peer_address.rb +33 -0
  156. data/generated/digitalbits/peer_address/ip.rb +29 -0
  157. data/generated/digitalbits/peer_stats.rb +48 -0
  158. data/generated/digitalbits/price.rb +20 -0
  159. data/generated/digitalbits/public_key.rb +23 -0
  160. data/generated/digitalbits/public_key_type.rb +20 -0
  161. data/generated/digitalbits/revoke_sponsorship_op.rb +36 -0
  162. data/generated/digitalbits/revoke_sponsorship_op/signer.rb +22 -0
  163. data/generated/digitalbits/revoke_sponsorship_result.rb +25 -0
  164. data/generated/digitalbits/revoke_sponsorship_result_code.rb +31 -0
  165. data/generated/digitalbits/revoke_sponsorship_type.rb +22 -0
  166. data/generated/digitalbits/scp_ballot.rb +20 -0
  167. data/generated/digitalbits/scp_envelope.rb +20 -0
  168. data/generated/digitalbits/scp_history_entry.rb +23 -0
  169. data/generated/digitalbits/scp_history_entry_v0.rb +20 -0
  170. data/generated/digitalbits/scp_nomination.rb +22 -0
  171. data/generated/digitalbits/scp_quorum_set.rb +22 -0
  172. data/generated/digitalbits/scp_statement.rb +58 -0
  173. data/generated/digitalbits/scp_statement/pledges.rb +63 -0
  174. data/generated/digitalbits/scp_statement/pledges/confirm.rb +30 -0
  175. data/generated/digitalbits/scp_statement/pledges/externalize.rb +26 -0
  176. data/generated/digitalbits/scp_statement/pledges/prepare.rb +32 -0
  177. data/generated/digitalbits/scp_statement_type.rb +26 -0
  178. data/generated/digitalbits/set_options_op.rb +41 -0
  179. data/generated/digitalbits/set_options_result.rb +25 -0
  180. data/generated/digitalbits/set_options_result_code.rb +40 -0
  181. data/generated/digitalbits/signed_survey_request_message.rb +20 -0
  182. data/generated/digitalbits/signed_survey_response_message.rb +20 -0
  183. data/generated/digitalbits/signer.rb +20 -0
  184. data/generated/digitalbits/signer_key.rb +33 -0
  185. data/generated/digitalbits/signer_key_type.rb +24 -0
  186. data/generated/digitalbits/simple_payment_result.rb +22 -0
  187. data/generated/digitalbits/survey_message_command_type.rb +20 -0
  188. data/generated/digitalbits/survey_request_message.rb +26 -0
  189. data/generated/digitalbits/survey_response_body.rb +23 -0
  190. data/generated/digitalbits/survey_response_message.rb +26 -0
  191. data/generated/digitalbits/threshold_indexes.rb +26 -0
  192. data/generated/digitalbits/time_bounds.rb +20 -0
  193. data/generated/digitalbits/topology_response_body.rb +25 -0
  194. data/generated/digitalbits/transaction.rb +50 -0
  195. data/generated/digitalbits/transaction/ext.rb +24 -0
  196. data/generated/digitalbits/transaction_envelope.rb +31 -0
  197. data/generated/digitalbits/transaction_history_entry.rb +33 -0
  198. data/generated/digitalbits/transaction_history_entry/ext.rb +24 -0
  199. data/generated/digitalbits/transaction_history_result_entry.rb +33 -0
  200. data/generated/digitalbits/transaction_history_result_entry/ext.rb +24 -0
  201. data/generated/digitalbits/transaction_meta.rb +31 -0
  202. data/generated/digitalbits/transaction_meta_v1.rb +20 -0
  203. data/generated/digitalbits/transaction_meta_v2.rb +24 -0
  204. data/generated/digitalbits/transaction_result.rb +46 -0
  205. data/generated/digitalbits/transaction_result/ext.rb +24 -0
  206. data/generated/digitalbits/transaction_result/result.rb +36 -0
  207. data/generated/digitalbits/transaction_result_code.rb +54 -0
  208. data/generated/digitalbits/transaction_result_meta.rb +22 -0
  209. data/generated/digitalbits/transaction_result_pair.rb +20 -0
  210. data/generated/digitalbits/transaction_result_set.rb +18 -0
  211. data/generated/digitalbits/transaction_set.rb +20 -0
  212. data/generated/digitalbits/transaction_signature_payload.rb +32 -0
  213. data/generated/digitalbits/transaction_signature_payload/tagged_transaction.rb +30 -0
  214. data/generated/digitalbits/transaction_v0.rb +39 -0
  215. data/generated/digitalbits/transaction_v0/ext.rb +24 -0
  216. data/generated/digitalbits/transaction_v0_envelope.rb +22 -0
  217. data/generated/digitalbits/transaction_v1_envelope.rb +22 -0
  218. data/generated/digitalbits/trust_line_entry.rb +53 -0
  219. data/generated/digitalbits/trust_line_entry/ext.rb +42 -0
  220. data/generated/digitalbits/trust_line_entry/ext/v1.rb +34 -0
  221. data/generated/digitalbits/trust_line_entry/ext/v1/ext.rb +28 -0
  222. data/generated/digitalbits/trust_line_flags.rb +25 -0
  223. data/generated/digitalbits/upgrade_entry_meta.rb +20 -0
  224. data/lib/digitalbits-base.rb +51 -0
  225. data/lib/digitalbits/account_flags.rb +26 -0
  226. data/lib/digitalbits/asset.rb +81 -0
  227. data/lib/digitalbits/base.rb +1 -0
  228. data/lib/digitalbits/claim_predicate.rb +197 -0
  229. data/lib/digitalbits/compat.rb +9 -0
  230. data/lib/digitalbits/concerns/transaction.rb +50 -0
  231. data/lib/digitalbits/convert.rb +32 -0
  232. data/lib/digitalbits/dsl.rb +93 -0
  233. data/lib/digitalbits/ext/xdr.rb +50 -0
  234. data/lib/digitalbits/factories.rb +59 -0
  235. data/lib/digitalbits/fee_bump_transaction.rb +21 -0
  236. data/lib/digitalbits/key_pair.rb +126 -0
  237. data/lib/digitalbits/ledger_key.rb +32 -0
  238. data/lib/digitalbits/muxed_account.rb +16 -0
  239. data/lib/digitalbits/networks.rb +43 -0
  240. data/lib/digitalbits/operation.rb +603 -0
  241. data/lib/digitalbits/path_payment_strict_receive_result.rb +16 -0
  242. data/lib/digitalbits/price.rb +39 -0
  243. data/lib/digitalbits/signer_key.rb +46 -0
  244. data/lib/digitalbits/thresholds.rb +37 -0
  245. data/lib/digitalbits/transaction.rb +37 -0
  246. data/lib/digitalbits/transaction_builder.rb +166 -0
  247. data/lib/digitalbits/transaction_envelope.rb +35 -0
  248. data/lib/digitalbits/transaction_v0.rb +43 -0
  249. data/lib/digitalbits/trust_line_flags.rb +53 -0
  250. data/lib/digitalbits/util/strkey.rb +70 -0
  251. data/lib/digitalbits/version.rb +3 -0
  252. metadata +459 -0
@@ -0,0 +1,32 @@
1
+ module DigitalBits
2
+ #
3
+ # Generic format conversion module
4
+ #
5
+ module Convert
6
+ require "base64"
7
+
8
+ def to_hex(string)
9
+ string.unpack1("H*")
10
+ end
11
+
12
+ def from_hex(hex_string)
13
+ [hex_string].pack("H*")
14
+ end
15
+
16
+ def to_base64(string)
17
+ Base64.strict_encode64(string)
18
+ end
19
+
20
+ def from_base64(base64_string)
21
+ Base64.strict_decode64(base64_string)
22
+ end
23
+
24
+ ## Converts a DigitalBits::PublicKey instance (or any typedef of it such as
25
+ # DigitalBits::AccountID) to an address
26
+ def pk_to_address(pk)
27
+ DigitalBits::Util::StrKey.check_encode(:account_id, pk.ed25519!)
28
+ end
29
+
30
+ extend self
31
+ end
32
+ end
@@ -0,0 +1,93 @@
1
+ module DigitalBits
2
+ module DSL
3
+ module_function
4
+
5
+ # Constructs a new ClaimPredicate using DSL
6
+ #
7
+ # @example fulfilled during [T+5min, T+60min] period, where T refers to claimable balance entry creation time
8
+ # DigitalBits::ClaimPredicate { before_relative_time(1.hour) & ~before_relative_time(5.minutes) }
9
+ #
10
+ # @example not fulfilled starting from today midnight until tomorrow midnight,
11
+ # DigitalBits::ClaimPredicate { before_absolute_time(Date.today.end_of_day) | ~before_absolute_time(Date.tomorrow.end_of_day) }
12
+ #
13
+ # @example always fulfilled
14
+ # DigitalBits::ClaimPredicate { }
15
+ def ClaimPredicate(&block)
16
+ return ClaimPredicate.unconditional unless block
17
+ ClaimPredicate.compose(&block)
18
+ end
19
+
20
+ def Claimant(destination, &block)
21
+ Claimant.new(
22
+ ClaimantType.claimant_type_v0,
23
+ Claimant::V0.new(
24
+ destination: KeyPair(destination).account_id,
25
+ predicate: ClaimPredicate(&block)
26
+ )
27
+ )
28
+ end
29
+
30
+ # @param [Asset, String, nil] subject
31
+ # @return [DigitalBits::Asset] instance of the DigitalBits::Asset
32
+ # @raise [TypeError] if subject cannot be converted to DigitalBits::Asset
33
+ def Asset(subject = nil)
34
+ case subject
35
+ when Asset
36
+ subject
37
+ when nil, /^(XLM[-:])?native$/
38
+ Asset.native
39
+ when /^([0-9A-Z]{1,4})[-:](G[A-Z0-9]{55})$/
40
+ Asset.alphanum4($1, KeyPair($2))
41
+ when /^([0-9A-Z]{5,12})[-:](G[A-Z0-9]{55})$/
42
+ Asset.alphanum12($1, KeyPair($2))
43
+ else
44
+ raise TypeError, "Cannot convert #{subject.inspect} to DigitalBits::Asset"
45
+ end
46
+ end
47
+
48
+ # Generates DigitalBits::Keypair from subject, use DigitalBits::Client.to_keypair as shortcut.
49
+ # @param subject [String|DigitalBits::Account|DigitalBits::PublicKey|DigitalBits::SignerKey|DigitalBits::Keypair] subject.
50
+ # @return [DigitalBits::Keypair] DigitalBits::Keypair instance.
51
+ # @raise [TypeError] if subject cannot be converted to DigitalBits::KeyPair
52
+ def KeyPair(subject = nil)
53
+ case subject
54
+ when ->(subj) { subj.respond_to?(:to_keypair) }
55
+ subject.to_keypair
56
+ when PublicKey
57
+ KeyPair.from_public_key(subject.value)
58
+ when SignerKey
59
+ KeyPair.from_raw_seed(subject.value)
60
+ when /^G[A-Z0-9]{55}$/
61
+ KeyPair.from_address(subject.to_str)
62
+ when /^S[A-Z0-9]{55}$/
63
+ KeyPair.from_seed(subject.to_str)
64
+ when /^.{32}$/
65
+ KeyPair.from_raw_seed(subject.to_str)
66
+ when nil
67
+ KeyPair.random
68
+ else
69
+ raise TypeError, "cannot convert #{subject.inspect} to DigitalBits::KeyPair"
70
+ end
71
+ end
72
+
73
+ # Provides conversion from different input types into the SignerKey to use in ManageData operation.
74
+ # @param input [String|zDigitalBits::Account|DigitalBits::PublicKey|DigitalBits::SignerKey|DigitalBits::Keypair] subject.
75
+ # @return [DigitalBits::SignerKey] DigitalBits::Keypair instance.
76
+ def SignerKey(input = nil)
77
+ case input
78
+ when Transaction
79
+ SignerKey.pre_auth_tx(input.hash)
80
+ when /^[0-9A-Za-z+\/=]{44}$/
81
+ SignerKey.hash_x(DigitalBits::Convert.from_base64(input))
82
+ when /^[0-9a-f]{64}$/
83
+ SignerKey.hash_x(DigitalBits::Convert.from_hex(input))
84
+ when /^.{32}$/
85
+ SignerKey.hash_x(input)
86
+ else
87
+ SignerKey.ed25519(KeyPair(input))
88
+ end
89
+ end
90
+ end
91
+
92
+ include DSL
93
+ end
@@ -0,0 +1,50 @@
1
+ require "active_support/core_ext/string/inflections"
2
+ require "xdr"
3
+
4
+ # For every member of XDR::Enum define constant on the corresponding enum type class.
5
+ # Constant name is a member name stripped of the common prefix with enum type name.
6
+ XDR::DSL::Enum.redefine_method(:seal) do
7
+ names = [members.keys.first, name.demodulize.underscore + "_"].join(" ")
8
+ common_prefix = /\A(.*_).* \1.*\Z/.match(names)&.values_at(1)&.first
9
+ members.each do |name, value|
10
+ unless common_prefix.nil?
11
+ full_name, name = [name, name.delete_prefix(common_prefix)]
12
+ singleton_class.alias_method(name, full_name)
13
+ end
14
+ const_set(name.upcase, value)
15
+ end
16
+ self.sealed = true
17
+ end
18
+
19
+ XDR::DSL::Union.redefine_method(:switch) do |switch, arm = nil|
20
+ raise ArgumentError, "`switch_on` not defined yet" if switch_type.nil?
21
+
22
+ switch = normalize_switch_declaration(switch)
23
+ self.switches = switches.merge(switch => arm)
24
+
25
+ unless arm.nil?
26
+ define_singleton_method(arm) do |*args, **kwargs|
27
+ value_type = arms[arm]
28
+ value = if value_type.valid?(args.first)
29
+ args.first
30
+ elsif value_type.ancestors.include?(XDR::Struct)
31
+ value_type.new(kwargs)
32
+ elsif value_type.ancestors.include?(XDR::Union)
33
+ value_type.new(*args[0..1])
34
+ else
35
+ args.first
36
+ end
37
+ new(switch, value)
38
+ end
39
+ end
40
+ end
41
+
42
+ # XDR::Union delegates missing methods to the underlying value
43
+ XDR::Union.define_method(:method_missing) do |name, *args|
44
+ return super(name, *args) unless value&.respond_to?(name)
45
+ value&.public_send(name, *args)
46
+ end
47
+
48
+ XDR::Union.define_method(:respond_to_missing?) do |*args|
49
+ value&.respond_to?(*args)
50
+ end
@@ -0,0 +1,59 @@
1
+ FactoryBot.define do
2
+ factory :digitalbits_ledger, class: Hyperclient::Resource do
3
+ initialize_with { new(attributes.stringify_keys, nil, nil) }
4
+
5
+ id { "ec168d452542589dbc2d0eb6d58c74b9bb2ccb93bba879a3b3fa73fdfa730182" }
6
+ paging_token { "12884901888" }
7
+ hash { "ec168d452542589dbc2d0eb6d58c74b9bb2ccb93bba879a3b3fa73fdfa730182" }
8
+ prev_hash { "fe0f6bea5f341344fdb5bc6fc4ad719dd63071d9203e9a1e7f17c68ea1ecebde" }
9
+ sequence { 3 }
10
+ transaction_count { 1 }
11
+ operation_count { 3 }
12
+ closed_at { "2015-09-30T17:15:54Z" }
13
+ total_coins { "100000000000.0000000" }
14
+ fee_pool { "0.0000300" }
15
+ base_fee_in_stroops { 100 }
16
+ base_reserve_in_stroops { 100000000 }
17
+ max_tx_set_size { 500 }
18
+ protocol_version { 1 }
19
+ header_xdr { "AAAAAf4Pa+pfNBNE/bW8b8StcZ3WMHHZID6aHn8Xxo6h7OveT8tCuFMOgNdZYJOIRVDug1f8O8Px/nC6paZHVl6SYykAAAAAVgwYygAAAAAAAAAAxAXcAjsE7UPy10Zx5GA7wF8NZPwXAURqCwJYjORMFD1ShdgmDrQnA6TSdmQnqUysyyhS7Px10zUmUf01qfuKPgAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" }
20
+ end
21
+
22
+ factory :digitalbits_transaction, class: Hyperclient::Resource do
23
+ initialize_with { new(attributes.stringify_keys, nil, nil) }
24
+
25
+ memo { "hello world" }
26
+ id { "3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889" }
27
+ paging_token { "12884905984" }
28
+ hash { "3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889" }
29
+ ledger { 3 }
30
+ created_at { "2015-09-30T17:15:54Z" }
31
+ source_account { "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7" }
32
+ source_account_sequence { "1" }
33
+ fee_paid { 300 }
34
+ operation_count { 3 }
35
+ envelope_xdr { "AAAAAAGUcmKO5465JxTSLQOQljwk2SfqAJmZSG6JH6wtqpwhAAABLAAAAAAAAAABAAAAAAAAAAEAAAALaGVsbG8gd29ybGQAAAAAAwAAAAAAAAAAAAAAABbxCy3mLg3hiTqX4VUEEp60pFOrJNxYM1JtxXTwXhY2AAAAAAvrwgAAAAAAAAAAAQAAAAAW8Qst5i4N4Yk6l+FVBBKetKRTqyTcWDNSbcV08F4WNgAAAAAN4Lazj4x61AAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLaqcIQAAAEBKwqWy3TaOxoGnfm9eUjfTRBvPf34dvDA0Nf+B8z4zBob90UXtuCqmQqwMCyH+okOI3c05br3khkH0yP4kCwcE" }
36
+ result_xdr { "AAAAAAAAASwAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAFAAAAAAAAAAA=" }
37
+ result_meta_xdr { "AAAAAAAAAAMAAAACAAAAAAAAAAMAAAAAAAAAABbxCy3mLg3hiTqX4VUEEp60pFOrJNxYM1JtxXTwXhY2AAAAAAvrwgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAGUcmKO5465JxTSLQOQljwk2SfqAJmZSG6JH6wtqpwhDeC2s5t4PNQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAEAAAADAAAAAAAAAAABlHJijueOuScU0i0DkJY8JNkn6gCZmUhuiR+sLaqcIQAAAAAL68IAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAW8Qst5i4N4Yk6l+FVBBKetKRTqyTcWDNSbcV08F4WNgAAAAAL68IAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAW8Qst5i4N4Yk6l+FVBBKetKRTqyTcWDNSbcV08F4WNg3gtrObeDzUAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAwAAAAAAAAAAAZRyYo7njrknFNItA5CWPCTZJ+oAmZlIbokfrC2qnCEAAAAAC+vCAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" }
38
+ fee_meta_xdr { "AAAAAgAAAAMAAAABAAAAAAAAAAABlHJijueOuScU0i0DkJY8JNkn6gCZmUhuiR+sLaqcIQ3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAABlHJijueOuScU0i0DkJY8JNkn6gCZmUhuiR+sLaqcIQ3gtrOnY/7UAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==" }
39
+ memo_type { "text" }
40
+ signatures do
41
+ ["SsKlst02jsaBp35vXlI300Qbz39+HbwwNDX/gfM+MwaG/dFF7bgqpkKsDAsh/qJDiN3NOW695IZB9Mj+JAsHBA=="]
42
+ end
43
+ end
44
+
45
+ factory :digitalbits_operation, class: Hyperclient::Resource do
46
+ initialize_with { new(attributes.stringify_keys, nil, nil) }
47
+
48
+ id { "12884905985" }
49
+ paging_token { "12884905985" }
50
+ source_account { "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7" }
51
+ type { "create_account" }
52
+ type_i { 0 }
53
+ created_at { "2015-09-30T17:15:54Z" }
54
+ transaction_hash { "3389e9f0f1a65f19736cacf544c2e825313e8447f569233bb8db39aa607c8889" }
55
+ starting_balance { "20.0000000" }
56
+ funder { "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7" }
57
+ account { "GALPCCZN4YXA3YMJHKL6CVIECKPLJJCTVMSNYWBTKJW4K5HQLYLDMZTB" }
58
+ end
59
+ end
@@ -0,0 +1,21 @@
1
+ module DigitalBits
2
+ class FeeBumpTransaction
3
+ include DigitalBits::Concerns::Transaction
4
+
5
+ def to_envelope(*key_pairs)
6
+ signatures = (key_pairs || []).map(&method(:sign_decorated))
7
+
8
+ TransactionEnvelope.fee_bump(signatures: signatures, tx: self)
9
+ end
10
+
11
+ def signature_base_prefix
12
+ val = DigitalBits::EnvelopeType.envelope_type_tx_fee_bump
13
+
14
+ DigitalBits.current_network_id + DigitalBits::EnvelopeType.to_xdr(val)
15
+ end
16
+
17
+ def source_account
18
+ source_account_ed25519
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,126 @@
1
+ module DigitalBits
2
+ class KeyPair
3
+ module FactoryMethods
4
+ def from_seed(seed)
5
+ seed_bytes = Util::StrKey.check_decode(:seed, seed)
6
+ from_raw_seed seed_bytes
7
+ end
8
+
9
+ def from_address(address)
10
+ pk_bytes = Util::StrKey.check_decode(:account_id, address)
11
+ from_public_key(pk_bytes)
12
+ end
13
+
14
+ def from_raw_seed(seed_bytes)
15
+ secret_key = RbNaCl::SigningKey.new(seed_bytes)
16
+ public_key = secret_key.verify_key
17
+ new(public_key, secret_key)
18
+ end
19
+
20
+ def from_public_key(pk_bytes)
21
+ public_key = RbNaCl::VerifyKey.new(pk_bytes)
22
+ new(public_key)
23
+ end
24
+
25
+ def random
26
+ secret_key = RbNaCl::SigningKey.generate
27
+ public_key = secret_key.verify_key
28
+ new(public_key, secret_key)
29
+ end
30
+
31
+ def from_network_passphrase(passphrase)
32
+ network_id = Digest::SHA256.digest(passphrase)
33
+ from_raw_seed network_id
34
+ end
35
+
36
+ def master
37
+ from_raw_seed(DigitalBits.current_network_id)
38
+ end
39
+ end
40
+
41
+ extend FactoryMethods
42
+
43
+ # @param [RbNaCl::VerifyKey] public_key
44
+ # @param [RbNaCl::SigningKey, nil] secret_key
45
+ def initialize(public_key, secret_key = nil)
46
+ @public_key = public_key
47
+ @secret_key = secret_key
48
+ end
49
+
50
+ def address
51
+ Util::StrKey.check_encode(:account_id, raw_public_key)
52
+ end
53
+
54
+ def seed
55
+ Util::StrKey.check_encode(:seed, raw_seed)
56
+ end
57
+
58
+ def account_id
59
+ DigitalBits::AccountID.new :public_key_type_ed25519, raw_public_key
60
+ end
61
+
62
+ def muxed_account
63
+ DigitalBits::MuxedAccount.new :key_type_ed25519, raw_public_key
64
+ end
65
+
66
+ def public_key
67
+ DigitalBits::PublicKey.new :public_key_type_ed25519, raw_public_key
68
+ end
69
+
70
+ def signer_key
71
+ DigitalBits::SignerKey.new :signer_key_type_ed25519, raw_public_key
72
+ end
73
+
74
+ def signature_hint
75
+ # take last 4 bytes
76
+ account_id.to_xdr.slice(-4, 4)
77
+ end
78
+
79
+ def raw_public_key
80
+ @public_key.to_bytes
81
+ end
82
+
83
+ def raw_seed
84
+ raise "no private key" if @secret_key.nil?
85
+ @secret_key.to_bytes
86
+ end
87
+
88
+ def rbnacl_signing_key
89
+ @secret_key
90
+ end
91
+
92
+ def rbnacl_verify_key
93
+ @public_key
94
+ end
95
+
96
+ def sign?
97
+ !@secret_key.nil?
98
+ end
99
+
100
+ def sign(message)
101
+ raise NotImplementedError, "no private key, signing is not available" unless sign?
102
+
103
+ @secret_key.sign(message)
104
+ end
105
+
106
+ def sign_decorated(message)
107
+ raw_signature = sign(message)
108
+ DigitalBits::DecoratedSignature.new({
109
+ hint: signature_hint,
110
+ signature: raw_signature
111
+ })
112
+ end
113
+
114
+ def verify(signature, message)
115
+ @public_key.verify(signature, message)
116
+ rescue RbNaCl::LengthError
117
+ false
118
+ rescue RbNaCl::BadSignatureError
119
+ false
120
+ end
121
+
122
+ def to_keypair
123
+ self
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,32 @@
1
+ require "digitalbits/convert"
2
+ require "digitalbits/dsl"
3
+
4
+ module DigitalBits
5
+ class LedgerKey
6
+ class << self
7
+ include DigitalBits::DSL
8
+
9
+ def switch_for_arm(name)
10
+ (@switch_by_arm ||= switches.invert).fetch(name)
11
+ end
12
+
13
+ def from(account_id:, **options)
14
+ field, value = options.first
15
+ case field
16
+ when nil
17
+ account(account_id: KeyPair(account_id).account_id)
18
+ when :balance_id
19
+ claimable_balance(balance_id: ClaimableBalanceID.v0(DigitalBits::Convert.from_hex(value.to_s)))
20
+ when :offer_id
21
+ offer(seller_id: account_id, offer_id: Integer(value))
22
+ when :data_name
23
+ data(account_id: account_id, data_name: value.to_s)
24
+ when :asset
25
+ trust_line(account_id: account_id, asset: Asset(value))
26
+ else
27
+ raise ArgumentError, "unknown option #{field} (not in :asset, :offer_id, :data_name, :balance_id)"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ module DigitalBits
2
+ class MuxedAccount
3
+ def to_keypair
4
+ case arm
5
+ when :ed25519 then KeyPair.from_public_key(value)
6
+ when :med25519 then KeyPair.from_public_key(value.ed25519)
7
+ else
8
+ raise "impossible"
9
+ end
10
+ end
11
+
12
+ def address
13
+ to_keypair.address
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,43 @@
1
+ module DigitalBits
2
+ # Provides a container for well-known network passphrases, such as the main network and SDF test network
3
+ module Networks
4
+ PUBLIC = "LiveNet Global DigitalBits Network ; February 2021"
5
+ TESTNET = "TestNet Global DigitalBits Network ; December 2020"
6
+ end
7
+
8
+ # Configures the default digitalbits network passphrase for the current process. Unless otherwise
9
+ # specified in a method that needs the passphrase, this value will be used.
10
+ #
11
+ # NOTE: This method is not thread-safe. It's best to just call this at startup once and use the other
12
+ # methods of specifying a network if you need two threads in the same process to communicate with
13
+ # different networks
14
+ #
15
+ # @see DigitalBits.on_network
16
+ mattr_accessor :default_network, default: Networks::TESTNET
17
+
18
+ # DigitalBits network passphrase selected for current thread
19
+ #
20
+ # @see DigitalBits.current_network
21
+ # @see DigitalBits.on_network
22
+ thread_mattr_accessor :network
23
+
24
+ # Returns the passphrase for the network currently active per-thread with a fallback to `DigitalBits.default_network`
25
+ def self.current_network
26
+ network.presence || default_network
27
+ end
28
+
29
+ # Returns the id for the currently configured network, suitable for use in generating
30
+ # a signature base string or making the root account's keypair.
31
+ def self.current_network_id
32
+ Digest::SHA256.digest(current_network)
33
+ end
34
+
35
+ # Executes the provided block in the context of the provided network.
36
+ def self.on_network(passphrase, &block)
37
+ old = network
38
+ self.network = passphrase
39
+ block.call
40
+ ensure
41
+ self.network = old
42
+ end
43
+ end