- Fixes for blockbook API (floBlockchainAPI >=3.0.0) - Improvements to listTransactions - formatted tx details have mining details separately. Added senders and receivers details containing full list of senders and receivers. Added other tx details like confirmation, fee, block - listTransactions fn now uses options: page, pageSize
144 lines
5.1 KiB
JavaScript
144 lines
5.1 KiB
JavaScript
(function (EXPORTS) {
|
|
/*FLO Web Wallet operations*/
|
|
'use strict';
|
|
const floWebWallet = EXPORTS;
|
|
|
|
//generate a new Address triplet : resolves Object(floID,pubKey,privKey)
|
|
floWebWallet.generateNewAddr = function () {
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
var triplet = floCrypto.generateNewID();
|
|
resolve(triplet);
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
})
|
|
}
|
|
|
|
//recover triplet from given privKey : resolves Object(floID,pubKey,privKey)
|
|
floWebWallet.recoverAddr = function (privKey) {
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
var triplet = {}
|
|
triplet.privKey = privKey;
|
|
triplet.pubKey = floCrypto.getPubKeyHex(triplet.privKey);
|
|
triplet.floID = floCrypto.getFloID(triplet.pubKey);
|
|
resolve(triplet);
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
})
|
|
}
|
|
|
|
//get balance of address using API : resolves (balance)
|
|
floWebWallet.getBalance = function (address) {
|
|
return new Promise((resolve, reject) => {
|
|
floBlockchainAPI.getBalance(address)
|
|
.then(txid => resolve(txid))
|
|
.catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
//send transaction to the blockchain using API : resolves (txid)
|
|
floWebWallet.sendTransaction = function (sender, receiver, amount, floData, privKey) {
|
|
return new Promise((resolve, reject) => {
|
|
floBlockchainAPI.sendTx(sender, receiver, amount, privKey, floData)
|
|
.then(txid => resolve(txid))
|
|
.catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
function formatTx(address, tx) {
|
|
let result = {
|
|
time: tx.time,
|
|
block: tx.blockheight,
|
|
blockhash: tx.blockhash,
|
|
txid: tx.txid,
|
|
floData: tx.floData,
|
|
confirmations: tx.confirmations
|
|
}
|
|
|
|
//format receivers
|
|
let receivers = {};
|
|
for (let vout of tx.vout) {
|
|
if (vout.scriptPubKey.isAddress) {
|
|
let id = vout.scriptPubKey.addresses[0];
|
|
if (id in receivers)
|
|
receivers[id] += vout.value;
|
|
else receivers[id] = vout.value;
|
|
}
|
|
}
|
|
result.receivers = receivers;
|
|
//format senders (or mined)
|
|
if (!tx.vin[0].isAddress) { //mined (ie, coinbase)
|
|
let coinbase = tx.vin[0].coinbase;
|
|
result.mine = coinbase;
|
|
result.mined = { [coinbase]: tx.valueOut }
|
|
} else {
|
|
result.sender = tx.vin[0].addresses[0];
|
|
result.receiver = tx.vout[0].scriptPubKey.addresses[0];
|
|
result.fees = tx.fees;
|
|
let senders = {};
|
|
for (let vin of tx.vin) {
|
|
if (vin.isAddress) {
|
|
let id = vin.addresses[0];
|
|
if (id in senders)
|
|
senders[id] += vin.value;
|
|
else senders[id] = vin.value;
|
|
}
|
|
}
|
|
result.senders = senders;
|
|
|
|
//remove change amounts
|
|
for (let id in senders) {
|
|
if (id in receivers) {
|
|
if (senders[id] > receivers[id]) {
|
|
senders[id] -= receivers[id];
|
|
delete receivers[id];
|
|
} else if (senders[id] < receivers[id]) { //&& id != address
|
|
receivers[id] -= senders[id];
|
|
delete senders[id];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
floWebWallet.listTransactions = function (address, page_options = {}) {
|
|
return new Promise((resolve, reject) => {
|
|
let options = {};
|
|
if (Number.isInteger(page_options.page))
|
|
options.page = page_options.page;
|
|
if (Number.isInteger(page_options.pageSize))
|
|
options.pageSize = page_options.pageSize;
|
|
floBlockchainAPI.readTxs(address, options).then(response => {
|
|
const result = {}
|
|
result.items = response.txs.map(tx => formatTx(address, tx));
|
|
result.page = response.page;
|
|
result.totalPages = response.totalPages;
|
|
resolve(result);
|
|
}).catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
//get address-label pairs from IDB : resolves Object(floID:label)
|
|
floWebWallet.getLabels = function () {
|
|
return new Promise((resolve, reject) => {
|
|
compactIDB.readAllData('labels')
|
|
.then(IDBresult => resolve(IDBresult))
|
|
.catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
//bulk transfer tokens
|
|
floWebWallet.bulkTransferTokens = function (sender, privKey, token, receivers) {
|
|
return new Promise((resolve, reject) => {
|
|
floTokenAPI.bulkTransferTokens(sender, privKey, token, receivers)
|
|
.then(result => resolve(result))
|
|
.catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
})(window.floWebWallet = {}); |