Added option to label multisig addresses

This commit is contained in:
sairaj mote 2022-12-21 20:49:55 +05:30
parent edc9718ff7
commit 777c8280c8
7 changed files with 68 additions and 41 deletions

View File

@ -2212,12 +2212,16 @@ sm-chip .badge {
.multisig-option { .multisig-option {
position: relative; position: relative;
padding: 1rem; padding: 1rem;
border-radius: 0.5rem;
font-size: 0.9rem; font-size: 0.9rem;
border-bottom: thin solid rgba(var(--text-color), 0.3);
} }
.multisig-option .wrap-around { .multisig-option .wrap-around {
font-weight: 500; font-weight: 500;
} }
.multisig-option__label {
font-weight: 500;
font-size: 1rem;
}
.multisig-option__balance { .multisig-option__balance {
color: rgba(var(--text-color), 0.8); color: rgba(var(--text-color), 0.8);
} }

2
css/main.min.css vendored

File diff suppressed because one or more lines are too long

View File

@ -2282,11 +2282,15 @@ sm-chip {
.multisig-option { .multisig-option {
position: relative; position: relative;
padding: 1rem; padding: 1rem;
border-radius: 0.5rem;
font-size: 0.9rem; font-size: 0.9rem;
border-bottom: thin solid rgba(var(--text-color), 0.3);
.wrap-around { .wrap-around {
font-weight: 500; font-weight: 500;
} }
&__label {
font-weight: 500;
font-size: 1rem;
}
&__balance { &__balance {
color: rgba(var(--text-color), 0.8); color: rgba(var(--text-color), 0.8);
} }

View File

@ -31,7 +31,6 @@
<script id="onLoadStartUp"> <script id="onLoadStartUp">
function onLoadStartUp() { function onLoadStartUp() {
routeTo('loading') routeTo('loading')
floDapps.setAppObjectStores({ userSettings: {} })
document.body.classList.remove('hidden') document.body.classList.remove('hidden')
floDapps.setCustomPrivKeyInput(getSignedIn) floDapps.setCustomPrivKeyInput(getSignedIn)
@ -943,10 +942,14 @@
</button> </button>
<p id="multisig_creation__warning" class="info info--warning"></p> <p id="multisig_creation__warning" class="info info--warning"></p>
<sm-form> <sm-form>
<p>Enter minimum signatures required for approval of a transaction</p> <sm-input id="multisig_label" placeholder="Label" error-text="Please add a label" animated
<sm-input id="min_sign_required" placeholder="Min required" min="2" type="number" required></sm-input>
error-text="At least 2 members are required" animate required> <div class="grid gap-0-5">
</sm-input> <p>Minimum signatures required for transaction approval</p>
<sm-input id="min_sign_required" placeholder="Min required" min="2" type="number"
error-text="At least 2 members are required" animate required>
</sm-input>
</div>
<div class="multi-state-button"> <div class="multi-state-button">
<button id="create_multisig_button" class="button button--primary" type="submit" disabled> <button id="create_multisig_button" class="button button--primary" type="submit" disabled>
Create Create
@ -2646,7 +2649,7 @@
</button> </button>
` `
}, },
multisigOption(address) { multisigOption(address, label) {
btcOperator.getBalance(address).then(balance => { btcOperator.getBalance(address).then(balance => {
const target = getRef('select_multisig_list').querySelector(`[data-address="${address}"]`); const target = getRef('select_multisig_list').querySelector(`[data-address="${address}"]`);
if (target) if (target)
@ -2654,6 +2657,7 @@
}).catch(err => notify(err, 'error')) }).catch(err => notify(err, 'error'))
return html` return html`
<li class="grid gap-0-5 align-center multisig-option" data-address=${address}> <li class="grid gap-0-5 align-center multisig-option" data-address=${address}>
<text-field class="multisig-option__label" placeholder="Label" value=${label || 'Add a label'}></text-field>
<sm-copy clip-text value=${address}></sm-copy> <sm-copy clip-text value=${address}></sm-copy>
<div class="flex align-center space-between"> <div class="flex align-center space-between">
<span class="multisig-option__balance flex align-center">Balance: <sm-spinner><sm-spinner></span> <span class="multisig-option__balance flex align-center">Balance: <sm-spinner><sm-spinner></span>
@ -2663,12 +2667,13 @@
` `
}, },
multisigAddresses() { multisigAddresses() {
messenger.multisig.listAddress().then(addresses => { Promise.all([messenger.multisig.listAddress(), compactIDB.readAllData('multisigLabels')])
const list = Object.keys(addresses).map(address => render.multisigOption(address)) .then(([addresses, labels]) => {
if (list.length) { const list = Object.keys(addresses).map(address => render.multisigOption(address, labels[address]))
renderElem(getRef('select_multisig_list'), html`${list}`) if (list.length) {
} renderElem(getRef('select_multisig_list'), html`${list}`)
}).catch(err => notify(err, 'error')) }
}).catch(err => notify(err, 'error'))
}, },
notification(id, details) { notification(id, details) {
let { floID, message, time, type } = details let { floID, message, time, type } = details
@ -3295,7 +3300,7 @@
getRef('skip_members_button').addEventListener('click', e => { getRef('skip_members_button').addEventListener('click', e => {
if (getRef('creation_popup').dataset.type === 'multisig') { if (getRef('creation_popup').dataset.type === 'multisig') {
showChildElement('creation_process', 2, { entry: slideInLeft, exit: slideOutLeft }).then(() => { showChildElement('creation_process', 2, { entry: slideInLeft, exit: slideOutLeft }).then(() => {
getRef('min_sign_required').focusIn() getRef('multisig_label').focusIn()
}) })
} else { } else {
showChildElement('creation_process', 1, { entry: slideInLeft, exit: slideOutLeft }).then(() => { showChildElement('creation_process', 1, { entry: slideInLeft, exit: slideOutLeft }).then(() => {
@ -3316,18 +3321,31 @@
selectedMembers.add(floDapps.user.id) selectedMembers.add(floDapps.user.id)
const selctedPubKeys = [...selectedMembers].map(id => floGlobals.pubKeys[id]); const selctedPubKeys = [...selectedMembers].map(id => floGlobals.pubKeys[id]);
const minRequired = parseInt(getRef('min_sign_required').value.trim()); const minRequired = parseInt(getRef('min_sign_required').value.trim());
const label = getRef('multisig_label').value.trim();
buttonLoader('create_multisig_button', true) buttonLoader('create_multisig_button', true)
messenger.multisig.createAddress(selctedPubKeys, minRequired).then(multisigAddress => { messenger.multisig.createAddress(selctedPubKeys, minRequired).then(multisigAddress => {
notify('Created multisig address', 'success'); compactIDB.writeData('multisigLabels', label, multisigAddress).then(() => {
closePopup(); notify('Created multisig address', 'success');
clearAllMembers(); closePopup();
render.multisigAddresses(); clearAllMembers();
render.multisigAddresses();
}).catch(error => notify(error, 'error'))
}).catch(error => notify(error, 'error')) }).catch(error => notify(error, 'error'))
.finally(() => { .finally(() => {
buttonLoader('create_multisig_button', false) buttonLoader('create_multisig_button', false)
}) })
}) })
getRef('select_multisig_list').addEventListener('change', e => {
const multisigAddress = e.target.closest('.multisig-option').dataset.address;
let label = e.target.value.trim();
if (label === '')
label = 'Unnamed'
compactIDB.writeData('multisigLabels', label, multisigAddress).then(() => {
notify('Updated label', 'success');
}).catch(error => notify(error, 'error'))
})
document.getElementById('create_group_button').addEventListener('click', () => { document.getElementById('create_group_button').addEventListener('click', () => {
const groupName = getRef('group_name_field').value.trim() const groupName = getRef('group_name_field').value.trim()

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
(function(EXPORTS) { //floDapps v2.3.2d (function (EXPORTS) { //floDapps v2.3.2d
/* General functions for FLO Dapps*/ /* General functions for FLO Dapps*/
'use strict'; 'use strict';
const floDapps = EXPORTS; const floDapps = EXPORTS;
@ -454,7 +454,7 @@
}) })
}); });
floDapps.launchStartUp = function() { floDapps.launchStartUp = function () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
initIndexedDB().then(log => { initIndexedDB().then(log => {
console.log(log) console.log(log)
@ -497,7 +497,7 @@
floDapps.setAppObjectStores = appObs => initIndexedDB.appObs = appObs; floDapps.setAppObjectStores = appObs => initIndexedDB.appObs = appObs;
floDapps.storeContact = function(floID, name) { floDapps.storeContact = function (floID, name) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(floID)) if (!floCrypto.validateAddr(floID))
return reject("Invalid floID!") return reject("Invalid floID!")
@ -508,7 +508,7 @@
}); });
} }
floDapps.storePubKey = function(floID, pubKey) { floDapps.storePubKey = function (floID, pubKey) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (floID in user.pubKeys) if (floID in user.pubKeys)
return resolve("pubKey already stored") return resolve("pubKey already stored")
@ -523,7 +523,7 @@
}); });
} }
floDapps.sendMessage = function(floID, message) { floDapps.sendMessage = function (floID, message) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let options = { let options = {
receiverID: floID, receiverID: floID,
@ -538,7 +538,7 @@
}) })
} }
floDapps.requestInbox = function(callback) { floDapps.requestInbox = function (callback) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let lastVC = Object.keys(user.messages).sort().pop() let lastVC = Object.keys(user.messages).sort().pop()
let options = { let options = {
@ -552,7 +552,7 @@
try { try {
if (d[v].message instanceof Object && "secret" in d[v].message) if (d[v].message instanceof Object && "secret" in d[v].message)
d[v].message = floCrypto.decryptData(d[v].message, privKey) d[v].message = floCrypto.decryptData(d[v].message, privKey)
} catch (error) {} } catch (error) { }
compactIDB.writeData("messages", d[v], v, user.db_name) compactIDB.writeData("messages", d[v], v, user.db_name)
user.messages[v] = d[v] user.messages[v] = d[v]
} }
@ -565,7 +565,7 @@
}) })
} }
floDapps.manageAppConfig = function(adminPrivKey, addList, rmList, settings) { floDapps.manageAppConfig = function (adminPrivKey, addList, rmList, settings) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!Array.isArray(addList) || !addList.length) addList = undefined; if (!Array.isArray(addList) || !addList.length) addList = undefined;
if (!Array.isArray(rmList) || !rmList.length) rmList = undefined; if (!Array.isArray(rmList) || !rmList.length) rmList = undefined;
@ -584,12 +584,12 @@
reject('Access Denied for Admin privilege') reject('Access Denied for Admin privilege')
else else
floBlockchainAPI.writeData(floID, JSON.stringify(floData), adminPrivKey) floBlockchainAPI.writeData(floID, JSON.stringify(floData), adminPrivKey)
.then(result => resolve(['Updated App Configuration', result])) .then(result => resolve(['Updated App Configuration', result]))
.catch(error => reject(error)) .catch(error => reject(error))
}) })
} }
const clearCredentials = floDapps.clearCredentials = function() { const clearCredentials = floDapps.clearCredentials = function () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
compactIDB.clearData('credentials', DEFAULT.application).then(result => { compactIDB.clearData('credentials', DEFAULT.application).then(result => {
localStorage.removeItem(`${DEFAULT.application}#privKey`); localStorage.removeItem(`${DEFAULT.application}#privKey`);
@ -599,7 +599,7 @@
}) })
} }
floDapps.deleteUserData = function(credentials = false) { floDapps.deleteUserData = function (credentials = false) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let p = [] let p = []
p.push(compactIDB.deleteDB(user.db_name)) p.push(compactIDB.deleteDB(user.db_name))
@ -611,7 +611,7 @@
}) })
} }
floDapps.deleteAppData = function() { floDapps.deleteAppData = function () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
compactIDB.deleteDB(DEFAULT.application).then(result => { compactIDB.deleteDB(DEFAULT.application).then(result => {
localStorage.removeItem(`${DEFAULT.application}#privKey`) localStorage.removeItem(`${DEFAULT.application}#privKey`)
@ -623,7 +623,7 @@
}) })
} }
floDapps.securePrivKey = function(pwd) { floDapps.securePrivKey = function (pwd) {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
let indexArr = localStorage.getItem(`${DEFAULT.application}#privKey`) let indexArr = localStorage.getItem(`${DEFAULT.application}#privKey`)
if (!indexArr) if (!indexArr)
@ -643,8 +643,8 @@
}) })
} }
floDapps.verifyPin = function(pin = null) { floDapps.verifyPin = function (pin = null) {
const readSharesFromIDB = function(indexArr) { const readSharesFromIDB = function (indexArr) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var promises = [] var promises = []
for (var i = 0; i < indexArr.length; i++) for (var i = 0; i < indexArr.length; i++)
@ -687,7 +687,7 @@
}) })
} }
const getNextGeneralData = floDapps.getNextGeneralData = function(type, vectorClock = null, options = {}) { const getNextGeneralData = floDapps.getNextGeneralData = function (type, vectorClock = null, options = {}) {
var fk = floCloudAPI.util.filterKey(type, options) var fk = floCloudAPI.util.filterKey(type, options)
vectorClock = vectorClock || getNextGeneralData[fk] || '0'; vectorClock = vectorClock || getNextGeneralData[fk] || '0';
var filteredResult = {} var filteredResult = {}
@ -716,10 +716,10 @@
let tmp = floCrypto.decryptData(data.message, key) let tmp = floCrypto.decryptData(data.message, key)
data.message = JSON.parse(tmp) data.message = JSON.parse(tmp)
break; break;
} catch (error) {} } catch (error) { }
} }
} }
} catch (error) {} } catch (error) { }
} }
} }
getNextGeneralData[fk] = Object.keys(filteredResult).sort().pop(); getNextGeneralData[fk] = Object.keys(filteredResult).sort().pop();

View File

@ -153,7 +153,8 @@
response_received: {}, response_received: {},
flodata: {}, flodata: {},
appendix: {}, appendix: {},
userSettings: {} userSettings: {},
multisigLabels: {}
} }
let user_db = `${floGlobals.application}_${floCrypto.toFloID(user.id)}`; let user_db = `${floGlobals.application}_${floCrypto.toFloID(user.id)}`;
compactIDB.initDB(user_db, obj).then(result => { compactIDB.initDB(user_db, obj).then(result => {