diff --git a/index.html b/index.html
index d9afa7b..c0cac17 100644
--- a/index.html
+++ b/index.html
@@ -22,6 +22,7 @@
+
diff --git a/scripts/floTokenAPI.js b/scripts/floTokenAPI.js
new file mode 100644
index 0000000..efbd2ae
--- /dev/null
+++ b/scripts/floTokenAPI.js
@@ -0,0 +1,102 @@
+(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: floGlobals.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 = {});
\ No newline at end of file