sibit 0.11.0 → 0.12.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/.rubocop.yml +1 -1
- data/README.md +9 -2
- data/lib/sibit/version.rb +1 -1
- data/lib/sibit.rb +32 -1
- data/test/test_sibit.rb +4 -1
- 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: 8fa2a41b4b9d7893fac773a90d7a9fcb3866339aa616b7a8e291d53bed50618f
|
|
4
|
+
data.tar.gz: d4f81c3c74df3927c5fec8dce9c7218cbf0a76d8cf6d1094ea2474aadd7e4525
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4ebf4d8cf70cef85a6d9d914cdec60cfa5c0164b8e7070f37e245d7b92267cf4fd6d1dd59ba6ff843c309861cbe5df2c19ec31af4a06874ad9e7b6a1191b371b
|
|
7
|
+
data.tar.gz: 6a9c5fca263fbec6b2aa61075c33314de00a0b22397d04662e135be46fbd556b699f21e3a4d856d43b9fcadb31eb306cb20134900125e91a3e0d9371fd1c676e
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<img src="/logo.png" width="64px"/>
|
|
2
2
|
|
|
3
|
-
[](https://www.elegantobjects.org)
|
|
4
4
|
[](https://www.0crat.com/p/C3RFVLU72)
|
|
5
5
|
[](http://www.rultor.com/p/yegor256/sibit)
|
|
6
|
-
[](https://www.jetbrains.com/ruby/)
|
|
7
7
|
|
|
8
8
|
[](https://travis-ci.org/yegor256/sibit)
|
|
9
9
|
[](https://ci.appveyor.com/project/yegor256/sibit)
|
|
@@ -79,6 +79,13 @@ The transaction hash will be returned.
|
|
|
79
79
|
Not all [UTXOs](https://en.wikipedia.org/wiki/Unspent_transaction_output)
|
|
80
80
|
will be used, but only the necessary amount of them.
|
|
81
81
|
|
|
82
|
+
By default, the fee will be paid on top of the payment amount you are sending.
|
|
83
|
+
Say, you are sending 0.5 BTC and the fee is 0.0001 BTC. Totally, you will
|
|
84
|
+
spend 0.5001. However, you can make Sibit deduct the fee from the payment
|
|
85
|
+
amount. In this case you should provide a negative amount of the fee
|
|
86
|
+
or one of `-S`, `-M`, `-L`, `-XL`. You can also say `+S`, if you want the
|
|
87
|
+
opposite, which is the default.
|
|
88
|
+
|
|
82
89
|
It is recommended to run it with `--dry --verbose` options first, to see
|
|
83
90
|
what's going to be sent to the network. If everything looks correct, remove
|
|
84
91
|
the `--dry` and run again, the transaction will be pushed to the network.
|
data/lib/sibit/version.rb
CHANGED
data/lib/sibit.rb
CHANGED
|
@@ -161,6 +161,8 @@ class Sibit
|
|
|
161
161
|
def pay(amount, fee, sources, target, change)
|
|
162
162
|
p = price
|
|
163
163
|
satoshi = satoshi(amount)
|
|
164
|
+
f = mfee(fee, size_of(amount, sources))
|
|
165
|
+
satoshi -= f if f.negative?
|
|
164
166
|
builder = Bitcoin::Builder::TxBuilder.new
|
|
165
167
|
unspent = 0
|
|
166
168
|
size = 100
|
|
@@ -259,9 +261,14 @@ class Sibit
|
|
|
259
261
|
def mfee(fee, size)
|
|
260
262
|
return fee.to_i if fee.is_a?(Integer)
|
|
261
263
|
raise Error, 'Fee should either be a String or Integer' unless fee.is_a?(String)
|
|
264
|
+
mul = 1
|
|
265
|
+
if fee.start_with?('+', '-')
|
|
266
|
+
mul = -1 if fee.start_with?('-')
|
|
267
|
+
fee = fee[1..-1]
|
|
268
|
+
end
|
|
262
269
|
sat = fees[fee.to_sym]
|
|
263
270
|
raise Error, "Can't understand the fee: #{fee.inspect}" if sat.nil?
|
|
264
|
-
sat * size
|
|
271
|
+
mul * sat * size
|
|
265
272
|
end
|
|
266
273
|
|
|
267
274
|
# Make key from private key string in Hash160.
|
|
@@ -296,6 +303,30 @@ class Sibit
|
|
|
296
303
|
end
|
|
297
304
|
end
|
|
298
305
|
|
|
306
|
+
# Calculate an approximate size of the transaction.
|
|
307
|
+
def size_of(amount, sources)
|
|
308
|
+
satoshi = satoshi(amount)
|
|
309
|
+
builder = Bitcoin::Builder::TxBuilder.new
|
|
310
|
+
unspent = 0
|
|
311
|
+
size = 100
|
|
312
|
+
utxos = get_json(
|
|
313
|
+
"/unspent?active=#{sources.keys.join('|')}&limit=1000"
|
|
314
|
+
)['unspent_outputs']
|
|
315
|
+
utxos.each do |utxo|
|
|
316
|
+
unspent += utxo['value']
|
|
317
|
+
builder.input do |i|
|
|
318
|
+
i.prev_out(utxo['tx_hash_big_endian'])
|
|
319
|
+
i.prev_out_index(utxo['tx_output_n'])
|
|
320
|
+
i.prev_out_script = [utxo['script']].pack('H*')
|
|
321
|
+
address = Bitcoin::Script.new([utxo['script']].pack('H*')).get_address
|
|
322
|
+
i.signature_key(key(sources[address]))
|
|
323
|
+
end
|
|
324
|
+
size += 180
|
|
325
|
+
break if unspent > satoshi
|
|
326
|
+
end
|
|
327
|
+
size
|
|
328
|
+
end
|
|
329
|
+
|
|
299
330
|
def info(msg)
|
|
300
331
|
if @log.respond_to?(:info)
|
|
301
332
|
@log.info(msg)
|
data/test/test_sibit.rb
CHANGED
|
@@ -129,6 +129,9 @@ class TestSibit < Minitest::Test
|
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
def test_fail_if_not_enough_funds
|
|
132
|
+
stub_request(
|
|
133
|
+
:get, 'https://bitcoinfees.earn.com/api/v1/fees/recommended'
|
|
134
|
+
).to_return(body: '{"fastestFee":300,"halfHourFee":200,"hourFee":180}')
|
|
132
135
|
stub_request(
|
|
133
136
|
:get, 'https://blockchain.info/ticker'
|
|
134
137
|
).to_return(body: '{"USD" : {"15m" : 5160.04}}')
|
|
@@ -144,7 +147,7 @@ class TestSibit < Minitest::Test
|
|
|
144
147
|
change = sibit.create(sibit.generate)
|
|
145
148
|
assert_raises Sibit::Error do
|
|
146
149
|
sibit.pay(
|
|
147
|
-
'0.0001BTC', 'XL',
|
|
150
|
+
'0.0001BTC', '-XL',
|
|
148
151
|
{
|
|
149
152
|
'1JvCsJtLmCxEk7ddZFnVkGXpr9uhxZPmJi' =>
|
|
150
153
|
'fd2333686f49d8647e1ce8d5ef39c304520b08f3c756b67068b30a3db217dcb2'
|