Added option to label multisig addresses
This commit is contained in:
parent
edc9718ff7
commit
777c8280c8
@ -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
2
css/main.min.css
vendored
File diff suppressed because one or more lines are too long
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
52
index.html
52
index.html
@ -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
@ -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();
|
||||||
|
|||||||
@ -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 => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user