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.
- checksums.yaml +7 -0
- data/LICENSE +202 -0
- data/README.md +84 -0
- data/generated/digitalbits-base-generated.rb +228 -0
- data/generated/digitalbits/account_entry.rb +55 -0
- data/generated/digitalbits/account_entry/ext.rb +28 -0
- data/generated/digitalbits/account_entry_extension_v1.rb +32 -0
- data/generated/digitalbits/account_entry_extension_v1/ext.rb +28 -0
- data/generated/digitalbits/account_entry_extension_v2.rb +34 -0
- data/generated/digitalbits/account_entry_extension_v2/ext.rb +24 -0
- data/generated/digitalbits/account_flags.rb +31 -0
- data/generated/digitalbits/account_merge_result.rb +26 -0
- data/generated/digitalbits/account_merge_result_code.rb +37 -0
- data/generated/digitalbits/allow_trust_op.rb +39 -0
- data/generated/digitalbits/allow_trust_op/asset.rb +33 -0
- data/generated/digitalbits/allow_trust_result.rb +25 -0
- data/generated/digitalbits/allow_trust_result_code.rb +33 -0
- data/generated/digitalbits/asset.rb +47 -0
- data/generated/digitalbits/asset/alpha_num12.rb +22 -0
- data/generated/digitalbits/asset/alpha_num4.rb +22 -0
- data/generated/digitalbits/asset_type.rb +24 -0
- data/generated/digitalbits/auth.rb +20 -0
- data/generated/digitalbits/auth_cert.rb +22 -0
- data/generated/digitalbits/authenticated_message.rb +32 -0
- data/generated/digitalbits/authenticated_message/v0.rb +24 -0
- data/generated/digitalbits/begin_sponsoring_future_reserves_op.rb +18 -0
- data/generated/digitalbits/begin_sponsoring_future_reserves_result.rb +25 -0
- data/generated/digitalbits/begin_sponsoring_future_reserves_result_code.rb +29 -0
- data/generated/digitalbits/bucket_entry.rb +34 -0
- data/generated/digitalbits/bucket_entry_type.rb +28 -0
- data/generated/digitalbits/bucket_metadata.rb +32 -0
- data/generated/digitalbits/bucket_metadata/ext.rb +24 -0
- data/generated/digitalbits/bump_sequence_op.rb +18 -0
- data/generated/digitalbits/bump_sequence_result.rb +25 -0
- data/generated/digitalbits/bump_sequence_result_code.rb +24 -0
- data/generated/digitalbits/change_trust_op.rb +22 -0
- data/generated/digitalbits/change_trust_result.rb +25 -0
- data/generated/digitalbits/change_trust_result_code.rb +34 -0
- data/generated/digitalbits/claim_claimable_balance_op.rb +18 -0
- data/generated/digitalbits/claim_claimable_balance_result.rb +25 -0
- data/generated/digitalbits/claim_claimable_balance_result_code.rb +31 -0
- data/generated/digitalbits/claim_offer_atom.rb +33 -0
- data/generated/digitalbits/claim_predicate.rb +43 -0
- data/generated/digitalbits/claim_predicate_type.rb +30 -0
- data/generated/digitalbits/claimable_balance_entry.rb +44 -0
- data/generated/digitalbits/claimable_balance_entry/ext.rb +24 -0
- data/generated/digitalbits/claimable_balance_id.rb +23 -0
- data/generated/digitalbits/claimable_balance_id_type.rb +20 -0
- data/generated/digitalbits/claimant.rb +31 -0
- data/generated/digitalbits/claimant/v0.rb +22 -0
- data/generated/digitalbits/claimant_type.rb +20 -0
- data/generated/digitalbits/create_account_op.rb +20 -0
- data/generated/digitalbits/create_account_result.rb +25 -0
- data/generated/digitalbits/create_account_result_code.rb +32 -0
- data/generated/digitalbits/create_claimable_balance_op.rb +22 -0
- data/generated/digitalbits/create_claimable_balance_result.rb +27 -0
- data/generated/digitalbits/create_claimable_balance_result_code.rb +30 -0
- data/generated/digitalbits/create_passive_sell_offer_op.rb +24 -0
- data/generated/digitalbits/crypto_key_type.rb +28 -0
- data/generated/digitalbits/curve25519_public.rb +18 -0
- data/generated/digitalbits/curve25519_secret.rb +18 -0
- data/generated/digitalbits/data_entry.rb +35 -0
- data/generated/digitalbits/data_entry/ext.rb +24 -0
- data/generated/digitalbits/decorated_signature.rb +20 -0
- data/generated/digitalbits/digital_bits_message.rb +84 -0
- data/generated/digitalbits/digital_bits_value.rb +43 -0
- data/generated/digitalbits/digital_bits_value/ext.rb +28 -0
- data/generated/digitalbits/digital_bits_value_type.rb +22 -0
- data/generated/digitalbits/dont_have.rb +20 -0
- data/generated/digitalbits/end_sponsoring_future_reserves_result.rb +25 -0
- data/generated/digitalbits/end_sponsoring_future_reserves_result_code.rb +25 -0
- data/generated/digitalbits/envelope_type.rb +32 -0
- data/generated/digitalbits/error.rb +20 -0
- data/generated/digitalbits/error_code.rb +28 -0
- data/generated/digitalbits/fee_bump_transaction.rb +39 -0
- data/generated/digitalbits/fee_bump_transaction/ext.rb +24 -0
- data/generated/digitalbits/fee_bump_transaction/inner_tx.rb +25 -0
- data/generated/digitalbits/fee_bump_transaction_envelope.rb +22 -0
- data/generated/digitalbits/hello.rb +34 -0
- data/generated/digitalbits/hmac_sha256_key.rb +18 -0
- data/generated/digitalbits/hmac_sha256_mac.rb +18 -0
- data/generated/digitalbits/inflation_payout.rb +20 -0
- data/generated/digitalbits/inflation_result.rb +26 -0
- data/generated/digitalbits/inflation_result_code.rb +24 -0
- data/generated/digitalbits/inner_transaction_result.rb +57 -0
- data/generated/digitalbits/inner_transaction_result/ext.rb +24 -0
- data/generated/digitalbits/inner_transaction_result/result.rb +54 -0
- data/generated/digitalbits/inner_transaction_result_pair.rb +20 -0
- data/generated/digitalbits/ip_addr_type.rb +22 -0
- data/generated/digitalbits/ledger_close_meta.rb +23 -0
- data/generated/digitalbits/ledger_close_meta_v0.rb +35 -0
- data/generated/digitalbits/ledger_close_value_signature.rb +20 -0
- data/generated/digitalbits/ledger_entry.rb +50 -0
- data/generated/digitalbits/ledger_entry/data.rb +41 -0
- data/generated/digitalbits/ledger_entry/ext.rb +28 -0
- data/generated/digitalbits/ledger_entry_change.rb +35 -0
- data/generated/digitalbits/ledger_entry_change_type.rb +26 -0
- data/generated/digitalbits/ledger_entry_extension_v1.rb +30 -0
- data/generated/digitalbits/ledger_entry_extension_v1/ext.rb +24 -0
- data/generated/digitalbits/ledger_entry_type.rb +28 -0
- data/generated/digitalbits/ledger_header.rb +69 -0
- data/generated/digitalbits/ledger_header/ext.rb +24 -0
- data/generated/digitalbits/ledger_header_history_entry.rb +33 -0
- data/generated/digitalbits/ledger_header_history_entry/ext.rb +24 -0
- data/generated/digitalbits/ledger_key.rb +69 -0
- data/generated/digitalbits/ledger_key/account.rb +20 -0
- data/generated/digitalbits/ledger_key/claimable_balance.rb +20 -0
- data/generated/digitalbits/ledger_key/data.rb +22 -0
- data/generated/digitalbits/ledger_key/offer.rb +22 -0
- data/generated/digitalbits/ledger_key/trust_line.rb +22 -0
- data/generated/digitalbits/ledger_scp_messages.rb +20 -0
- data/generated/digitalbits/ledger_upgrade.rb +35 -0
- data/generated/digitalbits/ledger_upgrade_type.rb +26 -0
- data/generated/digitalbits/liabilities.rb +20 -0
- data/generated/digitalbits/manage_buy_offer_op.rb +29 -0
- data/generated/digitalbits/manage_buy_offer_result.rb +26 -0
- data/generated/digitalbits/manage_buy_offer_result_code.rb +51 -0
- data/generated/digitalbits/manage_data_op.rb +20 -0
- data/generated/digitalbits/manage_data_result.rb +25 -0
- data/generated/digitalbits/manage_data_result_code.rb +32 -0
- data/generated/digitalbits/manage_offer_effect.rb +24 -0
- data/generated/digitalbits/manage_offer_success_result.rb +34 -0
- data/generated/digitalbits/manage_offer_success_result/offer.rb +30 -0
- data/generated/digitalbits/manage_sell_offer_op.rb +28 -0
- data/generated/digitalbits/manage_sell_offer_result.rb +26 -0
- data/generated/digitalbits/manage_sell_offer_result_code.rb +54 -0
- data/generated/digitalbits/memo.rb +38 -0
- data/generated/digitalbits/memo_type.rb +28 -0
- data/generated/digitalbits/message_type.rb +56 -0
- data/generated/digitalbits/muxed_account.rb +35 -0
- data/generated/digitalbits/muxed_account/med25519.rb +22 -0
- data/generated/digitalbits/offer_entry.rb +49 -0
- data/generated/digitalbits/offer_entry/ext.rb +24 -0
- data/generated/digitalbits/offer_entry_flags.rb +21 -0
- data/generated/digitalbits/operation.rb +69 -0
- data/generated/digitalbits/operation/body.rb +95 -0
- data/generated/digitalbits/operation_id.rb +32 -0
- data/generated/digitalbits/operation_id/id.rb +24 -0
- data/generated/digitalbits/operation_meta.rb +18 -0
- data/generated/digitalbits/operation_result.rb +71 -0
- data/generated/digitalbits/operation_result/tr.rb +97 -0
- data/generated/digitalbits/operation_result_code.rb +33 -0
- data/generated/digitalbits/operation_type.rb +56 -0
- data/generated/digitalbits/path_payment_strict_receive_op.rb +32 -0
- data/generated/digitalbits/path_payment_strict_receive_result.rb +39 -0
- data/generated/digitalbits/path_payment_strict_receive_result/success.rb +22 -0
- data/generated/digitalbits/path_payment_strict_receive_result_code.rb +56 -0
- data/generated/digitalbits/path_payment_strict_send_op.rb +32 -0
- data/generated/digitalbits/path_payment_strict_send_result.rb +38 -0
- data/generated/digitalbits/path_payment_strict_send_result/success.rb +22 -0
- data/generated/digitalbits/path_payment_strict_send_result_code.rb +55 -0
- data/generated/digitalbits/payment_op.rb +22 -0
- data/generated/digitalbits/payment_result.rb +25 -0
- data/generated/digitalbits/payment_result_code.rb +41 -0
- data/generated/digitalbits/peer_address.rb +33 -0
- data/generated/digitalbits/peer_address/ip.rb +29 -0
- data/generated/digitalbits/peer_stats.rb +48 -0
- data/generated/digitalbits/price.rb +20 -0
- data/generated/digitalbits/public_key.rb +23 -0
- data/generated/digitalbits/public_key_type.rb +20 -0
- data/generated/digitalbits/revoke_sponsorship_op.rb +36 -0
- data/generated/digitalbits/revoke_sponsorship_op/signer.rb +22 -0
- data/generated/digitalbits/revoke_sponsorship_result.rb +25 -0
- data/generated/digitalbits/revoke_sponsorship_result_code.rb +31 -0
- data/generated/digitalbits/revoke_sponsorship_type.rb +22 -0
- data/generated/digitalbits/scp_ballot.rb +20 -0
- data/generated/digitalbits/scp_envelope.rb +20 -0
- data/generated/digitalbits/scp_history_entry.rb +23 -0
- data/generated/digitalbits/scp_history_entry_v0.rb +20 -0
- data/generated/digitalbits/scp_nomination.rb +22 -0
- data/generated/digitalbits/scp_quorum_set.rb +22 -0
- data/generated/digitalbits/scp_statement.rb +58 -0
- data/generated/digitalbits/scp_statement/pledges.rb +63 -0
- data/generated/digitalbits/scp_statement/pledges/confirm.rb +30 -0
- data/generated/digitalbits/scp_statement/pledges/externalize.rb +26 -0
- data/generated/digitalbits/scp_statement/pledges/prepare.rb +32 -0
- data/generated/digitalbits/scp_statement_type.rb +26 -0
- data/generated/digitalbits/set_options_op.rb +41 -0
- data/generated/digitalbits/set_options_result.rb +25 -0
- data/generated/digitalbits/set_options_result_code.rb +40 -0
- data/generated/digitalbits/signed_survey_request_message.rb +20 -0
- data/generated/digitalbits/signed_survey_response_message.rb +20 -0
- data/generated/digitalbits/signer.rb +20 -0
- data/generated/digitalbits/signer_key.rb +33 -0
- data/generated/digitalbits/signer_key_type.rb +24 -0
- data/generated/digitalbits/simple_payment_result.rb +22 -0
- data/generated/digitalbits/survey_message_command_type.rb +20 -0
- data/generated/digitalbits/survey_request_message.rb +26 -0
- data/generated/digitalbits/survey_response_body.rb +23 -0
- data/generated/digitalbits/survey_response_message.rb +26 -0
- data/generated/digitalbits/threshold_indexes.rb +26 -0
- data/generated/digitalbits/time_bounds.rb +20 -0
- data/generated/digitalbits/topology_response_body.rb +25 -0
- data/generated/digitalbits/transaction.rb +50 -0
- data/generated/digitalbits/transaction/ext.rb +24 -0
- data/generated/digitalbits/transaction_envelope.rb +31 -0
- data/generated/digitalbits/transaction_history_entry.rb +33 -0
- data/generated/digitalbits/transaction_history_entry/ext.rb +24 -0
- data/generated/digitalbits/transaction_history_result_entry.rb +33 -0
- data/generated/digitalbits/transaction_history_result_entry/ext.rb +24 -0
- data/generated/digitalbits/transaction_meta.rb +31 -0
- data/generated/digitalbits/transaction_meta_v1.rb +20 -0
- data/generated/digitalbits/transaction_meta_v2.rb +24 -0
- data/generated/digitalbits/transaction_result.rb +46 -0
- data/generated/digitalbits/transaction_result/ext.rb +24 -0
- data/generated/digitalbits/transaction_result/result.rb +36 -0
- data/generated/digitalbits/transaction_result_code.rb +54 -0
- data/generated/digitalbits/transaction_result_meta.rb +22 -0
- data/generated/digitalbits/transaction_result_pair.rb +20 -0
- data/generated/digitalbits/transaction_result_set.rb +18 -0
- data/generated/digitalbits/transaction_set.rb +20 -0
- data/generated/digitalbits/transaction_signature_payload.rb +32 -0
- data/generated/digitalbits/transaction_signature_payload/tagged_transaction.rb +30 -0
- data/generated/digitalbits/transaction_v0.rb +39 -0
- data/generated/digitalbits/transaction_v0/ext.rb +24 -0
- data/generated/digitalbits/transaction_v0_envelope.rb +22 -0
- data/generated/digitalbits/transaction_v1_envelope.rb +22 -0
- data/generated/digitalbits/trust_line_entry.rb +53 -0
- data/generated/digitalbits/trust_line_entry/ext.rb +42 -0
- data/generated/digitalbits/trust_line_entry/ext/v1.rb +34 -0
- data/generated/digitalbits/trust_line_entry/ext/v1/ext.rb +28 -0
- data/generated/digitalbits/trust_line_flags.rb +25 -0
- data/generated/digitalbits/upgrade_entry_meta.rb +20 -0
- data/lib/digitalbits-base.rb +51 -0
- data/lib/digitalbits/account_flags.rb +26 -0
- data/lib/digitalbits/asset.rb +81 -0
- data/lib/digitalbits/base.rb +1 -0
- data/lib/digitalbits/claim_predicate.rb +197 -0
- data/lib/digitalbits/compat.rb +9 -0
- data/lib/digitalbits/concerns/transaction.rb +50 -0
- data/lib/digitalbits/convert.rb +32 -0
- data/lib/digitalbits/dsl.rb +93 -0
- data/lib/digitalbits/ext/xdr.rb +50 -0
- data/lib/digitalbits/factories.rb +59 -0
- data/lib/digitalbits/fee_bump_transaction.rb +21 -0
- data/lib/digitalbits/key_pair.rb +126 -0
- data/lib/digitalbits/ledger_key.rb +32 -0
- data/lib/digitalbits/muxed_account.rb +16 -0
- data/lib/digitalbits/networks.rb +43 -0
- data/lib/digitalbits/operation.rb +603 -0
- data/lib/digitalbits/path_payment_strict_receive_result.rb +16 -0
- data/lib/digitalbits/price.rb +39 -0
- data/lib/digitalbits/signer_key.rb +46 -0
- data/lib/digitalbits/thresholds.rb +37 -0
- data/lib/digitalbits/transaction.rb +37 -0
- data/lib/digitalbits/transaction_builder.rb +166 -0
- data/lib/digitalbits/transaction_envelope.rb +35 -0
- data/lib/digitalbits/transaction_v0.rb +43 -0
- data/lib/digitalbits/trust_line_flags.rb +53 -0
- data/lib/digitalbits/util/strkey.rb +70 -0
- data/lib/digitalbits/version.rb +3 -0
- 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
|