Skip to content

Commit

Permalink
Add master signing button
Browse files Browse the repository at this point in the history
  • Loading branch information
Symphonic3 committed Sep 2, 2023
1 parent a99ea96 commit aea4f72
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 25 deletions.
1 change: 1 addition & 0 deletions editor.html
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ <h2>WYSIWYG Transaction Editor (v1.0.0)</h2>
<p style="text-align:center"><select id="importtypeselector"></select><button id="importkeybtn">Import</button></p>
<div class="center" id="keysholderinner">
</div>
<p style="text-align:center"><select id="mastersighashtype"></select><button id="mastersign">Master Sign</button></p>
</div>
<main class="canvasHolder">
</main>
Expand Down
110 changes: 85 additions & 25 deletions sketch.js
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,21 @@ function setup() {
importTypeSelector.appendChild(option);
}

let mastersighashtype = document.getElementById("mastersighashtype");
mastersighashtype.addEventListener("change", () => signing = null);

for (let i = 0; i < SighashStrings.length; i++) {
let option = document.createElement("option");
option.value = SighashStrings[i];
option.text = SighashStrings[i];
mastersighashtype.appendChild(option);
}

let mastersignbtn = document.getElementById("mastersign");
new p5.Element(mastersignbtn).mouseClicked(function() {
signing = {auto: true, selhash: mastersighashtype.selectedIndex};
});

loadKeyData();

}
Expand Down Expand Up @@ -430,6 +445,8 @@ function saveKeyData() {

}

const SighashStrings = ["ALL", "NONE", "SINGLE", "ALL | ANYONECANPAY", "NONE | ANYONECANPAY", "SINGLE | ANYONECANPAY"];

function getSimpleKeyDisplay(key) {
let element = document.createElement("div");

Expand All @@ -447,11 +464,10 @@ function getSimpleKeyDisplay(key) {
let sighashselect = document.createElement("select");
sighashselect.addEventListener("change", () => signing = null);

let drp2Options = ["ALL", "NONE", "SINGLE", "ALL|ANYONECANPAY", "NONE|ANYONECANPAY", "SINGLE|ANYONECANPAY"];
for (let i = 0; i < drp2Options.length; i++) {
for (let i = 0; i < SighashStrings.length; i++) {
let option = document.createElement("option");
option.value = drp2Options[i];
option.text = drp2Options[i];
option.value = SighashStrings[i];
option.text = SighashStrings[i];
sighashselect.appendChild(option);
}

Expand Down Expand Up @@ -891,7 +907,7 @@ function draw() {

}

function signUTXO(utx, doSH) {
function signUTXO(utx, doSH, key) {
if (utx.spendertx && utx.fullData) { //TODO taproot (2)

let btx = utx.spendertx.getBitcoin();
Expand All @@ -915,8 +931,6 @@ function draw() {

let signfinal;

let key = signing.key;

let ecp = ecpair.ECPairFactory(secp256k1).fromPrivateKey(Buffer.from(key.key, "hex"), {network: selchain.bnet, compressed: key.compressed});

let keyAddp2pkh = bitcoin.payments.p2pkh({pubkey: ecp.publicKey, network: selchain.bnet}).address;
Expand Down Expand Up @@ -985,34 +999,74 @@ function draw() {

}

if (mouseClickedThisFrame && signing) {

if (hoverElement) {
function trySign(force, key) {
if (hoverElement.utxo) {

if (hoverElement.utxo) {

let utx = hoverElement.utxo;

let error = signUTXO(utx, true);

let utx = hoverElement.utxo;

let error = signUTXO(utx, force, key);

if (force) {
if (error == SigningError.WRONG_INPUT) {
alert("Key does not belong to that input.");
} else if (error == SigningError.UNSUPPORTED_TYPE) {
alert("Signing that input type is not yet supported.");
} else if (error == SigningError.NO_TX) {
alert("Failed to find connected TX for signing.");
}
}
}

} else if (hoverElement.transaction) {

let tx = hoverElement.transaction;

for (let i = 0; i < tx.inputs.length; i++) {

} else if (hoverElement.transaction) {
if (!tx.inputs[i].isSigned()) signUTXO(tx.inputs[i], false, key);

let tx = hoverElement.transaction;
}

}
}

if (mouseClickedThisFrame && signing) {

if (hoverElement) {

if (signing.key) {
trySign(true, signing.key);
} else { //auto
let simplekeys = [];

for (let i = 0; i < tx.inputs.length; i++) {
for (let i = 0; i < keys.length; i++) {
let k = keys[i];
let xkey;
if (k.mode == KeyMode.SIMPLE) {
simplekeys.push(k);
continue;
} else if (k.mode == KeyMode.HD_SEED) {
xkey = k.xkey;
} else if (k.mode == KeyMode.HD_EXTENDED_KEY) {
xkey = k;
}

if (!tx.inputs[i].isSigned()) signUTXO(tx.inputs[i], false);
let derivkey = ecbip32.BIP32Factory(secp256k1).fromPrivateKey(Buffer.from(xkey.key, "hex"), Buffer.from(xkey.chaincode, "hex"), selchain.bnet);
derivkey.__DEPTH = xkey.depth;
derivkey.__INDEX = xkey.childn;
derivkey.__PARENT_FINGERPRINT = xkey.parentfing;

for (let j = 0; j < xkey.showchildren.length; j++) {
let c = xkey.showchildren[j];
let child = (c.hardened ? derivkey.derive(c.n) : derivkey.deriveHardened(c.n));
simplekeys.push(new SimpleKey(child.privateKey.toString("hex"), true));
}

}

for (let i = 0; i < simplekeys.length; i++) {
trySign(false, simplekeys[i]);
}

}

}
Expand Down Expand Up @@ -1162,11 +1216,17 @@ function draw() {
textSize(canvasBounds.x/20);
textAlign(CENTER, TOP);

let ecp = ecpair.ECPairFactory(secp256k1).fromPrivateKey(Buffer.from(signing.key.key, "hex"), {network: selchain.bnet, compressed: signing.key.compressed});
let ident = bitcoin.crypto.hash160(ecp.publicKey);
let fingerprint = ident.toString("hex").slice(0, 8).toUpperCase();
let txt;
if (signing.key) {
let ecp = ecpair.ECPairFactory(secp256k1).fromPrivateKey(Buffer.from(signing.key.key, "hex"), {network: selchain.bnet, compressed: signing.key.compressed});
let ident = bitcoin.crypto.hash160(ecp.publicKey);
let fingerprint = ident.toString("hex").slice(0, 8).toUpperCase();
txt = "Click an input/tx to sign with key " + fingerprint;
} else {
txt = "Click an input/tx to sign (auto keys)";
}

text("Click an input/tx to sign with key " + fingerprint, canvasBounds.x/2, canvasBounds.y/40);
text(txt, canvasBounds.x/2, canvasBounds.y/40);

}

Expand Down

0 comments on commit aea4f72

Please sign in to comment.