digitalbits-base 0.27.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|