Update messenger.js
- Added: Create, fetch and list for multisig address
This commit is contained in:
parent
285136b1e9
commit
98f1ba2f70
@ -867,4 +867,98 @@
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
messenger.loadDataFromBlockchain = function() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let user_floID = floCrypto.toFloID(user.id);
|
||||||
|
if (!user_floID)
|
||||||
|
return reject("Not an valid address");
|
||||||
|
let last_key = `${floGlobals.application}|${user_floID}`;
|
||||||
|
compactIDB.readData("lastTx", last_key, floDapps.root).then(lastTx => {
|
||||||
|
floBlockchainAPI.readData(user_floID, {
|
||||||
|
ignoreOld: lastTx,
|
||||||
|
pattern: floGlobals.application,
|
||||||
|
tx: true //need tx-time and txid for key construction
|
||||||
|
}).then(result => {
|
||||||
|
for (var i = result.data.length - 1; i >= 0; i--) {
|
||||||
|
let tx = result.data[i],
|
||||||
|
content = JSON.parse(tx.data)[floGlobals.application];
|
||||||
|
if (!(content instanceof Object))
|
||||||
|
continue;
|
||||||
|
let key = (content.type ? content.type + "|" : "") + tx.txid.substr(0, 16);
|
||||||
|
compactIDB.writeData("flodata", {
|
||||||
|
time: tx.time,
|
||||||
|
txid: tx.txid,
|
||||||
|
data: content
|
||||||
|
}, key);
|
||||||
|
}
|
||||||
|
compactIDB.writeData("lastTx", result.totalTxs, last_key, floDapps.root);
|
||||||
|
resolve(true);
|
||||||
|
}).catch(error => reject(error))
|
||||||
|
}).catch(error => reject(error))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//BTC multisig application
|
||||||
|
const TYPE_BTC_MULTISIG = "btc_multisig";
|
||||||
|
messenger.createMultisig = function(pubKeys, minRequired) {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
let receivers = pubKeys.map(p => floCrypto.getFloID(p));
|
||||||
|
if (receivers.includes(null))
|
||||||
|
return reject("Invalid public key: " + pubKeys[receivers.indexOf(null)]);
|
||||||
|
let privateKey = await floDapps.user.private;
|
||||||
|
let multisig = btcOperator.multiSigAddress(pubKeys, minRequired) //TODO: change to correct function
|
||||||
|
if (typeof multisig !== 'object')
|
||||||
|
return reject("Unable to create multisig address");
|
||||||
|
let content = {
|
||||||
|
type: TYPE_BTC_MULTISIG,
|
||||||
|
address: multisig.address, //TODO: maybe encrypt the address
|
||||||
|
redeemScript: multisig.redeemScript
|
||||||
|
};
|
||||||
|
floBlockchainAPI.writeDataMultiple([privateKey], JSON.stringify({
|
||||||
|
[floGlobals.application]: content
|
||||||
|
}), receivers).then(txid => {
|
||||||
|
console.info(txid);
|
||||||
|
let key = TYPE_BTC_MULTISIG + "|" + tx.txid.substr(0, 16);
|
||||||
|
compactIDB.writeData("flodata", {
|
||||||
|
time: null, //time will be overwritten when confirmed on blockchain
|
||||||
|
txid: txid,
|
||||||
|
data: content
|
||||||
|
}, key);
|
||||||
|
resolve(multisig_addr);
|
||||||
|
}).catch(error => reject(error))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
messenger.listMultisig = function() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let options = {
|
||||||
|
lowerKey: `${TYPE_BTC_MULTISIG}|`,
|
||||||
|
upperKey: `${TYPE_BTC_MULTISIG}||`
|
||||||
|
}
|
||||||
|
compactIDB.searchData("flodata", options).then(result => {
|
||||||
|
let multsigs = {};
|
||||||
|
for (let i in result) {
|
||||||
|
let addr = result[i].address;
|
||||||
|
let decode = coinjs.script().decodeRedeemScript(result[i].redeemScript);
|
||||||
|
if (!decode || decode.address !== addr)
|
||||||
|
console.warn("Invalid redeem-script:", addr);
|
||||||
|
else if (decode.type !== "multisig__")
|
||||||
|
console.warn("Redeem-script is not of a multisig:", addr);
|
||||||
|
else if (!decode.pubKeys.includes(user.public))
|
||||||
|
console.warn("User is not a part of this multisig:", addr);
|
||||||
|
else if (decode.pubKeys.length < decode.signaturesRequired)
|
||||||
|
console.warn("Invalid multisig (required is greater than users):", addr);
|
||||||
|
else
|
||||||
|
multsigs[addr] = {
|
||||||
|
redeemScript: decode.redeemScript,
|
||||||
|
pubKeys: decode.pubKeys,
|
||||||
|
minRequired: decode.signaturesRequired
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve(multsigs);
|
||||||
|
}).catch(error => reject(error))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
})();
|
})();
|
||||||
Loading…
Reference in New Issue
Block a user