pochette 0.1.3 → 0.1.4
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 +4 -4
- data/README.md +15 -14
- data/lib/pochette/backends/blockchain_info.rb +2 -1
- data/lib/pochette/transaction_builder.rb +18 -4
- data/lib/pochette/trezor_transaction_builder.rb +28 -30
- data/lib/pochette/version.rb +1 -1
- data/lib/pochette.rb +11 -2
- data/pochette.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a017e533b5f1d3f65ac7b806d1d91efae1a1ee6b
|
4
|
+
data.tar.gz: a561a5c25acb769f73308b2aa2d8086da9f2e7c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eda52dde1acbf52a00edb364840506beacaf4f36176852dd4ba35035382802f7461bcd573a60d89e34cfee950163720ef7706c0a18fb15231ede2cbaaa28b1ba
|
7
|
+
data.tar.gz: aaf7184e79879a6b6b6303f05d108a3678a66a64170d0a8803370f468b4a2a3d688413d4eae4891cc26cac36110fe44d6f66755aadb2708a0d4cff051ffc8fcc
|
data/README.md
CHANGED
@@ -93,7 +93,7 @@ The TransactionBuilder's initializer receives a single options hash with:
|
|
93
93
|
<dd>
|
94
94
|
List of pairs [recipient_address, amount]
|
95
95
|
This will not be all the final outputs in the transaction,
|
96
|
-
as a 'change' output may be
|
96
|
+
as a 'change' output may be added if needed.
|
97
97
|
</dd>
|
98
98
|
<dt>utxo_blacklist:</dt>
|
99
99
|
<dd>
|
@@ -426,19 +426,20 @@ amount seen on the network for a given address, and the final confirmed amount a
|
|
426
426
|
'mhLAgRz5f1YogfYBZCDFSRt3ceeKBPVEKg',
|
427
427
|
]
|
428
428
|
>>> backend.balances_for(addresses, 6)
|
429
|
-
|
430
|
-
"mhLAgRz5f1YogfYBZCDFSRt3ceeKBPVEKg" =>
|
431
|
-
|
432
|
-
"mjfa56Keq7PXRKgdPSDB6eWLp4aaAVcj6L" =>
|
433
|
-
|
434
|
-
"mvrDG7Ts6Mq9ejhZxdsQLjbScycVaktqsg" =>
|
435
|
-
|
436
|
-
"mwZE4QfzzriE7nsgHSWbgmtT7s6SDysYvP" =>
|
437
|
-
|
438
|
-
"mxYzRdJfPk8PcaKSsSzNkX85mMfNcr2CGr" =>
|
439
|
-
|
440
|
-
"mzbXim4u1Nq4J2kVggu471pZL3ahxNkmE9" =>
|
441
|
-
|
429
|
+
=> {
|
430
|
+
"mhLAgRz5f1YogfYBZCDFSRt3ceeKBPVEKg" =>
|
431
|
+
[0.00544426, 0.00544426, 0.0, 0.00544426, 0.00544426, 0.0],
|
432
|
+
"mjfa56Keq7PXRKgdPSDB6eWLp4aaAVcj6L" =>
|
433
|
+
[0.005, 0.0, 0.005, 0.006, 0.0, 0.006],
|
434
|
+
"mvrDG7Ts6Mq9ejhZxdsQLjbScycVaktqsg" =>
|
435
|
+
[0.005, 0.0, 0.005, 0.005, 0.0, 0.005],
|
436
|
+
"mwZE4QfzzriE7nsgHSWbgmtT7s6SDysYvP" =>
|
437
|
+
[0.005, 0.0, 0.005, 0.005, 0.0, 0.005],
|
438
|
+
"mxYzRdJfPk8PcaKSsSzNkX85mMfNcr2CGr" =>
|
439
|
+
[0.002, 0.0, 0.002, 0.002, 0.0, 0.002],
|
440
|
+
"mzbXim4u1Nq4J2kVggu471pZL3ahxNkmE9" =>
|
441
|
+
[0.005, 0.0, 0.005, 0.005, 0.0, 0.005],
|
442
|
+
}
|
442
443
|
```
|
443
444
|
|
444
445
|
## list_unspent(addresses)
|
@@ -89,7 +89,8 @@ class Pochette::Backends::BlockchainInfo
|
|
89
89
|
uri = URI.parse("https://blockchain.info/pushtx")
|
90
90
|
params = { "tx" => hex }
|
91
91
|
params['api_code'] = api_key if api_key
|
92
|
-
Net::HTTP.post_form(uri, params)
|
92
|
+
response = Net::HTTP.post_form(uri, params)
|
93
|
+
raise StandardError.new(response) if response.code.to_i != 200
|
93
94
|
Bitcoin::Protocol::Tx.new(hex.htb).hash
|
94
95
|
end
|
95
96
|
|
@@ -5,6 +5,8 @@
|
|
5
5
|
# you can query the results via to_hash.
|
6
6
|
|
7
7
|
class Pochette::TransactionBuilder
|
8
|
+
include Contracts::Core
|
9
|
+
|
8
10
|
# Backend can be set globally, or independently for each class and instance.
|
9
11
|
class_attribute :backend
|
10
12
|
def self.backend
|
@@ -17,10 +19,17 @@ class Pochette::TransactionBuilder
|
|
17
19
|
cattr_accessor(:network_minimum_fee){ 10000 }
|
18
20
|
cattr_accessor(:default_fee_per_kb){ 10000 }
|
19
21
|
|
22
|
+
Contract ({
|
23
|
+
:addresses => C::ArrayOf[String],
|
24
|
+
:outputs => C::Maybe[C::ArrayOf[[String, C::Num]]],
|
25
|
+
:utxo_blacklist => C::Maybe[C::ArrayOf[[String, Integer]]],
|
26
|
+
:change_address => C::Maybe[String],
|
27
|
+
:fee_per_kb => C::Maybe[C::Num],
|
28
|
+
:spend_all => C::Maybe[C::Bool],
|
29
|
+
}) => C::Any
|
20
30
|
def initialize(options)
|
21
31
|
self.backend = options[:backend] if options[:backend]
|
22
32
|
initialize_options(options)
|
23
|
-
return unless valid?
|
24
33
|
initialize_fee
|
25
34
|
initialize_outputs
|
26
35
|
return unless valid?
|
@@ -29,6 +38,14 @@ class Pochette::TransactionBuilder
|
|
29
38
|
validate_final_amounts
|
30
39
|
end
|
31
40
|
|
41
|
+
Contract C::None => C::Maybe[({
|
42
|
+
:input_total => C::Num,
|
43
|
+
:output_total => C::Num,
|
44
|
+
:fee => C::Num,
|
45
|
+
:outputs => C::ArrayOf[[String, C::Num]],
|
46
|
+
:inputs => C::ArrayOf[[String, String, Integer, C::Num]],
|
47
|
+
:utxos_to_blacklist => C::ArrayOf[[String, Integer]]
|
48
|
+
})]
|
32
49
|
def as_hash
|
33
50
|
return nil unless valid?
|
34
51
|
{ input_total: inputs_amount,
|
@@ -58,9 +75,6 @@ protected
|
|
58
75
|
self.options = options
|
59
76
|
self.errors ||= []
|
60
77
|
self.addresses = options[:addresses]
|
61
|
-
if addresses.nil? || addresses.empty?
|
62
|
-
return errors << :no_addresses_given
|
63
|
-
end
|
64
78
|
end
|
65
79
|
|
66
80
|
def initialize_fee
|
@@ -1,37 +1,16 @@
|
|
1
1
|
# Same as TransactionBuilder but outputs a transaction hash with all the
|
2
2
|
# required data to create and sign a transaction using a BitcoinTrezor.
|
3
|
-
# * Uses BIP32 addresses instead of regular strings.
|
4
|
-
# Each address is represented as a pair, with the public address string
|
5
|
-
# and the BIP32 path as a list of integers, for example:
|
6
|
-
# ['public-address-as-string', [44, 1, 3, 11]]
|
7
|
-
#
|
8
|
-
# * Includes associated transaction data for each input being spent,
|
9
|
-
# ready to be consumed by your Trezor device.
|
10
|
-
#
|
11
|
-
# * Outputs are represented as JSON with script_type as expected by Trezor.
|
12
|
-
# { script_type: 'PAYTOADDRESS',
|
13
|
-
# address: '1address-as-string',
|
14
|
-
# amount: amount_in_satoshis }
|
15
|
-
#
|
16
|
-
# Options:
|
17
|
-
# bip32_addresses:
|
18
|
-
# List of [address, path] pairs in wallet.
|
19
|
-
# We will be spending their unspent outputs.
|
20
|
-
# outputs:
|
21
|
-
# List of pairs [recipient_address, amount]
|
22
|
-
# This will not be all the final outputs in the transaction,
|
23
|
-
# as a 'change' output may be added if needed.
|
24
|
-
# utxo_blacklist:
|
25
|
-
# List of utxos to ignore, a list of pairs [transaction hash, position]
|
26
|
-
# change_address:
|
27
|
-
# Change address to use. Will default to the first source address.
|
28
|
-
# fee_per_kb:
|
29
|
-
# Defaults to 10000 satoshis.
|
30
|
-
# spend_all:
|
31
|
-
# Wether to spend all available utxos or just select enough to
|
32
|
-
# cover the given outputs.
|
33
3
|
|
34
4
|
class Pochette::TrezorTransactionBuilder < Pochette::TransactionBuilder
|
5
|
+
|
6
|
+
Contract ({
|
7
|
+
:bip32_addresses => C::ArrayOf[[String, C::ArrayOf[Integer]]],
|
8
|
+
:outputs => C::Maybe[C::ArrayOf[[String, C::Num]]],
|
9
|
+
:utxo_blacklist => C::Maybe[C::ArrayOf[[String, Integer]]],
|
10
|
+
:change_address => C::Maybe[String],
|
11
|
+
:fee_per_kb => C::Maybe[C::Num],
|
12
|
+
:spend_all => C::Maybe[C::Bool],
|
13
|
+
}) => C::Any
|
35
14
|
def initialize(options)
|
36
15
|
options = options.dup
|
37
16
|
initialize_bip32_addresses(options)
|
@@ -42,6 +21,25 @@ class Pochette::TrezorTransactionBuilder < Pochette::TransactionBuilder
|
|
42
21
|
build_transactions
|
43
22
|
end
|
44
23
|
|
24
|
+
Contract C::None => C::Maybe[({
|
25
|
+
:input_total => C::Num,
|
26
|
+
:output_total => C::Num,
|
27
|
+
:fee => C::Num,
|
28
|
+
:outputs => C::ArrayOf[[String, C::Num]],
|
29
|
+
:inputs => C::ArrayOf[[String, String, Integer, C::Num]],
|
30
|
+
:utxos_to_blacklist => C::ArrayOf[[String, Integer]],
|
31
|
+
:transactions => C::ArrayOf[Hash],
|
32
|
+
:trezor_inputs => C::ArrayOf[{
|
33
|
+
address_n: C::ArrayOf[Integer],
|
34
|
+
prev_hash: String,
|
35
|
+
prev_index: Integer
|
36
|
+
}],
|
37
|
+
:trezor_outputs => C::ArrayOf[{
|
38
|
+
script_type: String,
|
39
|
+
address: String,
|
40
|
+
amount: C::Num
|
41
|
+
}]
|
42
|
+
})]
|
45
43
|
def as_hash
|
46
44
|
return nil unless valid?
|
47
45
|
super.merge(
|
data/lib/pochette/version.rb
CHANGED
data/lib/pochette.rb
CHANGED
@@ -3,17 +3,26 @@ require "bitcoin_rpc"
|
|
3
3
|
require "active_support"
|
4
4
|
require "active_support/core_ext"
|
5
5
|
require "bitcoin"
|
6
|
+
require "contracts"
|
7
|
+
C = Contracts
|
6
8
|
|
7
9
|
module Pochette
|
10
|
+
include Contracts::Core
|
11
|
+
|
8
12
|
mattr_accessor :backend
|
9
13
|
|
14
|
+
Contract C::Bool => C::Bool
|
10
15
|
def self.testnet=(v)
|
11
|
-
@testnet = v
|
12
16
|
Bitcoin.network = v ? :testnet : :bitcoin
|
17
|
+
@testnet = v
|
13
18
|
end
|
19
|
+
|
20
|
+
Contract C::None => C::Bool
|
14
21
|
def self.testnet
|
15
|
-
@testnet
|
22
|
+
@testnet || false
|
16
23
|
end
|
24
|
+
|
25
|
+
Contract C::None => C::Bool
|
17
26
|
def self.testnet?
|
18
27
|
self.testnet
|
19
28
|
end
|
data/pochette.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency "activesupport", "~> 4.2"
|
24
24
|
spec.add_dependency "bitcoin_rpc", "~> 0.1.1"
|
25
25
|
spec.add_dependency "bitcoin-ruby", "~> 0.0.7"
|
26
|
+
spec.add_dependency "contracts"
|
26
27
|
|
27
28
|
spec.add_development_dependency "bundler", "~> 1.9"
|
28
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pochette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nubis
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -53,6 +53,20 @@ dependencies:
|
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: 0.0.7
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: contracts
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
56
70
|
- !ruby/object:Gem::Dependency
|
57
71
|
name: bundler
|
58
72
|
requirement: !ruby/object:Gem::Requirement
|