From b0fb06bfe417e84bc6b1685a28bd9556ae12c0ef Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Wed, 6 Feb 2019 14:53:47 +0700 Subject: [PATCH 1/7] added configuration for network --- lib/money-tree.rb | 21 ++++++++++++++++++++- lib/money-tree/address.rb | 7 ++++--- lib/money-tree/configuration.rb | 9 +++++++++ lib/money-tree/key.rb | 9 ++++++--- lib/money-tree/node.rb | 12 ++++++++---- 5 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 lib/money-tree/configuration.rb diff --git a/lib/money-tree.rb b/lib/money-tree.rb index fa21a70..99b80a4 100644 --- a/lib/money-tree.rb +++ b/lib/money-tree.rb @@ -1,4 +1,5 @@ require "openssl_extensions" +require 'money-tree/configuration' require "money-tree/version" require "money-tree/support" require "money-tree/networks" @@ -8,5 +9,23 @@ require "money-tree/node" module MoneyTree - + class << self + attr_accessor :configuration + end + + def self.network + configuration.network + end + + def self.configuration + @configuration ||= Configuration.new + end + + def self.reset + @configuration = Configuration.new + end + + def self.configure + yield(configuration) + end end diff --git a/lib/money-tree/address.rb b/lib/money-tree/address.rb index d0de722..13f08dd 100644 --- a/lib/money-tree/address.rb +++ b/lib/money-tree/address.rb @@ -1,14 +1,15 @@ module MoneyTree class Address attr_reader :private_key, :public_key - + def initialize(opts = {}) private_key = opts.delete(:private_key) @private_key = MoneyTree::PrivateKey.new({ key: private_key }.merge(opts)) @public_key = MoneyTree::PublicKey.new(@private_key, opts) end - - def to_s(network: :bitcoin) + + def to_s(network: nil) + network ||= MoneyTree.network public_key.to_s(network: network) end diff --git a/lib/money-tree/configuration.rb b/lib/money-tree/configuration.rb new file mode 100644 index 0000000..ccc376c --- /dev/null +++ b/lib/money-tree/configuration.rb @@ -0,0 +1,9 @@ +module MoneyTree + class Configuration + attr_accessor :network + + def initialize(args={}) + @network = args.delete(:network) || :bitcoin + end + end +end diff --git a/lib/money-tree/key.rb b/lib/money-tree/key.rb index b8a122f..287986b 100644 --- a/lib/money-tree/key.rb +++ b/lib/money-tree/key.rb @@ -129,7 +129,8 @@ def to_hex int_to_hex @ec_key.private_key, 64 end - def to_wif(compressed: true, network: :bitcoin) + def to_wif(compressed: true, network: nil) + network ||= MoneyTree.network source = NETWORKS[network][:privkey_version] + to_hex source += NETWORKS[network][:privkey_compression_flag] if compressed hash = sha256(source) @@ -157,7 +158,8 @@ def to_base64 encode_base64(to_hex) end - def to_s(network: :bitcoin) + def to_s(network: nil) + network ||= MoneyTree.network to_wif(network: network) end @@ -246,7 +248,8 @@ def to_ripemd160 ripemd160 hash end - def to_address(network: :bitcoin) + def to_address(network: nil) + network ||= MoneyTree.network hash = to_ripemd160 address = NETWORKS[network][:address_version] + hash to_serialized_base58 address diff --git a/lib/money-tree/node.rb b/lib/money-tree/node.rb index 9def6bf..42e31f5 100644 --- a/lib/money-tree/node.rb +++ b/lib/money-tree/node.rb @@ -104,8 +104,9 @@ def right_from_hash(hash) bytes_to_int hash.bytes.to_a[32..-1] end - def to_serialized_hex(type = :public, network: :bitcoin) + def to_serialized_hex(type = :public, network: nil) raise PrivatePublicMismatch if type.to_sym == :private && private_key.nil? + network ||= MoneyTree.network version_key = type.to_sym == :private ? :extended_privkey_version : :extended_pubkey_version hex = NETWORKS[network][version_key] # version (4 bytes) hex += depth_hex(depth) # depth (1 byte) @@ -115,12 +116,14 @@ def to_serialized_hex(type = :public, network: :bitcoin) hex += type.to_sym == :private ? "00#{private_key.to_hex}" : public_key.compressed.to_hex end - def to_bip32(type = :public, network: :bitcoin) + def to_bip32(type = :public, network: nil) raise PrivatePublicMismatch if type.to_sym == :private && private_key.nil? + network ||= MoneyTree.network to_serialized_base58 to_serialized_hex(type, network: network) end - def to_serialized_address(type = :public, network: :bitcoin) + def to_serialized_address(type = :public, network: nil) + network ||= MoneyTree.network puts 'Node.to_serialized_address is DEPRECATED. Please use .to_bip32.' to_bip32(type, network: network) end @@ -142,7 +145,8 @@ def parent_fingerprint end end - def to_address(compressed=true, network: :bitcoin) + def to_address(compressed=true, network: nil) + network ||= MoneyTree.network address = NETWORKS[network][:address_version] + to_identifier(compressed) to_serialized_base58 address end From a02d4a08b7d63bed10ee08a83e89649179fee55e Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Wed, 6 Feb 2019 14:57:25 +0700 Subject: [PATCH 2/7] bump version --- lib/money-tree/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/money-tree/version.rb b/lib/money-tree/version.rb index 612eaa6..17b3dda 100644 --- a/lib/money-tree/version.rb +++ b/lib/money-tree/version.rb @@ -1,3 +1,3 @@ module MoneyTree - VERSION = "0.10.0" + VERSION = "0.10.1" end From 4471ce5847daf1740174281bed7cc26cdb1fdfee Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Wed, 6 Feb 2019 14:59:09 +0700 Subject: [PATCH 3/7] Added Network configuration to docs --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 70a85db..5f1bf5d 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,16 @@ They are all equivalent ways of saying the same thing, but the first two are jus To add just a little more confusion to the mix, some wallets will use negative `i` values to also denote private derivation. Any `i` value that is negative will be processed using private derivation by this library. e.g. `"m/-1/1"`. (NOTE: known issue, see below) +## Change Network + +MoneyTree will operate in mainnet by default. To activate Bitcoin Testnet simply run + +```ruby +MoneyTree.configure do |config| + config.network = :testnet3 +end +``` + ## Contributing From a15faf624165976b87bbfe0218b5f2796c7cbf12 Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Mon, 20 May 2019 07:51:03 +0700 Subject: [PATCH 4/7] added litecoin support --- lib/money-tree/networks.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/money-tree/networks.rb b/lib/money-tree/networks.rb index 291d613..c9d638d 100644 --- a/lib/money-tree/networks.rb +++ b/lib/money-tree/networks.rb @@ -27,7 +27,32 @@ module MoneyTree compressed_wif_chars: %w(c), uncompressed_wif_chars: %w(9), protocol_version: 70001 + }, + litecoin: { + address_version: '30', + p2sh_version: '32', + p2sh_char: '3',##TODO + privkey_version: 'b0', + privkey_compression_flag: '01',##TODO + extended_privkey_version: "019d9cfe", + extended_pubkey_version: "019da462", + compressed_wif_chars: %w(K L),##TODO + uncompressed_wif_chars: %w(5),##TODO + protocol_version: 70002 + }, + litecoin_testnet: { + address_version: '6f', + p2sh_version: '3a', + p2sh_char: '2',##TODO + privkey_version: 'ef', + privkey_compression_flag: '01',##TODO + extended_privkey_version: "0436ef7d", + extended_pubkey_version: "0436f6e1", + compressed_wif_chars: %w(c),##TODO + uncompressed_wif_chars: %w(9),##TODO + protocol_version: 70002 } + ) hsh[:testnet3] = hsh[:bitcoin_testnet] hsh From 23020233b1aead766e30563dce992049ece20b9d Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Mon, 20 May 2019 08:00:02 +0700 Subject: [PATCH 5/7] bumpo versiono --- lib/money-tree/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/money-tree/version.rb b/lib/money-tree/version.rb index 17b3dda..cdea2b1 100644 --- a/lib/money-tree/version.rb +++ b/lib/money-tree/version.rb @@ -1,3 +1,3 @@ module MoneyTree - VERSION = "0.10.1" + VERSION = "0.10.2" end From fc249b51c4c873d3914eb9cbe8236c1e7d226fdd Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Fri, 2 Aug 2019 01:28:43 +0000 Subject: [PATCH 6/7] Added DASH and DASH_Testnet support --- lib/money-tree/networks.rb | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/money-tree/networks.rb b/lib/money-tree/networks.rb index c9d638d..9459d03 100644 --- a/lib/money-tree/networks.rb +++ b/lib/money-tree/networks.rb @@ -27,7 +27,7 @@ module MoneyTree compressed_wif_chars: %w(c), uncompressed_wif_chars: %w(9), protocol_version: 70001 - }, + }, litecoin: { address_version: '30', p2sh_version: '32', @@ -51,8 +51,32 @@ module MoneyTree compressed_wif_chars: %w(c),##TODO uncompressed_wif_chars: %w(9),##TODO protocol_version: 70002 + }, + dash: { + address_version: '4c', # this makes the Y + p2sh_version: '10', + p2sh_char: '2', + privkey_version: 'cc', + privkey_compression_flag: '01', + extended_privkey_version: "04358394", #default BTC + extended_pubkey_version: "043587cf", #default BTC + compressed_wif_chars: %w(c), + uncompressed_wif_chars: %w(9), + protocol_version: 70014 + }, + dash_testnet: { + address_version: '8c', # this makes the X + p2sh_version: '13', + p2sh_char: '2', + privkey_version: 'ef', + privkey_compression_flag: '01', + extended_privkey_version: "04358394", #default BTC + extended_pubkey_version: "043587cf", #default BTC + compressed_wif_chars: %w(c), + uncompressed_wif_chars: %w(9), + protocol_version: 70014 } - + ) hsh[:testnet3] = hsh[:bitcoin_testnet] hsh From 52d4b38fa83d303e81fd81cec23edb169f04bceb Mon Sep 17 00:00:00 2001 From: Tim Kretschmer Date: Fri, 2 Aug 2019 01:32:10 +0000 Subject: [PATCH 7/7] Update version.rb --- lib/money-tree/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/money-tree/version.rb b/lib/money-tree/version.rb index cdea2b1..1f7fc68 100644 --- a/lib/money-tree/version.rb +++ b/lib/money-tree/version.rb @@ -1,3 +1,3 @@ module MoneyTree - VERSION = "0.10.2" + VERSION = "0.10.3" end