sibit 0.5.0 → 0.6.0
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 +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?)
|