fix: fingerprint is not unique per account (it is the fingerprint of the master)

This commit is contained in:
Vlad Stan 2022-08-03 08:33:06 +03:00
parent 2ae4df70ea
commit cb137e7142
4 changed files with 16 additions and 6 deletions

View file

@ -59,6 +59,7 @@ class TransactionInput(BaseModel):
branch_index: int branch_index: int
address_index: int address_index: int
masterpub_fingerprint: str masterpub_fingerprint: str
wallet: str
tx_hex: str tx_hex: str
@ -68,9 +69,11 @@ class TransactionOutput(BaseModel):
branch_index: int = None branch_index: int = None
address_index: int = None address_index: int = None
masterpub_fingerprint: str = None masterpub_fingerprint: str = None
wallet: str = None
class MasterPublicKey(BaseModel): class MasterPublicKey(BaseModel):
id: str
public_key: str public_key: str
fingerprint: str fingerprint: str

View file

@ -30,6 +30,7 @@ async function payment(path) {
psbtBase64: null, psbtBase64: null,
psbtBase64Signed: null, psbtBase64Signed: null,
signedTx: null, signedTx: null,
signedTxHex: null,
sentTxId: null, sentTxId: null,
signedTxId: null, signedTxId: null,
paymentTab: 'destination', paymentTab: 'destination',
@ -164,6 +165,7 @@ async function payment(path) {
const tx = { const tx = {
fee_rate: this.feeRate, fee_rate: this.feeRate,
masterpubs: this.accounts.map(w => ({ masterpubs: this.accounts.map(w => ({
id: w.id,
public_key: w.masterpub, public_key: w.masterpub,
fingerprint: w.fingerprint fingerprint: w.fingerprint
})) }))
@ -201,7 +203,8 @@ async function payment(path) {
address: change.address, address: change.address,
address_index: change.addressIndex, address_index: change.addressIndex,
branch_index: change.isChange ? 1 : 0, branch_index: change.isChange ? 1 : 0,
masterpub_fingerprint: walletAcount.fingerprint masterpub_fingerprint: walletAcount.fingerprint,
wallet: walletAcount.id
} }
}, },
selectChangeAddress: function (account) { selectChangeAddress: function (account) {

View file

@ -44,6 +44,7 @@ const mapUtxoToPsbtInput = utxo => ({
branch_index: utxo.isChange ? 1 : 0, branch_index: utxo.isChange ? 1 : 0,
address_index: utxo.addressIndex, address_index: utxo.addressIndex,
masterpub_fingerprint: utxo.masterpubFingerprint, masterpub_fingerprint: utxo.masterpubFingerprint,
wallet: utxo.wallet,
accountType: utxo.accountType, accountType: utxo.accountType,
txHex: '' txHex: ''
}) })

View file

@ -249,13 +249,13 @@ async def api_psbt_create(
descriptors = {} descriptors = {}
for _, masterpub in enumerate(data.masterpubs): for _, masterpub in enumerate(data.masterpubs):
descriptors[masterpub.fingerprint] = parse_key(masterpub.public_key) descriptors[masterpub.id] = parse_key(masterpub.public_key)
inputs_extra = [] inputs_extra = []
for i, inp in enumerate(data.inputs): for i, inp in enumerate(data.inputs):
bip32_derivations = {} bip32_derivations = {}
descriptor = descriptors[inp.masterpub_fingerprint][0] descriptor = descriptors[inp.wallet][0]
d = descriptor.derive(inp.address_index, inp.branch_index) d = descriptor.derive(inp.address_index, inp.branch_index)
for k in d.keys: for k in d.keys:
bip32_derivations[PublicKey.parse(k.sec())] = DerivationPath( bip32_derivations[PublicKey.parse(k.sec())] = DerivationPath(
@ -272,15 +272,15 @@ async def api_psbt_create(
psbt = PSBT(tx) psbt = PSBT(tx)
for i, inp in enumerate(inputs_extra): for i, inp in enumerate(inputs_extra):
print("### ", psbt.inputs[i].bip32_derivations)
psbt.inputs[i].bip32_derivations = inp["bip32_derivations"] psbt.inputs[i].bip32_derivations = inp["bip32_derivations"]
psbt.inputs[i].non_witness_utxo = inp.get("non_witness_utxo", None) psbt.inputs[i].non_witness_utxo = inp.get("non_witness_utxo", None)
print("### ", inp.get("non_witness_utxo", None))
outputs_extra = [] outputs_extra = []
bip32_derivations = {} bip32_derivations = {}
for i, out in enumerate(data.outputs): for i, out in enumerate(data.outputs):
if out.branch_index == 1: if out.branch_index == 1:
descriptor = descriptors[out.masterpub_fingerprint][0] descriptor = descriptors[out.wallet][0]
d = descriptor.derive(out.address_index, out.branch_index) d = descriptor.derive(out.address_index, out.branch_index)
for k in d.keys: for k in d.keys:
bip32_derivations[PublicKey.parse(k.sec())] = DerivationPath( bip32_derivations[PublicKey.parse(k.sec())] = DerivationPath(
@ -341,12 +341,15 @@ async def api_tx_broadcast(
"Cannot broadcast transaction. Mempool endpoint not defined!" "Cannot broadcast transaction. Mempool endpoint not defined!"
) )
endpoint = config.mempool_endpoint if config.network == 'Mainnet' else config.mempool_endpoint + '/testnet'
async with httpx.AsyncClient() as client: async with httpx.AsyncClient() as client:
r = await client.post(config.mempool_endpoint + "/api/tx", data=data.tx_hex) r = await client.post(endpoint + "/api/tx", data=data.tx_hex)
tx_id = r.text tx_id = r.text
print('### broadcast tx_id: ', tx_id)
return tx_id return tx_id
# return "0f0f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0.mock.transaction.id" # return "0f0f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0.mock.transaction.id"
except Exception as e: except Exception as e:
print('### broadcast error: ', str(e))
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e)) raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e))