|
|
|
|
@ -16,6 +16,7 @@ from txtorcon.socks import HostUnreachableError
|
|
|
|
|
import urllib.parse as urlparse |
|
|
|
|
from urllib.parse import urlencode |
|
|
|
|
import json |
|
|
|
|
import random |
|
|
|
|
from io import BytesIO |
|
|
|
|
from pprint import pformat |
|
|
|
|
from jmbase import BytesProducer, bintohex, jmprint |
|
|
|
|
@ -903,11 +904,21 @@ class PayjoinServer(Resource):
|
|
|
|
|
self.manager.change_out.scriptPubKey))} |
|
|
|
|
|
|
|
|
|
# we now know there were one/two outputs and know which is payment. |
|
|
|
|
# bump payment output with our input: |
|
|
|
|
# set the ordering of the outputs correctly. |
|
|
|
|
if change_out: |
|
|
|
|
# indices of original payment were set in JMPayjoinManager |
|
|
|
|
# sanity check: |
|
|
|
|
if self.manager.change_out_index == 0 and \ |
|
|
|
|
self.manager.pay_out_index == 1: |
|
|
|
|
outs = [change_out, pay_out] |
|
|
|
|
elif self.manager.change_out_index == 1 and \ |
|
|
|
|
self.manager.pay_out_index == 0: |
|
|
|
|
outs = [pay_out, change_out] |
|
|
|
|
else: |
|
|
|
|
assert False, "More than 2 outputs is not supported." |
|
|
|
|
else: |
|
|
|
|
outs = [pay_out] |
|
|
|
|
# bump payment output with our input: |
|
|
|
|
our_inputs_val = sum([v["value"] for _, v in receiver_utxos.items()]) |
|
|
|
|
pay_out["value"] += our_inputs_val |
|
|
|
|
log.debug("We bumped the payment output value by: " + str( |
|
|
|
|
@ -959,12 +970,15 @@ class PayjoinServer(Resource):
|
|
|
|
|
"original-psbt-rejected") |
|
|
|
|
|
|
|
|
|
# Having checked the sender's conditions, we can apply the fee bump |
|
|
|
|
# intended (note the outputs will be shuffled next!): |
|
|
|
|
outs[1]["value"] -= our_fee_bump |
|
|
|
|
# intended: |
|
|
|
|
outs[self.manager.change_out_index]["value"] -= our_fee_bump |
|
|
|
|
|
|
|
|
|
# TODO this only works for 2 input transactions, otherwise |
|
|
|
|
# pure-shuffle will not be valid as per BIP78 ordering requirement. |
|
|
|
|
unsigned_payjoin_tx = btc.make_shuffled_tx(payjoin_tx_inputs, outs, |
|
|
|
|
# reversal [::-1] will not be valid as per BIP78 ordering requirement. |
|
|
|
|
# (For outputs, we do nothing since we aren't batching in other payments). |
|
|
|
|
if random.random() < 0.5: |
|
|
|
|
payjoin_tx_inputs = payjoin_tx_inputs[::-1] |
|
|
|
|
unsigned_payjoin_tx = btc.mktx(payjoin_tx_inputs, outs, |
|
|
|
|
version=payment_psbt.unsigned_tx.nVersion, |
|
|
|
|
locktime=payment_psbt.unsigned_tx.nLockTime) |
|
|
|
|
|
|
|
|
|
|