Skip to content

Commit

Permalink
♻️ Improve the code structure to merge transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
doitian committed Feb 28, 2024
1 parent 05d0ae4 commit 1353018
Showing 1 changed file with 22 additions and 12 deletions.
34 changes: 22 additions & 12 deletions src/lib/transaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,15 @@ export function importTransaction(jsonContent) {
}

export function resolvePendingSecp256k1Signatures(transaction) {
// TODO: implement
return transaction;
const lockActions = [];
const witnesses = [];

mergeLockActions(transaction, lockActions);
mergeWitnesses(transaction, witnesses);
}

export function mergeTransaction(target, from) {
// 1. Merge lockActions
for (const lockAction of from.buildingPacket.value.lock_actions) {
function mergeLockActions(target, lockActions) {
for (const lockAction of lockActions) {
// Assume that Action.script_hash must be unique
const existing = target.buildingPacket.value.lock_actions.find(
(item) => item.script_hash === lockAction.script_hash,
Expand All @@ -97,10 +99,23 @@ export function mergeTransaction(target, from) {
}
existingData.signed.push(sig);
}
existing.data = MultisigConfig.pack(existingData);
}
}
}

// 2. Merge pendingSecp256k1Signatures
function mergeWitnesses(target, witnesses) {
for (const [i, witness] of witnesses) {
if (witness !== null && witness !== undefined && witness !== "0x") {
target.buildingPacket.value.payload.witnesses[i] = witness;
}
}
}

export function mergeTransaction(target, from) {
mergeLockActions(target, from.buildingPacket.value.lock_actions);

// Merge pendingSecp256k1Signatures
for (const [args, signatures] of Object.entries(
from.pendingSecp256k1Signatures,
)) {
Expand All @@ -115,12 +130,7 @@ export function mergeTransaction(target, from) {
}
}

// 3. Merge witnesses
for (const [i, witness] of from.buildingPacket.value.payload.witnesses) {
if (witness !== null && witness !== undefined && witness !== "0x") {
target.buildingPacket.value.payload.witnesses[i] = witness;
}
}
mergeWitnesses(target, from.buildingPacket.value.payload.witnesses);

if (target.buildingPacket.value.resolved_inputs.outputs.length > 0) {
resolvePendingSecp256k1Signatures(target);
Expand Down

0 comments on commit 1353018

Please sign in to comment.