Skip to content
This repository was archived by the owner on May 16, 2019. It is now read-only.

Commit 922cc80

Browse files
committed
Fix payout signing
1 parent 567850b commit 922cc80

File tree

1 file changed

+23
-25
lines changed

1 file changed

+23
-25
lines changed

market/network.py

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from keys.keychain import KeyChain
2323
from log import Logger
2424
from market.contracts import Contract
25-
from market.moderation import process_dispute
25+
from market.moderation import process_dispute, close_dispute
2626
from market.profile import Profile
2727
from market.protocol import MarketProtocol
2828
from market.transactions import BitcoinTransaction
@@ -559,6 +559,11 @@ def parse_messages(messages):
559559
self.db, self.protocol.get_message_listener(),
560560
self.protocol.get_notification_listener(),
561561
self.protocol.multiplexer.testnet)
562+
elif p.type == objects.PlaintextMessage.Type.Value("DISPUTE_CLOSE"):
563+
close_dispute(json.loads(p.message, object_pairs_hook=OrderedDict),
564+
self.db, self.protocol.get_message_listener(),
565+
self.protocol.get_notification_listener(),
566+
self.protocol.multiplexer.testnet)
562567
else:
563568
listener.notify(p, signature)
564569
except Exception:
@@ -904,48 +909,41 @@ def release_funds(self, order_id):
904909
vendor_address = contract["vendor_order_confirmation"]["invoice"]["payout"]["address"]
905910
buyer_address = contract["buyer_order"]["order"]["refund_address"]
906911

907-
for moderator in contract["vendor_offer"]["listing"]["moderators"]:
908-
if moderator["guid"] == contract["buyer_order"]["order"]["moderator"]:
909-
masterkey_m = moderator["pubkeys"]["bitcoin"]["key"]
910-
911912
outputs = []
912913

913-
outputs.append({'value': contract["dispute_resolution"]["resolution"]["moderator_fee"],
914+
outputs.append({'value': int(contract["dispute_resolution"]["resolution"]["moderator_fee"]),
914915
'address': contract["dispute_resolution"]["resolution"]["moderator_address"]})
915916

916917
if "buyer_payout" in contract["dispute_resolution"]["resolution"]:
917-
outputs.append({'value': contract["dispute_resolution"]["resolution"]["buyer_payout"],
918+
outputs.append({'value': int(contract["dispute_resolution"]["resolution"]["buyer_payout"]),
918919
'address': buyer_address})
919920

920921
if "vendor_payout" in contract["dispute_resolution"]["resolution"]:
921-
outputs.append({'value': contract["dispute_resolution"]["resolution"]["vendor_payout"],
922+
outputs.append({'value': int(contract["dispute_resolution"]["resolution"]["vendor_payout"]),
922923
'address': vendor_address})
923924

924-
tx = bitcointools.mktx(outpoints, outputs)
925-
signatures = []
925+
tx = BitcoinTransaction.make_unsigned(outpoints, outputs)
926926
chaincode = contract["buyer_order"]["order"]["payment"]["chaincode"]
927927
redeem_script = str(contract["buyer_order"]["order"]["payment"]["redeem_script"])
928928
masterkey = bitcointools.bip32_extract_key(KeyChain(self.db).bitcoin_master_privkey)
929929
childkey = derive_childkey(masterkey, chaincode, bitcointools.MAINNET_PRIVATE)
930930

931-
mod_key = derive_childkey(masterkey_m, chaincode)
931+
own_sig = tx.create_signature(childkey, redeem_script)
932932

933-
valid_inputs = 0
933+
signatures = []
934934
for index in range(0, len(outpoints)):
935-
sig = bitcointools.multisign(tx, index, redeem_script, childkey)
936-
signatures.append({"input_index": index, "signature": sig})
935+
sig_ob = {"index": index, "signatures": []}
936+
for s in own_sig:
937+
if int(s["index"]) == index:
938+
sig_ob["signatures"].append(s["signature"])
937939
for s in contract["dispute_resolution"]["resolution"]["tx_signatures"]:
938-
if s["input_index"] == index:
939-
if bitcointools.verify_tx_input(tx, index, redeem_script, s["signature"], mod_key):
940-
tx = bitcointools.apply_multisignatures(tx, index, str(redeem_script),
941-
sig, str(s["signature"]))
942-
valid_inputs += 1
943-
944-
if valid_inputs == len(outpoints):
945-
self.log.info("Broadcasting payout tx %s to network" % bitcointools.txhash(tx))
946-
self.protocol.multiplexer.blockchain.broadcast(tx)
947-
else:
948-
raise Exception("Failed to reconstruct transaction with moderator signature.")
940+
if int(s["index"]) == index:
941+
sig_ob["signatures"].append(s["signature"])
942+
signatures.append(sig_ob)
943+
944+
tx.multisign(signatures, redeem_script)
945+
tx.broadcast(self.protocol.multiplexer.blockchain)
946+
self.log.info("Broadcasting payout tx %s to network" % tx.get_hash())
949947

950948
def get_ratings(self, node_to_ask, listing_hash=None):
951949
"""

0 commit comments

Comments
 (0)