onchain 1.4.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e400fdca7f552c5ffb962ac42282e9b7bf65874c
4
- data.tar.gz: 36ff64450f51c01f276f8364ca25b75743dbe35e
3
+ metadata.gz: 0e2d4ee4a149d7de0252138466227fdcb5c22465
4
+ data.tar.gz: 348d78dd77c7b11b3b76846f431a4e31c060c8c9
5
5
  SHA512:
6
- metadata.gz: fe0905bdfb048d425fb1216b2c008704dc2000bfead2e228be7777e560a91b841c2b8e37b3de888dc2852f842c40f48ff6d8eb2c9e91876f394715d52238f553
7
- data.tar.gz: 9f4f5fa17a7b4c2bd7c57bb65f13215f9c184fb92987a26ee9c8908f038a5c7ba953004205adfd0f59f812711c52535bb1dbd2c12633554699651634a812f5e4
6
+ metadata.gz: 7f152a7df7fef3b11eaac8632aa497779f3be1f26d831dc65b87010bf0b79a82b40b04e5e82a52796d1d73c215dce50555edfd60a59501c93e8cb44f272cd630
7
+ data.tar.gz: c3c187a0e9fa71dd55d6811d3772cdb3081ef58707d4a757c394454c7a7df0ce2b1923d9e4c63b337e7fda48c02903d6318fcd19abfdc5e76b64343a7179f780
@@ -0,0 +1,121 @@
1
+ class OnChain::Transaction
2
+ class << self
3
+
4
+ # Given a send address and an amount produce a transaction
5
+ # and a list of hashes that need to be signed.
6
+ #
7
+ # The transaction will be in hex format.
8
+ #
9
+ # The list of hashes that need to be signed will be in this format
10
+ #
11
+ # [input index]{public_key => { :hash => hash} }
12
+ #
13
+ # i.e.
14
+ #
15
+ # [0][034000....][:hash => '345435345...']
16
+ # [0][02fee.....][:hash => '122133445....']
17
+ #
18
+ def create_transaction(redemption_scripts, address, amount_in_satoshi, miners_fee)
19
+
20
+ tx = Bitcoin::Protocol::Tx.new
21
+
22
+ total_amount = miners_fee
23
+
24
+ total_amount = total_amount + amount_in_satoshi
25
+
26
+ addresses = redemption_scripts.map { |rs|
27
+ OnChain::Sweeper.generate_address_of_redemption_script(rs)
28
+ }
29
+
30
+ unspents, indexes, change = OnChain::BlockChain.get_unspent_for_amount(addresses, total_amount)
31
+
32
+ # OK, let's build a transaction.
33
+ tx = Bitcoin::Protocol::Tx.new
34
+
35
+ # Process the unpsent outs.
36
+ unspents.each_with_index do |spent, index|
37
+
38
+ script = redemption_scripts[indexes[index]]
39
+
40
+ txin = Bitcoin::Protocol::TxIn.new([ spent[0] ].pack('H*').reverse, spent[1])
41
+ txin.script_sig = OnChain::hex_to_bin(script)
42
+ tx.add_in(txin)
43
+ end
44
+
45
+ # Do we have enough in the fund.
46
+ #if(total_amount > btc_balance)
47
+ # raise 'Balance is not enough to cover payment'
48
+ #end
49
+
50
+ txout = Bitcoin::Protocol::TxOut.new(amount_in_satoshi,
51
+ Bitcoin::Script.to_address_script(address))
52
+
53
+ tx.add_out(txout)
54
+
55
+ change_address = addresses[0]
56
+
57
+ # Send the change back.
58
+ if change > 0
59
+
60
+ txout = Bitcoin::Protocol::TxOut.new(change,
61
+ Bitcoin::Script.to_address_script(change_address))
62
+
63
+ tx.add_out(txout)
64
+ end
65
+
66
+ inputs_to_sign = []
67
+ tx.in.each_with_index do |txin, index|
68
+ hash = tx.signature_hash_for_input(index, txin.script, 1)
69
+
70
+ rsscript = Bitcoin::Script.new txin.script
71
+ rsscript.get_multisig_pubkeys.each do |key|
72
+
73
+ if inputs_to_sign[index] == nil
74
+ inputs_to_sign[index] = {}
75
+ end
76
+ inputs_to_sign[index][OnChain.bin_to_hex(key)] = {:hash => OnChain::bin_to_hex(hash)}
77
+ end
78
+ end
79
+
80
+ return OnChain::bin_to_hex(tx.to_payload), inputs_to_sign
81
+ end
82
+
83
+ # Given a transaction in hex string format, apply
84
+ # the given signature list to it.
85
+ #
86
+ # Signatures should be in the format
87
+ #
88
+ # [0]{034000.....' => {:hash => '345435345....', :sig => '435fgdf4553...'}}
89
+ # [0]{02fee.....' => {:hash => '122133445....', :sig => '435fgdf4553...'}}
90
+ #
91
+ def sign_transaction(transaction_hex, sig_list)
92
+
93
+ tx = Bitcoin::Protocol::Tx.new OnChain::hex_to_bin(transaction_hex)
94
+
95
+ tx.in.each_with_index do |txin, index|
96
+
97
+ hash = OnChain.bin_to_hex(tx.signature_hash_for_input(index, txin.script, 1))
98
+
99
+ sigs = []
100
+
101
+ rscript = Bitcoin::Script.new txin.script
102
+ rscript.get_multisig_pubkeys.each do |key|
103
+
104
+ hkey = OnChain.bin_to_hex(key)
105
+ if sig_list[index][hkey] != nil and sig_list[index][hkey][:sig] != nil
106
+
107
+ # Add the signature to the list.
108
+ sigs << OnChain.hex_to_bin(sig_list[index][hkey][:sig])
109
+
110
+ end
111
+ end
112
+
113
+ if sigs.count > 0
114
+ txin.script = Bitcoin::Script.to_p2sh_multisig_script_sig(rscript.to_payload, sigs)
115
+ end
116
+ end
117
+
118
+ return OnChain::bin_to_hex(tx.to_payload)
119
+ end
120
+ end
121
+ end
data/lib/onchain.rb CHANGED
@@ -4,5 +4,6 @@ require 'onchain/providers/blockr_api.rb'
4
4
  require 'onchain/providers/chaincom_api.rb'
5
5
  require 'onchain/sweeper.rb'
6
6
  require 'onchain/payments.rb'
7
+ require 'onchain/transaction.rb'
7
8
  require 'money-tree'
8
9
  require 'bitcoin'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onchain
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Purton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-13 00:00:00.000000000 Z
11
+ date: 2014-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -108,6 +108,7 @@ files:
108
108
  - lib/onchain/providers/blockr_api.rb
109
109
  - lib/onchain/providers/chaincom_api.rb
110
110
  - lib/onchain/sweeper.rb
111
+ - lib/onchain/transaction.rb
111
112
  homepage: https://github.com/onchain/onchain-gem
112
113
  licenses: []
113
114
  metadata: {}