flowallet-testnet/scripts/flo-webwallet.js
sairajzero e421d401da Moved bunkTransferTokens code to floTokenAPI
- floWebWallet.bunkTransferTokens is still available, but it invokes floTokenAPI.bunkTransferTokens where the code is moved to
2023-05-02 22:17:52 +05:30

139 lines
5.6 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 addr using API : resolves (balance)
floWebWallet.getBalance = function (addr) {
return new Promise((resolve, reject) => {
floBlockchainAPI.getBalance(addr)
.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))
})
}
//sync new transactions from blockchain using API and stores in IDB : resolves Array(newItems)
floWebWallet.syncTransactions = function (addr) {
return new Promise((resolve, reject) => {
compactIDB.readData('lastSync', addr).then(lastSync => {
lastSync = lastSync | 0;
getNewTxs(addr, lastSync).then(APIresult => {
compactIDB.readData('transactions', addr).then(IDBresult => {
if (IDBresult === undefined)
var promise1 = compactIDB.addData('transactions', APIresult.items, addr)
else
var promise1 = compactIDB.writeData('transactions', IDBresult.concat(APIresult.items), addr)
var promise2 = compactIDB.writeData('lastSync', APIresult.totalItems, addr)
Promise.all([promise1, promise2]).then(values => resolve(APIresult.items))
})
})
}).catch(error => reject(error))
})
}
//Get new Tx in blockchain since last sync using API
async function getNewTxs(addr, ignoreOld) {
try {
const { totalItems } = await floBlockchainAPI.readTxs(addr, 0, 1);
const newItems = totalItems - ignoreOld;
if (newItems > 0) {
const { items: newTxs } = await floBlockchainAPI.readTxs(addr, 0, newItems * 2);
const filteredData = []
newTxs
.slice(0, newItems)
.forEach(({ time, txid, floData, isCoinBase, vin, vout }) => {
const sender = isCoinBase ? `(mined)${vin[0].coinbase}` : vin[0].addr;
const receiver = isCoinBase ? addr : vout[0].scriptPubKey.addresses[0];
filteredData.unshift({ time, txid, floData, sender, receiver });
})
return { totalItems, items: filteredData };
} else {
return { totalItems, items: [] };
}
} catch (error) {
throw new Error(`Failed to get new transactions for ${addr}: ${error.message}`);
}
}
//read transactions stored in IDB : resolves Array(storedItems)
floWebWallet.readTransactions = function (addr) {
return new Promise((resolve, reject) => {
compactIDB.readData('transactions', addr)
.then(IDBresult => resolve(IDBresult))
.catch(error => reject(error))
})
}
//get address-label pairs from IDB : resolves Object(addr:label)
floWebWallet.getLabels = function () {
return new Promise((resolve, reject) => {
compactIDB.readAllData('labels')
.then(IDBresult => resolve(IDBresult))
.catch(error => reject(error))
})
}
function sendRawTransaction(receiver, utxo, vout, scriptPubKey, data, wif) {
var trx = bitjs.transaction();
trx.addinput(utxo, vout, scriptPubKey)
trx.addoutput(receiver, floBlockchainAPI.sendAmt);
trx.addflodata(data);
var signedTxHash = trx.sign(wif, 1);
return floBlockchainAPI.broadcastTx(signedTxHash);
}
function sendTokens_raw(privKey, receiverID, token, amount, utxo, vout, scriptPubKey) {
return new Promise((resolve, reject) => {
sendRawTransaction(receiverID, utxo, vout, scriptPubKey, `send ${amount} ${token}#`, privKey)
.then(txid => resolve([receiverID, txid]))
.catch(error => reject([receiverID, error]))
})
}
//bulk transfer tokens
floWebWallet.bunkTransferTokens = function (sender, privKey, token, receivers) {
return new Promise((resolve, reject) => {
floTokenAPI.bunkTransferTokens(sender, privKey, token, receivers)
.then(result => resolve(result))
.catch(error => reject(error))
})
}
})(window.floWebWallet = {});