- Changes console.log and console.debug to relevant types - PASSWORD and I environment variables are now passed as arguments to npm commands - Added optional argument `--debug`. when passed, console.debug is also logged, else console.debug are turned off
102 lines
3.9 KiB
JavaScript
102 lines
3.9 KiB
JavaScript
(function(EXPORTS) { //floTokenAPI v1.0.3c
|
|
/* Token Operator to send/receive tokens via blockchain using API calls*/
|
|
'use strict';
|
|
const tokenAPI = EXPORTS;
|
|
|
|
const DEFAULT = {
|
|
apiURL: floGlobals.tokenURL || "https://ranchimallflo.duckdns.org/",
|
|
currency: "rupee"
|
|
}
|
|
|
|
Object.defineProperties(tokenAPI, {
|
|
URL: {
|
|
get: () => DEFAULT.apiURL
|
|
},
|
|
currency: {
|
|
get: () => DEFAULT.currency,
|
|
set: currency => DEFAULT.currency = currency
|
|
}
|
|
});
|
|
|
|
if (floGlobals.currency) tokenAPI.currency = floGlobals.currency;
|
|
|
|
Object.defineProperties(floGlobals, {
|
|
currency: {
|
|
get: () => DEFAULT.currency,
|
|
set: currency => DEFAULT.currency = currency
|
|
}
|
|
});
|
|
|
|
const fetch_api = tokenAPI.fetch = function(apicall) {
|
|
return new Promise((resolve, reject) => {
|
|
console.debug(DEFAULT.apiURL + apicall);
|
|
fetch(DEFAULT.apiURL + apicall).then(response => {
|
|
if (response.ok)
|
|
response.json().then(data => resolve(data));
|
|
else
|
|
reject(response)
|
|
}).catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
const getBalance = tokenAPI.getBalance = function(floID, token = DEFAULT.currency) {
|
|
return new Promise((resolve, reject) => {
|
|
fetch_api(`api/v1.0/getFloAddressBalance?token=${token}&floAddress=${floID}`)
|
|
.then(result => resolve(result.balance || 0))
|
|
.catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
tokenAPI.getTx = function(txID) {
|
|
return new Promise((resolve, reject) => {
|
|
fetch_api(`api/v1.0/getTransactionDetails/${txID}`).then(res => {
|
|
if (res.result === "error")
|
|
reject(res.description);
|
|
else if (!res.parsedFloData)
|
|
reject("Data piece (parsedFloData) missing");
|
|
else if (!res.transactionDetails)
|
|
reject("Data piece (transactionDetails) missing");
|
|
else
|
|
resolve(res);
|
|
}).catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
tokenAPI.sendToken = function(privKey, amount, receiverID, message = "", token = DEFAULT.currency, options = {}) {
|
|
return new Promise((resolve, reject) => {
|
|
let senderID = floCrypto.getFloID(privKey);
|
|
if (typeof amount !== "number" || isNaN(amount) || amount <= 0)
|
|
return reject("Invalid amount");
|
|
getBalance(senderID, token).then(bal => {
|
|
if (amount > bal)
|
|
return reject(`Insufficient ${token}# balance`);
|
|
floBlockchainAPI.writeData(senderID, `send ${amount} ${token}# ${message}`, privKey, receiverID, options)
|
|
.then(txid => resolve(txid))
|
|
.catch(error => reject(error))
|
|
}).catch(error => reject(error))
|
|
});
|
|
}
|
|
|
|
tokenAPI.getAllTxs = function(floID, token = DEFAULT.currency) {
|
|
return new Promise((resolve, reject) => {
|
|
fetch_api(`api/v1.0/getFloAddressTransactions?token=${token}&floAddress=${floID}`)
|
|
.then(result => resolve(result))
|
|
.catch(error => reject(error))
|
|
})
|
|
}
|
|
|
|
const util = tokenAPI.util = {};
|
|
|
|
util.parseTxData = function(txData) {
|
|
let parsedData = {};
|
|
for (let p in txData.parsedFloData)
|
|
parsedData[p] = txData.parsedFloData[p];
|
|
parsedData.sender = txData.transactionDetails.vin[0].addr;
|
|
for (let vout of txData.transactionDetails.vout)
|
|
if (vout.scriptPubKey.addresses[0] !== parsedData.sender)
|
|
parsedData.receiver = vout.scriptPubKey.addresses[0];
|
|
parsedData.time = txData.transactionDetails.time;
|
|
return parsedData;
|
|
}
|
|
|
|
})('object' === typeof module ? module.exports : window.floTokenAPI = {}); |