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
address_index: int
masterpub_fingerprint: str
wallet: str
tx_hex: str
@ -68,9 +69,11 @@ class TransactionOutput(BaseModel):
branch_index: int = None
address_index: int = None
masterpub_fingerprint: str = None
wallet: str = None
class MasterPublicKey(BaseModel):
id: str
public_key: str
fingerprint: str

View file

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

View file

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

View file

@ -249,13 +249,13 @@ async def api_psbt_create(
descriptors = {}
for _, masterpub in enumerate(data.masterpubs):
descriptors[masterpub.fingerprint] = parse_key(masterpub.public_key)
descriptors[masterpub.id] = parse_key(masterpub.public_key)
inputs_extra = []
for i, inp in enumerate(data.inputs):
bip32_derivations = {}
descriptor = descriptors[inp.masterpub_fingerprint][0]
descriptor = descriptors[inp.wallet][0]
d = descriptor.derive(inp.address_index, inp.branch_index)
for k in d.keys:
bip32_derivations[PublicKey.parse(k.sec())] = DerivationPath(
@ -272,15 +272,15 @@ async def api_psbt_create(
psbt = PSBT(tx)
for i, inp in enumerate(inputs_extra):
print("### ", psbt.inputs[i].bip32_derivations)
psbt.inputs[i].bip32_derivations = inp["bip32_derivations"]
psbt.inputs[i].non_witness_utxo = inp.get("non_witness_utxo", None)
print("### ", inp.get("non_witness_utxo", None))
outputs_extra = []
bip32_derivations = {}
for i, out in enumerate(data.outputs):
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)
for k in d.keys:
bip32_derivations[PublicKey.parse(k.sec())] = DerivationPath(
@ -341,12 +341,15 @@ async def api_tx_broadcast(
"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:
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
print('### broadcast tx_id: ', tx_id)
return tx_id
# return "0f0f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0f0f0f0f00f0f0f0f0f0f0.mock.transaction.id"
except Exception as e:
print('### broadcast error: ', str(e))
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST, detail=str(e))