sibit 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -4
- data/bin/sibit +13 -8
- data/lib/sibit/version.rb +1 -1
- data/lib/sibit.rb +7 -6
- data/test/test_sibit.rb +5 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bffdfd4fc0e852f5e78e27ce795d452f8d73b2e19af8b6d7f0c568a981b042b9
|
4
|
+
data.tar.gz: ab3d76f7ffa5d2773c969d74a707cc713a0a91b6f23f79827a8bb860dffd71a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcf1082248a88d3d497957e7433a20b9ebb2ac66ee75136390ff8d28aef8082e2a8bbdc8f1ef766fb17b30835e3215c35128c3146ba24ad25788b3cac0519f6f
|
7
|
+
data.tar.gz: 41a43a40203b84dc78021a671993abfd5d5e9ed2ff502cc3891d8c4040b4b8d409fcbc9e6fa17ed71c69fdc66e3a78dee92ea72d199eee1ffc6def2b0097951b
|
data/README.md
CHANGED
@@ -57,16 +57,15 @@ $ sibit balance 1CC3X2gu58d6wXUWMffpuzN9JAfTUWu4Kj
|
|
57
57
|
To send a payment from a few addresses to a new address:
|
58
58
|
|
59
59
|
```
|
60
|
-
$ sibit pay
|
60
|
+
$ sibit pay AMOUNT FEE A1:P1,A2:P2,... TARGET CHANGE
|
61
61
|
e87f138c9ebf5986151667719825c28458a28cc66f69fed4f1032a93b399fdf8
|
62
62
|
```
|
63
63
|
|
64
64
|
Here,
|
65
|
-
`KEY` is the private key,
|
66
65
|
`AMOUNT` is the amount of [satoshi](https://en.bitcoin.it/wiki/Satoshi_%28unit%29) you are sending,
|
67
66
|
`FEE` is the [miner fee](https://en.bitcoin.it/wiki/Miner_fees) you are ready to spend to make this transaction delivered
|
68
67
|
(you can say `S`, `M`, `L`, or `XL` if you want it to be calculated automatically),
|
69
|
-
`
|
68
|
+
`A1:P1,A2:P2,...` is a comma-separated list of addresses `A` and private keys `P` you are sending your coins from,
|
70
69
|
`TARGET` is the address you are sending to,
|
71
70
|
`CHANGE` is the address where the change will be sent to.
|
72
71
|
The transaction hash will be returned.
|
@@ -90,7 +89,7 @@ address = sibit.create(pkey)
|
|
90
89
|
balance = sibit.balance(address)
|
91
90
|
target = sibit.create(pkey) # where to send coins to
|
92
91
|
change = sibit.create(pkey) # where the change will sent to
|
93
|
-
tx = sibit.pay(
|
92
|
+
tx = sibit.pay(10_000_000, 'XL', { address => pkey }, target, change)
|
94
93
|
```
|
95
94
|
|
96
95
|
Should work.
|
data/bin/sibit
CHANGED
@@ -65,19 +65,24 @@ Options are:"
|
|
65
65
|
raise 'Address argument is required' if address.nil?
|
66
66
|
puts sibit.balance(address)
|
67
67
|
when 'pay'
|
68
|
-
|
69
|
-
raise 'Private key argument is required' if pvt.nil?
|
70
|
-
amount = opts.arguments[2]
|
68
|
+
amount = opts.arguments[1]
|
71
69
|
raise 'Amount argument is required' if amount.nil?
|
72
|
-
fee = opts.arguments[
|
70
|
+
fee = opts.arguments[2]
|
73
71
|
raise 'Miners fee argument is required' if fee.nil?
|
74
|
-
sources = opts.arguments[
|
72
|
+
sources = opts.arguments[3]
|
75
73
|
raise 'Addresses argument is required' if sources.nil?
|
76
|
-
target = opts.arguments[
|
74
|
+
target = opts.arguments[4]
|
77
75
|
raise 'Target argument is required' if target.nil?
|
78
|
-
change = opts.arguments[
|
76
|
+
change = opts.arguments[5]
|
79
77
|
raise 'Change argument is required' if change.nil?
|
80
|
-
puts sibit.pay(
|
78
|
+
puts sibit.pay(
|
79
|
+
amount, fee,
|
80
|
+
sources.split(',').map do |p|
|
81
|
+
address, pvt = p.split(':')
|
82
|
+
{ address: address, pvt: pvt }
|
83
|
+
end,
|
84
|
+
target, change
|
85
|
+
)
|
81
86
|
else
|
82
87
|
raise "Command #{opts.arguments[0]} is not supported"
|
83
88
|
end
|
data/lib/sibit/version.rb
CHANGED
data/lib/sibit.rb
CHANGED
@@ -83,19 +83,19 @@ class Sibit
|
|
83
83
|
# If there are more than 1000 UTXOs in the address where you are trying
|
84
84
|
# to send bitcoins from, this method won't be helpful.
|
85
85
|
#
|
86
|
-
# +pvt+: the private key as a Hash160 string
|
87
86
|
# +amount+: the amount either in satoshis or ending with 'BTC', like '0.7BTC'
|
88
87
|
# +fee+: the miners fee in satoshis (as integer) or S/M/X/XL as a string
|
89
|
-
# +sources+: the
|
88
|
+
# +sources+: the hashmap of bitcoin addresses where the coins are now, with
|
89
|
+
# their addresses as keys and private keys as values
|
90
90
|
# +target+: the target address to send to
|
91
91
|
# +change+: the address where the change has to be sent to
|
92
|
-
def pay(
|
92
|
+
def pay(amount, fee, sources, target, change)
|
93
93
|
satoshi = satoshi(amount)
|
94
94
|
builder = Bitcoin::Builder::TxBuilder.new
|
95
95
|
unspent = 0
|
96
96
|
size = 100
|
97
97
|
utxos = get_json(
|
98
|
-
"/unspent?active=#{sources.join('|')}&limit=1000"
|
98
|
+
"/unspent?active=#{sources.keys.join('|')}&limit=1000"
|
99
99
|
)['unspent_outputs']
|
100
100
|
debug("#{utxos.count} UTXOs found:")
|
101
101
|
utxos.each do |utxo|
|
@@ -104,7 +104,8 @@ class Sibit
|
|
104
104
|
i.prev_out(utxo['tx_hash_big_endian'])
|
105
105
|
i.prev_out_index(utxo['tx_output_n'])
|
106
106
|
i.prev_out_script = [utxo['script']].pack('H*')
|
107
|
-
|
107
|
+
address = Bitcoin::Script.new([utxo['script']].pack('H*')).get_address
|
108
|
+
i.signature_key(key(sources[address]))
|
108
109
|
end
|
109
110
|
size += 180
|
110
111
|
debug(" #{utxo['value']}/#{utxo['confirmations']} at #{utxo['tx_hash_big_endian']}")
|
@@ -133,7 +134,7 @@ class Sibit
|
|
133
134
|
start = Time.now
|
134
135
|
res = Net::HTTP.get_response(URI('https://blockchain.info' + uri))
|
135
136
|
raise Error, "Failed to retrieve #{uri}: #{res.code}" unless res.code == '200'
|
136
|
-
debug("GET #{uri}: #{res.code} in #{age(start)}")
|
137
|
+
debug("GET #{uri}: #{res.code}/#{res.body.length}b in #{age(start)}")
|
137
138
|
JSON.parse(res.body)
|
138
139
|
end
|
139
140
|
|
data/test/test_sibit.rb
CHANGED
@@ -55,6 +55,7 @@ class TestSibit < Minitest::Test
|
|
55
55
|
puts "address: #{address}"
|
56
56
|
assert(!address.nil?)
|
57
57
|
assert(/^1[0-9a-zA-Z]+$/.match?(address))
|
58
|
+
assert_equal(address, sibit.create(pkey))
|
58
59
|
end
|
59
60
|
|
60
61
|
def test_get_balance
|
@@ -99,9 +100,11 @@ class TestSibit < Minitest::Test
|
|
99
100
|
target = sibit.create(sibit.generate)
|
100
101
|
change = sibit.create(sibit.generate)
|
101
102
|
tx = sibit.pay(
|
102
|
-
'fd2333686f49d8647e1ce8d5ef39c304520b08f3c756b67068b30a3db217dcb2',
|
103
103
|
'0.0001BTC', 'S',
|
104
|
-
|
104
|
+
{
|
105
|
+
'1JvCsJtLmCxEk7ddZFnVkGXpr9uhxZPmJi' =>
|
106
|
+
'fd2333686f49d8647e1ce8d5ef39c304520b08f3c756b67068b30a3db217dcb2'
|
107
|
+
},
|
105
108
|
target, change
|
106
109
|
)
|
107
110
|
assert(!tx.nil?)
|