sibit 0.30.4 → 0.30.5
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/Gemfile +1 -0
- data/Gemfile.lock +8 -3
- data/lib/sibit/key.rb +19 -5
- data/lib/sibit/script.rb +5 -4
- data/lib/sibit/version.rb +1 -1
- data/lib/sibit.rb +7 -5
- 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: db7bd01f34e395b7e917e22c31ae9682f93c90a97a9e6ce1a8a3c73c2d3464cc
|
|
4
|
+
data.tar.gz: 1b341f64ed5422e9b75846b4f56377110a1e16a6f7ec52b4c8d3fa3918f676ee
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 047c7f09a557625119eaf0e7edf3cecc9cf42309a84f8cdc3f722e5467aa96335f776a45e8bf7fd3a16b6ce476a2a8645aec40953660e54a64d5eeaa3a576146
|
|
7
|
+
data.tar.gz: 108155111044b40ad8d43f1716407128da670cbe12adb54839946b8ed86cb23b32cf1f5b9db921c464ba7cbaa413e560e0b1c960ba47811737334d30bc939a8d
|
data/Gemfile
CHANGED
|
@@ -10,6 +10,7 @@ gemspec
|
|
|
10
10
|
|
|
11
11
|
gem 'aruba', '~>2.2', require: false
|
|
12
12
|
gem 'cucumber', '~>10.0', require: false
|
|
13
|
+
gem 'donce', '~>0.2', require: false
|
|
13
14
|
gem 'logger', '~>1.7', require: false
|
|
14
15
|
gem 'minitest', '~>6.0', require: false
|
|
15
16
|
gem 'minitest-reporters', '~>1.7', require: false
|
data/Gemfile.lock
CHANGED
|
@@ -62,6 +62,10 @@ GEM
|
|
|
62
62
|
decoor (0.1.0)
|
|
63
63
|
diff-lcs (1.6.2)
|
|
64
64
|
docile (1.4.1)
|
|
65
|
+
donce (0.2.4)
|
|
66
|
+
backtrace (~> 0.3)
|
|
67
|
+
os (~> 1.1)
|
|
68
|
+
qbash (~> 0.3)
|
|
65
69
|
elapsed (0.2.1)
|
|
66
70
|
loog (~> 0.6)
|
|
67
71
|
tago (~> 0.1)
|
|
@@ -78,6 +82,7 @@ GEM
|
|
|
78
82
|
logger (~> 1.0)
|
|
79
83
|
memoist3 (1.0.0)
|
|
80
84
|
mini_mime (1.1.5)
|
|
85
|
+
mini_portile2 (2.8.9)
|
|
81
86
|
minitest (6.0.1)
|
|
82
87
|
prism (~> 1.5)
|
|
83
88
|
minitest-reporters (1.7.1)
|
|
@@ -86,9 +91,8 @@ GEM
|
|
|
86
91
|
minitest (>= 5.0)
|
|
87
92
|
ruby-progressbar
|
|
88
93
|
multi_test (1.1.0)
|
|
89
|
-
nokogiri (1.18.10
|
|
90
|
-
|
|
91
|
-
nokogiri (1.18.10-x86_64-linux-gnu)
|
|
94
|
+
nokogiri (1.18.10)
|
|
95
|
+
mini_portile2 (~> 2.8.2)
|
|
92
96
|
racc (~> 1.4)
|
|
93
97
|
openssl (3.3.2)
|
|
94
98
|
os (1.1.4)
|
|
@@ -182,6 +186,7 @@ PLATFORMS
|
|
|
182
186
|
DEPENDENCIES
|
|
183
187
|
aruba (~> 2.2)
|
|
184
188
|
cucumber (~> 10.0)
|
|
189
|
+
donce (~> 0.2)
|
|
185
190
|
logger (~> 1.7)
|
|
186
191
|
minitest (~> 6.0)
|
|
187
192
|
minitest-reporters (~> 1.7)
|
data/lib/sibit/key.rb
CHANGED
|
@@ -21,6 +21,8 @@ class Sibit
|
|
|
21
21
|
MIN_PRIV = 0x01
|
|
22
22
|
MAX_PRIV = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140
|
|
23
23
|
|
|
24
|
+
attr_reader :network
|
|
25
|
+
|
|
24
26
|
def self.generate
|
|
25
27
|
key = OpenSSL::PKey::EC.generate('secp256k1')
|
|
26
28
|
pvt = key.private_key.to_s(16).rjust(64, '0').downcase
|
|
@@ -28,9 +30,10 @@ class Sibit
|
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
def initialize(privkey)
|
|
31
|
-
@
|
|
33
|
+
@network = :mainnet
|
|
32
34
|
@compressed = true
|
|
33
|
-
@
|
|
35
|
+
@privkey = decode(privkey)
|
|
36
|
+
@key = build(@privkey)
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
def priv
|
|
@@ -44,17 +47,18 @@ class Sibit
|
|
|
44
47
|
|
|
45
48
|
def addr
|
|
46
49
|
hash = hash160(pub)
|
|
47
|
-
|
|
50
|
+
prefix = @network == :mainnet ? '00' : '6f'
|
|
51
|
+
versioned = "#{prefix}#{hash}"
|
|
48
52
|
checksum = Base58.new(versioned).check
|
|
49
53
|
Base58.new(versioned + checksum).encode
|
|
50
54
|
end
|
|
51
55
|
|
|
52
56
|
def sign(data)
|
|
53
|
-
@key.
|
|
57
|
+
@key.dsa_sign_asn1(data)
|
|
54
58
|
end
|
|
55
59
|
|
|
56
60
|
def verify(data, sig)
|
|
57
|
-
@key.
|
|
61
|
+
@key.dsa_verify_asn1(data, sig)
|
|
58
62
|
rescue OpenSSL::PKey::PKeyError
|
|
59
63
|
false
|
|
60
64
|
end
|
|
@@ -82,5 +86,15 @@ class Sibit
|
|
|
82
86
|
bytes = [hex].pack('H*')
|
|
83
87
|
Digest::RMD160.hexdigest(Digest::SHA256.digest(bytes))
|
|
84
88
|
end
|
|
89
|
+
|
|
90
|
+
def decode(key)
|
|
91
|
+
return key if key.length == 64 && key.match?(/\A[0-9a-f]+\z/i)
|
|
92
|
+
raw = Base58.new(key).decode
|
|
93
|
+
version = raw[0, 2]
|
|
94
|
+
@network = version == '80' ? :mainnet : :testnet
|
|
95
|
+
body = raw[2..-9]
|
|
96
|
+
@compressed = body.length == 66 && body.end_with?('01')
|
|
97
|
+
@compressed ? body[0, 64] : body
|
|
98
|
+
end
|
|
85
99
|
end
|
|
86
100
|
end
|
data/lib/sibit/script.rb
CHANGED
|
@@ -25,8 +25,8 @@ class Sibit
|
|
|
25
25
|
@bytes = [hex].pack('H*').bytes
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def address
|
|
29
|
-
return p2pkh_address if p2pkh?
|
|
28
|
+
def address(network = :mainnet)
|
|
29
|
+
return p2pkh_address(network) if p2pkh?
|
|
30
30
|
nil
|
|
31
31
|
end
|
|
32
32
|
|
|
@@ -46,10 +46,11 @@ class Sibit
|
|
|
46
46
|
|
|
47
47
|
private
|
|
48
48
|
|
|
49
|
-
def p2pkh_address
|
|
49
|
+
def p2pkh_address(network)
|
|
50
50
|
h = hash160
|
|
51
51
|
return nil unless h
|
|
52
|
-
|
|
52
|
+
prefix = network == :mainnet ? '00' : '6f'
|
|
53
|
+
versioned = "#{prefix}#{h}"
|
|
53
54
|
checksum = Base58.new(versioned).check
|
|
54
55
|
Base58.new(versioned + checksum).encode
|
|
55
56
|
end
|
data/lib/sibit/version.rb
CHANGED
data/lib/sibit.rb
CHANGED
|
@@ -18,7 +18,7 @@ require_relative 'sibit/version'
|
|
|
18
18
|
# Copyright:: Copyright (c) 2019-2025 Yegor Bugayenko
|
|
19
19
|
# License:: MIT
|
|
20
20
|
class Sibit
|
|
21
|
-
#
|
|
21
|
+
# Minimum fee we must pay for transaction processing:
|
|
22
22
|
MIN_SATOSHI_PER_BYTE = 0.1
|
|
23
23
|
|
|
24
24
|
# Constructor.
|
|
@@ -103,7 +103,9 @@ class Sibit
|
|
|
103
103
|
# +change+: the address where the change has to be sent to
|
|
104
104
|
def pay(amount, fee, sources, target, change, skip_utxo: [])
|
|
105
105
|
p = price('USD')
|
|
106
|
-
|
|
106
|
+
keys = sources.map { |k| Key.new(k) }
|
|
107
|
+
network = keys.first&.network || :mainnet
|
|
108
|
+
sources = keys.to_h { |k| [k.addr, k.priv] }
|
|
107
109
|
satoshi = satoshi(amount)
|
|
108
110
|
builder = TxBuilder.new
|
|
109
111
|
unspent = 0
|
|
@@ -121,7 +123,7 @@ class Sibit
|
|
|
121
123
|
i.prev_out(utxo[:hash])
|
|
122
124
|
i.prev_out_index(utxo[:index])
|
|
123
125
|
i.prev_out_script = script_hex(utxo[:script])
|
|
124
|
-
address = Script.new(script_hex(utxo[:script])).address
|
|
126
|
+
address = Script.new(script_hex(utxo[:script])).address(network)
|
|
125
127
|
k = sources[address]
|
|
126
128
|
raise Error, "UTXO arrived to #{address} is incorrect" unless k
|
|
127
129
|
i.signature_key(key(k))
|
|
@@ -155,7 +157,7 @@ class Sibit
|
|
|
155
157
|
#{tx.inputs.map { |i| " in: #{i.prev_out.unpack1('H*')}:#{i.prev_out_index}" }.join("\n ")}
|
|
156
158
|
#{tx.out.count} output#{'s' if tx.out.count > 1}:
|
|
157
159
|
#{tx.outputs.map { |o| "out: #{o.script_hex} / #{num(o.value, p)}" }.join("\n ")}
|
|
158
|
-
Min fee: #{num(MIN_SATOSHI_PER_BYTE, p)}
|
|
160
|
+
Min fee: #{num(MIN_SATOSHI_PER_BYTE, p)} /byte
|
|
159
161
|
Fee requested: #{num(f, p)} as \"#{fee}\"
|
|
160
162
|
Fee actually paid: #{num(left, p)}
|
|
161
163
|
Tx size: #{size} bytes
|
|
@@ -276,7 +278,7 @@ in block #{block} (by #{json[:provider]})")
|
|
|
276
278
|
sat = fees[fee.to_sym]
|
|
277
279
|
raise Error, "Can't understand the fee: #{fee.inspect}" if sat.nil?
|
|
278
280
|
f = mul * sat * size
|
|
279
|
-
@log.debug("Fee calculated as #{mul} * #{sat} * #{size} = #{f}")
|
|
281
|
+
@log.debug("Fee calculated as #{mul} * #{sat}s * #{size} = #{f}s")
|
|
280
282
|
f
|
|
281
283
|
end
|
|
282
284
|
|