Compare commits

..

149 Commits

Author SHA1 Message Date
3459646293
Update index.html
Some checks failed
Workflow push to Dappbundle / Build (push) Has been cancelled
2025-09-01 07:13:53 +05:30
7e58ee6598
Solved FLO Balance display 2025-07-28 18:37:29 +05:30
b39cd588bb
Update floBlockchainAPI.js 2025-07-28 13:48:14 +05:30
f120698bc2
Update floBlockchainAPI.min.js 2025-07-28 13:47:21 +05:30
505e1d23e4
Updated to new architectural changes in API System and Address Indexer 2025-07-28 13:14:07 +05:30
sairaj mote
3a434273d5 Fixed token and address balances not showing error 2024-03-06 10:16:28 +05:30
sairaj mote
595908c829 showing correct error for un found transaction 2024-02-18 02:41:46 +05:30
sairaj mote
4e576b8d8f updating floBlockchainAPI module 2024-01-19 01:29:33 +05:30
sairaj mote
029cdf772c Create push-dappbundle.yml 2023-12-18 22:10:04 +05:30
sairaj mote
0798a5bd89 Bug fix 2023-11-13 19:47:50 +05:30
sairaj mote
78ff09ba37 fixed contract participants not shown issue 2023-11-13 19:37:47 +05:30
sairaj mote
62e7f8b20a fixed off chain ttcs grouping 2023-11-13 19:21:32 +05:30
Vivek Teega
45ec74ffad
Update index.html 2023-10-16 02:21:31 +05:30
sairaj mote
01d55e2541 UI tweaks 2023-10-14 14:34:05 +05:30
sairaj mote
c6898ab830 Bug fix 2023-10-11 14:38:08 +05:30
sairaj mote
6949b0e4e0 Bug fixes 2023-10-05 23:20:12 +05:30
sairaj mote
e334750a02 Update index.html 2023-10-05 06:45:32 +05:30
sairaj mote
d43ae1dfe0 Added crowd fund progress tracking 2023-10-05 06:45:12 +05:30
sairaj mote
8bc58793ae Added smart contracts section to homepage 2023-10-05 02:24:07 +05:30
sairaj mote
edaebbb8f1 added smart contract creation result page
-- UI/UX improvements
2023-10-04 03:52:27 +05:30
sairaj mote
61107df14d Added option to create smart contracts 2023-10-03 04:38:59 +05:30
sairaj mote
0730690291 Added deposit and participate functionality 2023-10-02 04:17:31 +05:30
sairaj mote
e2a50e1034 Bug fix and style enhancements 2023-10-01 23:18:09 +05:30
sairaj mote
be62e74654 Added participation grouping and address copy option 2023-09-30 18:47:31 +05:30
sairaj mote
26af6173f6 Update index.html 2023-09-29 20:05:31 +05:30
sairaj mote
1d7e9cd943 Added smart contract filtering 2023-09-29 02:59:10 +05:30
sairaj mote
9a3f2360ab added transaction link to smart contract transfer 2023-09-28 05:15:13 +05:30
sairaj mote
ac3f06a341 UX improvement
-- Related smart contract transactions will be grouped together
2023-09-27 13:46:21 +05:30
sairaj mote
11c66d550d Update index.html 2023-09-25 01:59:22 +05:30
sairaj mote
060a33b5a3 added min | nax subscription amount to smart contract creation tx 2023-09-24 23:32:05 +05:30
sairaj mote
30a901f911 Minor bug fix 2023-09-24 18:09:11 +05:30
sairaj mote
9b0e43e644 Bug fix 2023-09-24 18:07:40 +05:30
sairaj mote
175a42c73d Adding smart contract page 2023-09-24 05:25:08 +05:30
sairaj mote
8b8cda084a Bug fixes 2023-09-24 03:07:23 +05:30
sairaj mote
aaa93c37d3 UI bug fixes 2023-09-22 03:09:29 +05:30
sairaj mote
81d2e42bad Refactoring code 2023-09-22 02:57:26 +05:30
sairaj mote
0e862c692e UI/UX tweaks 2023-09-13 22:41:43 +05:30
sairaj mote
ef2d191fc0 UX improvement 2023-08-23 01:41:52 +05:30
SaketAnand
9874a5385f
Update README.md 2023-07-28 17:33:36 +05:30
SaketAnand
18ead5a0a7
Update README.md 2023-07-14 13:58:47 +05:30
SaketAnand
6fc62aabf6
Update README.md 2023-07-14 04:08:48 +05:30
SaketAnand
46f1659428
Update README.md 2023-07-14 04:07:57 +05:30
SaketAnand
256ff498a2
Update README.md 2023-07-14 04:04:53 +05:30
SaketAnand
bf92814cd9
Update README.md 2023-07-14 03:17:09 +05:30
sairaj mote
2dc333807c Bug fixes 2023-07-14 01:08:23 +05:30
sairaj mote
55bdfbdd39 UI improvements 2023-07-13 17:26:23 +05:30
sairaj mote
edefd5ec97 Added UI for sub transactions 2023-07-13 03:55:59 +05:30
sairaj mote
d8727050c7 Better error handling 2023-07-05 13:54:51 +05:30
sairaj mote
fcc4dd1ed8 Added error handling for unknown block search 2023-07-05 13:47:47 +05:30
sairaj mote
9aa9facfeb minor UI changes 2023-07-05 02:49:19 +05:30
sairaj mote
68baa407db added new app name format 2023-07-05 02:40:28 +05:30
sairaj mote
d8a96c91c2 UI fix 2023-07-04 04:21:53 +05:30
sairaj mote
da4917c583 Bug fixes 2023-07-04 04:06:06 +05:30
Vivek Teega
fab24209cc Changing the API url 2023-07-04 00:43:48 +05:30
sairaj mote
ef539d4776
Merge pull request #6 from vivekteega/test-branch
New API format changes
2023-06-30 15:45:54 +05:30
sairaj mote
591b5f1ade Bug fix 2023-06-27 15:13:30 +05:30
sairaj mote
25e8460ee4 UI changes 2023-06-22 03:34:01 +05:30
sairaj mote
6b6cd86804 Bug fixes 2023-06-22 01:39:16 +05:30
sairaj mote
90e7cb2d91 UX changes 2023-06-22 01:14:35 +05:30
sairaj mote
15abca3e81 Added off chain transaction parsing and rendering 2023-06-22 01:02:25 +05:30
sairaj mote
47e708a4a5 adapted to API shape change 2023-06-22 00:24:21 +05:30
Vivek Teega
e85021d245
Merge branch 'ranchimall:master' into test-branch 2023-06-21 23:24:04 +05:30
sairaj mote
d46375a544 bug fix 2023-06-20 19:31:18 +05:30
sairaj mote
4982b70190 Bug fix 2023-06-19 01:24:04 +05:30
sairaj mote
56ecc2b95c UX improvement 2023-06-19 00:54:52 +05:30
sairaj mote
b90d0e22b9 Added total deposit balance for smart contract info 2023-06-12 13:36:04 +05:30
sairaj mote
6ad9ef0d98 Bug fix 2023-06-12 13:08:14 +05:30
sairaj mote
258d9761bd better wording 2023-06-11 23:56:53 +05:30
sairaj mote
a19e95d06b fixed labelling error 2023-06-11 17:25:19 +05:30
sairaj mote
b1ef88abea Bug fix 2023-06-11 13:20:21 +05:30
sairaj mote
155bd037a6 Text changes 2023-06-11 13:14:40 +05:30
Vivek Teega
7871bafa7a Fixing the url 2023-06-10 15:12:29 +05:30
Vivek Teega
c4eebe0d46 Updating floGlobals value 2023-06-10 15:07:35 +05:30
Vivek Teega
6a6bc50ca9
Merge pull request #4 from ranchimall/master
Pulling master changes
2023-06-10 15:00:09 +05:30
sairaj mote
c166d30f15 Added smart contract deposit tx parsing 2023-06-09 10:56:23 +05:30
sairaj mote
ec39fc3cf9 text changes 2023-06-06 19:36:04 +05:30
sairaj mote
495296acd8 Merge branch 'master' of https://github.com/ranchimall/floscout 2023-06-06 19:34:09 +05:30
sairaj mote
9d3127d177 Text changes and bug fixes 2023-06-06 19:30:49 +05:30
Vivek Teega
228c630029 Bug fix: deposit details section now shows the sellingToken as the currency 2023-06-06 04:15:56 +05:30
Vivek Teega
7338475d18 Removing debugger line 2023-05-11 15:22:54 +05:30
sairaj mote
dd853ae777 minor UX improvement 2023-05-11 01:29:02 +05:30
sairaj mote
9d3013447a UX improvements and code refactoring 2023-05-11 01:21:28 +05:30
sairaj mote
5859f75420 allowing 8 decimal places for rupee token 2023-05-03 00:46:01 +05:30
Vivek Teega
c310a14237 Change to testnet 2023-05-01 00:12:22 +05:30
Vivek Teega
a6b956a3c1 Merge remote-tracking branch 'upstream/master' 2023-05-01 00:11:40 +05:30
Vivek Teega
debf60226c Changing url to testnet 2023-04-30 16:01:18 +05:30
sairaj mote
658606f3e0 Bug fixes 2023-04-30 00:27:28 +05:30
Vivek Teega
dbf7f88d47
Merge branch 'ranchimall:master' into master 2023-04-29 19:59:19 +05:30
sairaj mote
b303b12c9b Added latest block to top 2023-04-28 00:25:53 +05:30
Vivek Teega
0f579c5d15
Merge branch 'ranchimall:master' into master 2023-04-26 22:13:34 +05:30
Vivek Teega
23180027bc Change url to mainet testing 2023-04-26 22:12:41 +05:30
sairaj mote
acbbd86bf1 Bug fix 2023-04-26 19:00:15 +05:30
sairaj mote
24f93087e9 Added multisig address search 2023-04-26 18:27:46 +05:30
sairaj mote
de22cdc725 Bug fixes 2023-04-25 22:08:08 +05:30
sairaj mote
c7931181ec API changes 2023-04-25 03:32:03 +05:30
sairaj mote
ae5728f7fe Minor UI change 2023-04-17 17:24:10 +05:30
sairaj mote
07c5b675a5
Merge pull request #5 from vivekteega/master
Integrating token swap contract
2023-04-17 17:19:47 +05:30
sairaj mote
15bcf7e7bd
Merge branch 'master' into master 2023-04-17 17:19:36 +05:30
Vivek Teega
d47a1d7086 Change urls to v2 2023-04-17 16:05:59 +05:30
sairaj mote
c65b0a92e9 Bug fix 2023-04-16 18:49:05 +05:30
sairaj mote
c63d3dc77c UI bug fixes 2023-04-16 01:40:27 +05:30
sairaj mote
debbf25396 Bug fix 2023-04-16 01:27:10 +05:30
sairaj mote
cfd28a7133 Bug fix 2023-04-16 01:24:57 +05:30
sairaj mote
2f824b609b Bug fixes 2023-04-16 01:21:37 +05:30
sairaj mote
bf6e3dc8a0 Bug fixes 2023-04-16 01:05:42 +05:30
sairaj mote
382b3273d2 Bug fixes 2023-04-16 00:53:03 +05:30
sairaj mote
04ef584393 UI fixes 2023-04-16 00:18:08 +05:30
sairaj mote
dd63e06ec5 Implementing contract deposits UI 2023-04-16 00:05:46 +05:30
sairaj mote
8ef6ed9ec4 UI fixes 2023-04-15 16:49:13 +05:30
sairaj mote
765a0856ac Bug fix 2023-04-15 16:48:19 +05:30
sairaj mote
96f9ab3a1c Bug fix 2023-04-15 16:47:44 +05:30
sairaj mote
464ec80c2a Text change 2023-04-15 16:41:09 +05:30
sairaj mote
6e468eca8d UX improvements 2023-04-15 16:39:10 +05:30
sairaj mote
b004720c0b UI improvements 2023-04-15 16:36:21 +05:30
sairaj mote
82a2c569f9 UI improvements 2023-04-15 16:00:57 +05:30
sairaj mote
4839a37e4f UI fix 2023-04-15 15:52:24 +05:30
sairaj mote
d22c6b03e2 Bug fixes 2023-04-15 15:49:13 +05:30
Vivek Teega
8334337b75 Basic integration of tokenswap participation 2023-04-15 04:21:43 +05:30
sairaj mote
b7fd195eec Bug fixes 2023-04-15 03:47:15 +05:30
sairaj mote
9098a460fe UI fixes 2023-04-15 03:42:46 +05:30
sairaj mote
75f38b6dd0 UI fixes 2023-04-15 03:36:32 +05:30
sairaj mote
ff1d1b2173 UI bug fix 2023-04-15 03:28:40 +05:30
Vivek Teega
e3998c8eb2 Bug fixes 2023-04-15 03:23:53 +05:30
sairaj mote
38b631bb05 UI changes 2023-04-15 02:54:45 +05:30
sairaj mote
74e341cb26 UI changes 2023-04-15 02:51:49 +05:30
Vivek Teega
ea6773a768 Integrating Token swap info
Co-authored-by: sairaj mote <sairajmote3@gmail.com>
2023-04-15 02:40:00 +05:30
sairaj mote
18fa94aeba Balance will only show token balances above 0 2023-04-14 01:02:11 +05:30
Vivek Teega
05974cadc4 Change api urls to testnet 2023-04-13 21:11:14 +05:30
sairaj mote
bdf71661d0 UI changes 2023-04-13 01:48:14 +05:30
Vivek Teega
a45b79fce1
Merge pull request #4 from vivekteega/master
Pushing code compatible with v2 of the API
2023-04-09 20:32:00 +05:30
sairaj mote
c58be9ef02 Added time of transaction in UI 2023-04-08 20:10:12 +05:30
Vivek Teega
4d75fa1d0c Infinite token supply as infinite on UI 2023-04-08 19:56:56 +05:30
Vivek Teega
72f4824693 Co-authored-by: sairaj mote <sairajmote3@gmail.com> 2023-04-08 19:26:13 +05:30
Vivek Teega
27a7f47247 Fixing integration with v2
Co-authored-by: sairaj mote <sairajmote3@gmail.com>
2023-04-08 18:28:45 +05:30
Vivek Teega
a20d2e9b09
Merge pull request #3 from ranchimall/pull-master
Bug fixes
2023-04-08 16:19:36 +05:30
Vivek Teega
8973f7cfaa
Merge branch 'master' into pull-master 2023-04-08 16:18:46 +05:30
Vivek Teega
70aa2d464b Save v1 & v2 API versions as checkpoints 2023-04-08 12:56:07 +05:30
Vivek Teega
9d123c2ff6 Update url for testing 2023-04-07 22:17:16 +05:30
sairaj mote
f0cd041d05 Bug fixes
-- Fixed inconsistent casing and word separation
-- added link to token page on transaction details page
2023-03-09 02:26:39 +05:30
Vivek Teega
efd28ee57b Co-authored-by: sairaj mote <sairajmote3@gmail.com> 2023-02-27 23:24:05 +05:30
Vivek Teega
4ee4019075 Changed token and flo apiUrl to testnet's testing links 2023-02-26 11:29:30 +05:30
sairaj mote
cc142f8297 Merge branch 'master' of https://github.com/ranchimall/floscout 2023-02-08 18:49:21 +05:30
sairaj mote
6ad1081b7e better error handling 2023-02-08 18:47:20 +05:30
Vivek Teega
fde58329e7
Update README.md 2023-01-30 17:37:06 +05:30
sairaj mote
c3e2d1bef7 New router implementation 2023-01-20 22:27:58 +05:30
sairaj mote
842be7ebbf removed console logs 2023-01-18 17:32:43 +05:30
sairaj mote
7302255578 Bug fixes 2023-01-12 22:27:30 +05:30
sairaj mote
f2f69a83b8 Code refactoring and UI changes 2022-12-29 02:38:57 +05:30
Vivek Teega
2b25ff382d
Merge pull request #2 from ranchimall/tokenswap-addition
Fixed receiver address bug in token transaction rendering
2022-04-08 19:44:13 +05:30
15 changed files with 18245 additions and 4094 deletions

32
.github/workflows/push-dappbundle.yml vendored Normal file
View File

@ -0,0 +1,32 @@
name: Workflow push to Dappbundle
on: [push]
jobs:
build:
name: Build
runs-on: self-hosted
steps:
- name: Executing remote command
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.R_HOST }}
username: ${{ secrets.P_USERNAME }}
password: ${{ secrets.P_PASSWORD }}
port: ${{ secrets.SSH_PORT }}
script: |
if [ -d "${{ secrets.DEPLOYMENT_LOCATION}}/dappbundle" ]; then
echo "Folder exists. Skipping Git clone."
else
echo "Folder does not exist. Cloning repository..."
cd ${{ secrets.DEPLOYMENT_LOCATION}}/ && git clone https://github.com/ranchimall/dappbundle.git
fi
if [ -d "${{ secrets.DEPLOYMENT_LOCATION}}/dappbundle/${{ github.event.repository.name }}" ]; then
echo "Repository exists. Remove folder "
rm -r "${{ secrets.DEPLOYMENT_LOCATION}}/dappbundle/${{ github.event.repository.name }}"
fi
echo "Cloning repository..."
cd ${{ secrets.DEPLOYMENT_LOCATION}}/dappbundle && git clone https://github.com/ranchimall/${{ github.event.repository.name }}
cd "${{ secrets.DEPLOYMENT_LOCATION}}/dappbundle/${{ github.event.repository.name }}" && rm -rf .gitattributes .git .github .gitignore
cd ${{ secrets.DEPLOYMENT_LOCATION}}/dappbundle/ && git add . && git commit -m "Workflow updating files of ${{ github.event.repository.name }}" && git push "https://ranchimalldev:${{ secrets.RM_ACCESS_TOKEN }}@github.com/ranchimall/dappbundle.git"

View File

@ -1,2 +1,42 @@
# flo scout
# FLO Scout
FLO Scout is RanchiMall's token and smart contract explorer.
All tokens, smart contracts, and their transactions (created on FLO blockchain) can be accessed on FLO Scout.
### Live URL for FLO Scout:
*https://ranchimall.github.io/floscout/*
## How to use
#### Search by address
i) On the homepage of FLO Scout, enter the FLO address/FLO ID and press Enter
ii) On the top it shows the FLO balance and the tokens and their respective balances of the FLO ID
iii) Next it shows the token transfers, amount of token transferred, or smart contract transactions of the FLO address
#### Search by transaction
i) Enter the transaction ID of a FLO blockchain token transfer in the search box
ii) This will give the token transfer detail of that transaction, including sender and receiver address, FLO data, amount of token transfer, and timestamp of the transaction
#### Search by token name
i) Enter the token name in the search box
ii) This will give the incorporation address of the token (an incorporation address is the creator address of the token), the total supply of the token, all token transactions, and the details of token holders
#### Search by smart contract
i) Enter the smart contract name in the search box
ii) This will give the following details of the smart contract:
&nbsp;&nbsp;&nbsp; a) Smart contract type (continuous, or one-time event)
&nbsp;&nbsp;&nbsp; b) Smart contract subtype (tokenswap)
&nbsp;&nbsp;&nbsp; c) Contract address (the FLO address that created the smart contract)
&nbsp;&nbsp;&nbsp; d) Other statistics (no. of deposits, no. of participants, oracle address, total output, and total balance)
&nbsp;&nbsp;&nbsp; e) Both off-chain and on-chain data
&nbsp;&nbsp;&nbsp; f) Off-chain data is sub-transactions inside the smart contract
#### Search by block
i) Enter the block number in the search box
ii) This will give the following details of the block:
&nbsp;&nbsp;&nbsp; a) Relevant Transactions (no. of transactions inside the block)
&nbsp;&nbsp;&nbsp; b) No. of confirmations
&nbsp;&nbsp;&nbsp; c) Reward
&nbsp;&nbsp;&nbsp; d) Block Hash
&nbsp;&nbsp;&nbsp; e) Difficulty
&nbsp;&nbsp;&nbsp; f) Transactions (token transfer details)

File diff suppressed because it is too large Load Diff

2
css/main.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

11
floscout.svg Normal file
View File

@ -0,0 +1,11 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3_34)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M50.5679 101.136C78.4958 101.136 101.136 78.4958 101.136 50.5679C101.136 47.0696 100.781 43.6543 100.104 40.3561C104.75 47.3575 107.457 55.7578 107.457 64.7901C107.457 89.227 87.6468 109.037 63.2099 109.037C52.318 109.037 42.3453 105.102 34.6362 98.575C39.6451 100.236 45.0015 101.136 50.5679 101.136ZM34.6362 98.575C14.5144 91.9008 0 72.9293 0 50.5679C0 22.64 22.64 0 50.5679 0C74.9975 0 95.381 17.3234 100.104 40.3561C92.1803 28.4153 78.6144 20.5432 63.2099 20.5432C38.773 20.5432 18.963 40.3532 18.963 64.7901C18.963 78.3351 25.0492 90.4586 34.6362 98.575Z" fill="#4F56FF"/>
<circle cx="113.333" cy="113.333" r="14.6667" fill="#4F56FF"/>
</g>
<defs>
<clipPath id="clip0_3_34">
<rect width="128" height="128" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 934 B

6464
index.html

File diff suppressed because it is too large Load Diff

10
scripts/components.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,44 @@
/**!
* FlexSearch.js v0.7.31 (Light)
* Copyright 2018-2022 Nextapps GmbH
* Author: Thomas Wilkerling
* Licence: Apache-2.0
* https://github.com/nextapps-de/flexsearch
*/
(function (self) {
'use strict'; function t(a) { return "undefined" !== typeof a ? a : !0 } function v(a) { const c = Array(a); for (let b = 0; b < a; b++)c[b] = y(); return c } function y() { return Object.create(null) } function z(a, c) { return c.length - a.length }; const A = /[\p{Z}\p{S}\p{P}\p{C}]+/u; function B(a, c) { const b = Object.keys(a), d = b.length, e = []; let h = "", f = 0; for (let g = 0, l, n; g < d; g++)l = b[g], (n = a[l]) ? (e[f++] = new RegExp(c ? "(?!\\b)" + l + "(\\b|_)" : l, "g"), e[f++] = n) : h += (h ? "|" : "") + l; h && (e[f++] = new RegExp(c ? "(?!\\b)(" + h + ")(\\b|_)" : "(" + h + ")", "g"), e[f] = ""); return e } function C(a, c) { for (let b = 0, d = c.length; b < d && (a = a.replace(c[b], c[b + 1]), a); b += 2); return a }; function D(a) { if (a = ("" + a).toLowerCase()) if (this.o && (a = C(a, this.o)), this.A && 1 < a.length && (a = C(a, this.A)), A || "" === A) if (a = a.split(A), this.filter) { var c = this.filter; const b = a.length, d = []; for (let e = 0, h = 0; e < b; e++) { const f = a[e]; f && !c[f] && (d[h++] = f) } a = d } return a }; const F = {}, G = {}; function H(a, c, b, d) {
const e = a.length; let h = [], f, g, l = 0; d && (d = []); for (let n = e - 1; 0 <= n; n--) { const m = a[n], r = m.length, p = y(); let q = !f; for (let k = 0; k < r; k++) { const u = m[k], M = u.length; if (M) for (let E = 0, x, w; E < M; E++)if (w = u[E], f) { if (f[w]) { if (!n) if (b) b--; else if (h[l++] = w, l === c) return h; if (n || d) p[w] = 1; q = !0 } if (d && (x = (g[w] || 0) + 1, g[w] = x, x < e)) { const N = d[x - 2] || (d[x - 2] = []); N[N.length] = w } } else p[w] = 1 } if (d) f || (g = p); else if (!q) return []; f = p } if (d) for (let n = d.length - 1, m, r; 0 <= n; n--) {
m = d[n]; r = m.length; for (let p = 0, q; p < r; p++)if (q =
m[p], !f[q]) { if (b) b--; else if (h[l++] = q, l === c) return h; f[q] = 1 }
} return h
}; function I(a, c) {
if (!(this instanceof I)) return new I(a); let b; if (a) { var d = a.charset; b = a.lang; "string" === typeof d && (-1 === d.indexOf(":") && (d += ":default"), d = G[d]); "string" === typeof b && (b = F[b]) } else a = {}; let e, h, f = a.context || {}; this.encode = a.encode || d && d.encode || D; this.register = c || y(); this.s = e = a.resolution || 9; this.B = c = d && d.B || a.tokenize || "strict"; this.i = "strict" === c && f.depth; this.j = t(f.bidirectional); this.g = h = t(a.optimize); this.m = t(a.fastupdate); this.h = a.minlength || 1; this.C = a.boost; this.map = h ? v(e) : y();
this.v = e = f.resolution || 1; this.l = h ? v(e) : y(); this.u = d && d.u || a.rtl; this.o = (c = a.matcher || b && b.o) && B(c, !1); this.A = (c = a.stemmer || b && b.A) && B(c, !0); if (a = c = a.filter || b && b.filter) { a = c; d = y(); for (let g = 0, l = a.length; g < l; g++)d[a[g]] = 1; a = d } this.filter = a
} I.prototype.append = function (a, c) { return this.add(a, c, !0) };
I.prototype.add = function (a, c, b, d) {
if (c && (a || 0 === a)) {
if (!d && !b && this.register[a]) return this.update(a, c); c = this.encode(c); if (d = c.length) {
const n = y(), m = y(), r = this.i, p = this.s; for (let q = 0; q < d; q++) {
let k = c[this.u ? d - 1 - q : q]; var e = k.length; if (k && e >= this.h && (r || !m[k])) {
var h = J(p, d, q), f = ""; switch (this.B) {
case "full": if (2 < e) { for (h = 0; h < e; h++)for (var g = e; g > h; g--)if (g - h >= this.h) { var l = J(p, d, q, e, h); f = k.substring(h, g); K(this, m, f, l, a, b) } break } case "reverse": if (1 < e) {
for (g = e - 1; 0 < g; g--)f = k[g] + f, f.length >= this.h && K(this,
m, f, J(p, d, q, e, g), a, b); f = ""
} case "forward": if (1 < e) { for (g = 0; g < e; g++)f += k[g], f.length >= this.h && K(this, m, f, h, a, b); break } default: if (this.C && (h = Math.min(h / this.C(c, k, q) | 0, p - 1)), K(this, m, k, h, a, b), r && 1 < d && q < d - 1) for (e = y(), f = this.v, h = k, g = Math.min(r + 1, d - q), e[h] = 1, l = 1; l < g; l++)if ((k = c[this.u ? d - 1 - q - l : q + l]) && k.length >= this.h && !e[k]) { e[k] = 1; const u = this.j && k > h; K(this, n, u ? h : k, J(f + (d / 2 > f ? 0 : 1), d, q, g - 1, l - 1), a, b, u ? k : h) }
}
}
} this.m || (this.register[a] = 1)
}
} return this
};
function J(a, c, b, d, e) { return b && 1 < a ? c + (d || 0) <= a ? b + (e || 0) : (a - 1) / (c + (d || 0)) * (b + (e || 0)) + 1 | 0 : 0 } function K(a, c, b, d, e, h, f) { let g = f ? a.l : a.map; if (!c[b] || f && !c[b][f]) a.g && (g = g[d]), f ? (c = c[b] || (c[b] = y()), c[f] = 1, g = g[f] || (g[f] = y())) : c[b] = 1, g = g[b] || (g[b] = []), a.g || (g = g[d] || (g[d] = [])), h && g.includes(e) || (g[g.length] = e, a.m && (a = a.register[e] || (a.register[e] = []), a[a.length] = g)) }
I.prototype.search = function (a, c, b) {
b || (c || "object" !== typeof a ? "object" === typeof c && (b = c) : (b = a, a = b.query)); let d = [], e; let h, f = 0; if (b) { a = b.query || a; c = b.limit; f = b.offset || 0; var g = b.context; h = !1 } if (a && (a = this.encode("" + a), e = a.length, 1 < e)) { b = y(); var l = []; for (let m = 0, r = 0, p; m < e; m++)if ((p = a[m]) && p.length >= this.h && !b[p]) if (this.g || h || this.map[p]) l[r++] = p, b[p] = 1; else return d; a = l; e = a.length } if (!e) return d; c || (c = 100); g = this.i && 1 < e && !1 !== g; b = 0; let n; g ? (n = a[0], b = 1) : 1 < e && a.sort(z); for (let m, r; b < e; b++) {
r = a[b]; g ?
(m = L(this, d, h, c, f, 2 === e, r, n), h && !1 === m && d.length || (n = r)) : m = L(this, d, h, c, f, 1 === e, r); if (m) return m; if (h && b === e - 1) { l = d.length; if (!l) { if (g) { g = 0; b = -1; continue } return d } if (1 === l) return O(d[0], c, f) }
} return H(d, c, f, h)
};
function L(a, c, b, d, e, h, f, g) { let l = [], n = g ? a.l : a.map; a.g || (n = P(n, f, g, a.j)); if (n) { let m = 0; const r = Math.min(n.length, g ? a.v : a.s); for (let p = 0, q = 0, k, u; p < r; p++)if (k = n[p]) if (a.g && (k = P(k, f, g, a.j)), e && k && h && (u = k.length, u <= e ? (e -= u, k = null) : (k = k.slice(e), e = 0)), k && (l[m++] = k, h && (q += k.length, q >= d))) break; if (m) { if (h) return O(l, d, 0); c[c.length] = l; return } } return !b && l } function O(a, c, b) { a = 1 === a.length ? a[0] : [].concat.apply([], a); return b || a.length > c ? a.slice(b, b + c) : a }
function P(a, c, b, d) { b ? (d = d && c > b, a = (a = a[d ? c : b]) && a[d ? b : c]) : a = a[c]; return a } I.prototype.contain = function (a) { return !!this.register[a] }; I.prototype.update = function (a, c) { return this.remove(a).add(a, c) }; I.prototype.remove = function (a, c) { const b = this.register[a]; if (b) { if (this.m) for (let d = 0, e; d < b.length; d++)e = b[d], e.splice(e.indexOf(a), 1); else Q(this.map, a, this.s, this.g), this.i && Q(this.l, a, this.v, this.g); c || delete this.register[a] } return this };
function Q(a, c, b, d, e) { let h = 0; if (a.constructor === Array) if (e) c = a.indexOf(c), -1 !== c ? 1 < a.length && (a.splice(c, 1), h++) : h++; else { e = Math.min(a.length, b); for (let f = 0, g; f < e; f++)if (g = a[f]) h = Q(g, c, b, d, e), d || h || delete a[f] } else for (let f in a) (h = Q(a[f], c, b, d, e)) || delete a[f]; return h }; const R = self; let S; const T = { Index: I, Document: null, Worker: null, registerCharset: function (a, c) { G[a] = c }, registerLanguage: function (a, c) { F[a] = c } }; (S = R.define) && S.amd ? S([], function () { return T }) : R.exports ? R.exports = T : R.FlexSearch = T;
}(this));

1063
scripts/floBlockchainAPI.js Normal file

File diff suppressed because one or more lines are too long

1
scripts/floBlockchainAPI.min.js vendored Normal file

File diff suppressed because one or more lines are too long

530
scripts/floCrypto.js Normal file
View File

@ -0,0 +1,530 @@
(function (EXPORTS) { //floCrypto v2.3.6a
/* FLO Crypto Operators */
'use strict';
const floCrypto = EXPORTS;
const p = BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16);
const ecparams = EllipticCurve.getSECCurveByName("secp256k1");
const ascii_alternatives = ` '\n '\n“ "\n” "\n --\n— ---\n≥ >=\n≤ <=\n≠ !=\n× *\n÷ /\n← <-\n→ ->\n↔ <->\n⇒ =>\n⇐ <=\n⇔ <=>`;
const exponent1 = () => p.add(BigInteger.ONE).divide(BigInteger("4"));
coinjs.compressed = true; //defaulting coinjs compressed to true;
function calculateY(x) {
let exp = exponent1();
// x is x value of public key in BigInteger format without 02 or 03 or 04 prefix
return x.modPow(BigInteger("3"), p).add(BigInteger("7")).mod(p).modPow(exp, p)
}
function getUncompressedPublicKey(compressedPublicKey) {
// Fetch x from compressedPublicKey
let pubKeyBytes = Crypto.util.hexToBytes(compressedPublicKey);
const prefix = pubKeyBytes.shift() // remove prefix
let prefix_modulus = prefix % 2;
pubKeyBytes.unshift(0) // add prefix 0
let x = new BigInteger(pubKeyBytes)
let xDecimalValue = x.toString()
// Fetch y
let y = calculateY(x);
let yDecimalValue = y.toString();
// verify y value
let resultBigInt = y.mod(BigInteger("2"));
let check = resultBigInt.toString() % 2;
if (prefix_modulus !== check)
yDecimalValue = y.negate().mod(p).toString();
return {
x: xDecimalValue,
y: yDecimalValue
};
}
function getSenderPublicKeyString() {
let privateKey = ellipticCurveEncryption.senderRandom();
var senderPublicKeyString = ellipticCurveEncryption.senderPublicString(privateKey);
return {
privateKey: privateKey,
senderPublicKeyString: senderPublicKeyString
}
}
function deriveSharedKeySender(receiverPublicKeyHex, senderPrivateKey) {
let receiverPublicKeyString = getUncompressedPublicKey(receiverPublicKeyHex);
var senderDerivedKey = ellipticCurveEncryption.senderSharedKeyDerivation(
receiverPublicKeyString.x, receiverPublicKeyString.y, senderPrivateKey);
return senderDerivedKey;
}
function deriveSharedKeyReceiver(senderPublicKeyString, receiverPrivateKey) {
return ellipticCurveEncryption.receiverSharedKeyDerivation(
senderPublicKeyString.XValuePublicString, senderPublicKeyString.YValuePublicString, receiverPrivateKey);
}
function getReceiverPublicKeyString(privateKey) {
return ellipticCurveEncryption.receiverPublicString(privateKey);
}
function wifToDecimal(pk_wif, isPubKeyCompressed = false) {
let pk = Bitcoin.Base58.decode(pk_wif)
pk.shift()
pk.splice(-4, 4)
//If the private key corresponded to a compressed public key, also drop the last byte (it should be 0x01).
if (isPubKeyCompressed == true) pk.pop()
pk.unshift(0)
let privateKeyDecimal = BigInteger(pk).toString()
let privateKeyHex = Crypto.util.bytesToHex(pk)
return {
privateKeyDecimal: privateKeyDecimal,
privateKeyHex: privateKeyHex
}
}
//generate a random Interger within range
floCrypto.randInt = function (min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(securedMathRandom() * (max - min + 1)) + min;
}
//generate a random String within length (options : alphaNumeric chars only)
floCrypto.randString = function (length, alphaNumeric = true) {
var result = '';
var characters = alphaNumeric ? 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' :
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_+-./*?@#&$<>=[]{}():';
for (var i = 0; i < length; i++)
result += characters.charAt(Math.floor(securedMathRandom() * characters.length));
return result;
}
//Encrypt Data using public-key
floCrypto.encryptData = function (data, receiverPublicKeyHex) {
var senderECKeyData = getSenderPublicKeyString();
var senderDerivedKey = deriveSharedKeySender(receiverPublicKeyHex, senderECKeyData.privateKey);
let senderKey = senderDerivedKey.XValue + senderDerivedKey.YValue;
let secret = Crypto.AES.encrypt(data, senderKey);
return {
secret: secret,
senderPublicKeyString: senderECKeyData.senderPublicKeyString
};
}
//Decrypt Data using private-key
floCrypto.decryptData = function (data, privateKeyHex) {
var receiverECKeyData = {};
if (typeof privateKeyHex !== "string") throw new Error("No private key found.");
let privateKey = wifToDecimal(privateKeyHex, true);
if (typeof privateKey.privateKeyDecimal !== "string") throw new Error("Failed to detremine your private key.");
receiverECKeyData.privateKey = privateKey.privateKeyDecimal;
var receiverDerivedKey = deriveSharedKeyReceiver(data.senderPublicKeyString, receiverECKeyData.privateKey);
let receiverKey = receiverDerivedKey.XValue + receiverDerivedKey.YValue;
let decryptMsg = Crypto.AES.decrypt(data.secret, receiverKey);
return decryptMsg;
}
//Sign data using private-key
floCrypto.signData = function (data, privateKeyHex) {
var key = new Bitcoin.ECKey(privateKeyHex);
var messageHash = Crypto.SHA256(data);
var messageSign = Bitcoin.ECDSA.sign(messageHash, key.priv);
var sighex = Crypto.util.bytesToHex(messageSign);
return sighex;
}
//Verify signatue of the data using public-key
floCrypto.verifySign = function (data, signatureHex, publicKeyHex) {
var msgHash = Crypto.SHA256(data);
var sigBytes = Crypto.util.hexToBytes(signatureHex);
var publicKeyPoint = ecparams.getCurve().decodePointHex(publicKeyHex);
var verify = Bitcoin.ECDSA.verify(msgHash, sigBytes, publicKeyPoint);
return verify;
}
//Generates a new flo ID and returns private-key, public-key and floID
const generateNewID = floCrypto.generateNewID = function () {
var key = new Bitcoin.ECKey(false);
key.setCompressed(true);
return {
floID: key.getBitcoinAddress(),
pubKey: key.getPubKeyHex(),
privKey: key.getBitcoinWalletImportFormat()
}
}
Object.defineProperties(floCrypto, {
newID: {
get: () => generateNewID()
},
hashID: {
value: (str) => {
let bytes = ripemd160(Crypto.SHA256(str, { asBytes: true }), { asBytes: true });
bytes.unshift(bitjs.pub);
var hash = Crypto.SHA256(Crypto.SHA256(bytes, {
asBytes: true
}), {
asBytes: true
});
var checksum = hash.slice(0, 4);
return bitjs.Base58.encode(bytes.concat(checksum));
}
},
tmpID: {
get: () => {
let bytes = Crypto.util.randomBytes(20);
bytes.unshift(bitjs.pub);
var hash = Crypto.SHA256(Crypto.SHA256(bytes, {
asBytes: true
}), {
asBytes: true
});
var checksum = hash.slice(0, 4);
return bitjs.Base58.encode(bytes.concat(checksum));
}
}
});
//Returns public-key from private-key
floCrypto.getPubKeyHex = function (privateKeyHex) {
if (!privateKeyHex)
return null;
var key = new Bitcoin.ECKey(privateKeyHex);
if (key.priv == null)
return null;
key.setCompressed(true);
return key.getPubKeyHex();
}
//Returns flo-ID from public-key or private-key
floCrypto.getFloID = function (keyHex) {
if (!keyHex)
return null;
try {
var key = new Bitcoin.ECKey(keyHex);
if (key.priv == null)
key.setPub(keyHex);
return key.getBitcoinAddress();
} catch {
return null;
}
}
floCrypto.getAddress = function (privateKeyHex, strict = false) {
if (!privateKeyHex)
return;
var key = new Bitcoin.ECKey(privateKeyHex);
if (key.priv == null)
return null;
key.setCompressed(true);
let pubKey = key.getPubKeyHex(),
version = bitjs.Base58.decode(privateKeyHex)[0];
switch (version) {
case coinjs.priv: //BTC
return coinjs.bech32Address(pubKey).address;
case bitjs.priv: //FLO
return bitjs.pubkey2address(pubKey);
default:
return strict ? false : bitjs.pubkey2address(pubKey); //default to FLO address (if strict=false)
}
}
//Verify the private-key for the given public-key or flo-ID
floCrypto.verifyPrivKey = function (privateKeyHex, pubKey_floID, isfloID = true) {
if (!privateKeyHex || !pubKey_floID)
return false;
try {
var key = new Bitcoin.ECKey(privateKeyHex);
if (key.priv == null)
return false;
key.setCompressed(true);
if (isfloID && pubKey_floID == key.getBitcoinAddress())
return true;
else if (!isfloID && pubKey_floID.toUpperCase() == key.getPubKeyHex().toUpperCase())
return true;
else
return false;
} catch {
return null;
}
}
floCrypto.getMultisigAddress = function (publicKeyList, requiredSignatures) {
if (!Array.isArray(publicKeyList) || !publicKeyList.length)
return null;
if (!Number.isInteger(requiredSignatures) || requiredSignatures < 1 || requiredSignatures > publicKeyList.length)
return null;
try {
var multisig = bitjs.pubkeys2multisig(publicKeyList, requiredSignatures);
return multisig;
} catch {
return null;
}
}
floCrypto.decodeRedeemScript = function (redeemScript) {
try {
var decoded = bitjs.transaction().decodeRedeemScript(redeemScript);
return decoded;
} catch {
return null;
}
}
//Check if the given flo-id is valid or not
floCrypto.validateFloID = function (floID, regularOnly = false) {
if (!floID)
return false;
try {
let addr = new Bitcoin.Address(floID);
if (regularOnly && addr.version != Bitcoin.Address.standardVersion)
return false;
return true;
} catch {
return false;
}
}
//Check if the given address (any blockchain) is valid or not
floCrypto.validateAddr = function (address, std = true, bech = true) {
let raw = decodeAddress(address);
if (!raw)
return false;
if (typeof raw.version !== 'undefined') { //legacy or segwit
if (std == false)
return false;
else if (std === true || (!Array.isArray(std) && std === raw.version) || (Array.isArray(std) && std.includes(raw.version)))
return true;
else
return false;
} else if (typeof raw.bech_version !== 'undefined') { //bech32
if (bech === false)
return false;
else if (bech === true || (!Array.isArray(bech) && bech === raw.bech_version) || (Array.isArray(bech) && bech.includes(raw.bech_version)))
return true;
else
return false;
} else //unknown
return false;
}
//Check the public-key (or redeem-script) for the address (any blockchain)
floCrypto.verifyPubKey = function (pubKeyHex, address) {
let raw = decodeAddress(address);
if (!raw)
return;
let pub_hash = Crypto.util.bytesToHex(ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(pubKeyHex), { asBytes: true })));
if (typeof raw.bech_version !== 'undefined' && raw.bytes.length == 32) //bech32-multisig
raw.hex = Crypto.util.bytesToHex(ripemd160(raw.bytes, { asBytes: true }));
return pub_hash === raw.hex;
}
//Convert the given address (any blockchain) to equivalent floID
floCrypto.toFloID = function (address, options = null) {
if (!address)
return;
let raw = decodeAddress(address);
if (!raw)
return;
else if (options) { //if (optional) version check is passed
if (typeof raw.version !== 'undefined' && (!options.std || !options.std.includes(raw.version)))
return;
if (typeof raw.bech_version !== 'undefined' && (!options.bech || !options.bech.includes(raw.bech_version)))
return;
}
raw.bytes.unshift(bitjs.pub);
let hash = Crypto.SHA256(Crypto.SHA256(raw.bytes, {
asBytes: true
}), {
asBytes: true
});
return bitjs.Base58.encode(raw.bytes.concat(hash.slice(0, 4)));
}
//Convert raw address bytes to floID
floCrypto.rawToFloID = function (raw_bytes) {
if (typeof raw_bytes === 'string')
raw_bytes = Crypto.util.hexToBytes(raw_bytes);
if (raw_bytes.length != 20)
return null;
raw_bytes.unshift(bitjs.pub);
let hash = Crypto.SHA256(Crypto.SHA256(raw_bytes, {
asBytes: true
}), {
asBytes: true
});
return bitjs.Base58.encode(raw_bytes.concat(hash.slice(0, 4)));
}
//Convert the given multisig address (any blockchain) to equivalent multisig floID
floCrypto.toMultisigFloID = function (address, options = null) {
if (!address)
return;
let raw = decodeAddress(address);
if (!raw)
return;
else if (options) { //if (optional) version check is passed
if (typeof raw.version !== 'undefined' && (!options.std || !options.std.includes(raw.version)))
return;
if (typeof raw.bech_version !== 'undefined' && (!options.bech || !options.bech.includes(raw.bech_version)))
return;
}
if (typeof raw.bech_version !== 'undefined') {
if (raw.bytes.length != 32) return; //multisig bech address have 32 bytes
//multisig-bech:hash=SHA256 whereas multisig:hash=r160(SHA265), thus ripemd160 the bytes from multisig-bech
raw.bytes = ripemd160(raw.bytes, {
asBytes: true
});
}
raw.bytes.unshift(bitjs.multisig);
let hash = Crypto.SHA256(Crypto.SHA256(raw.bytes, {
asBytes: true
}), {
asBytes: true
});
return bitjs.Base58.encode(raw.bytes.concat(hash.slice(0, 4)));
}
//Checks if the given addresses (any blockchain) are same (w.r.t keys)
floCrypto.isSameAddr = function (addr1, addr2) {
if (!addr1 || !addr2)
return;
let raw1 = decodeAddress(addr1),
raw2 = decodeAddress(addr2);
if (!raw1 || !raw2)
return false;
else {
if (typeof raw1.bech_version !== 'undefined' && raw1.bytes.length == 32) //bech32-multisig
raw1.hex = Crypto.util.bytesToHex(ripemd160(raw1.bytes, { asBytes: true }));
if (typeof raw2.bech_version !== 'undefined' && raw2.bytes.length == 32) //bech32-multisig
raw2.hex = Crypto.util.bytesToHex(ripemd160(raw2.bytes, { asBytes: true }));
return raw1.hex === raw2.hex;
}
}
const decodeAddress = floCrypto.decodeAddr = function (address) {
if (!address)
return;
else if (address.length == 33 || address.length == 34) { //legacy encoding
let decode = bitjs.Base58.decode(address);
let bytes = decode.slice(0, decode.length - 4);
let checksum = decode.slice(decode.length - 4),
hash = Crypto.SHA256(Crypto.SHA256(bytes, {
asBytes: true
}), {
asBytes: true
});
return (hash[0] != checksum[0] || hash[1] != checksum[1] || hash[2] != checksum[2] || hash[3] != checksum[3]) ? null : {
version: bytes.shift(),
hex: Crypto.util.bytesToHex(bytes),
bytes
}
} else if (address.length == 42 || address.length == 62) { //bech encoding
let decode = coinjs.bech32_decode(address);
if (decode) {
let bytes = decode.data;
let bech_version = bytes.shift();
bytes = coinjs.bech32_convert(bytes, 5, 8, false);
return {
bech_version,
hrp: decode.hrp,
hex: Crypto.util.bytesToHex(bytes),
bytes
}
} else
return null;
}
}
//Split the str using shamir's Secret and Returns the shares
floCrypto.createShamirsSecretShares = function (str, total_shares, threshold_limit) {
try {
if (str.length > 0) {
var strHex = shamirSecretShare.str2hex(str);
var shares = shamirSecretShare.share(strHex, total_shares, threshold_limit);
return shares;
}
return false;
} catch {
return false
}
}
//Returns the retrived secret by combining the shamirs shares
const retrieveShamirSecret = floCrypto.retrieveShamirSecret = function (sharesArray) {
try {
if (sharesArray.length > 0) {
var comb = shamirSecretShare.combine(sharesArray.slice(0, sharesArray.length));
comb = shamirSecretShare.hex2str(comb);
return comb;
}
return false;
} catch {
return false;
}
}
//Verifies the shares and str
floCrypto.verifyShamirsSecret = function (sharesArray, str) {
if (!str)
return null;
else if (retrieveShamirSecret(sharesArray) === str)
return true;
else
return false;
}
const validateASCII = floCrypto.validateASCII = function (string, bool = true) {
if (typeof string !== "string")
return null;
if (bool) {
let x;
for (let i = 0; i < string.length; i++) {
x = string.charCodeAt(i);
if (x < 32 || x > 127)
return false;
}
return true;
} else {
let x, invalids = {};
for (let i = 0; i < string.length; i++) {
x = string.charCodeAt(i);
if (x < 32 || x > 127)
if (x in invalids)
invalids[string[i]].push(i)
else
invalids[string[i]] = [i];
}
if (Object.keys(invalids).length)
return invalids;
else
return true;
}
}
floCrypto.convertToASCII = function (string, mode = 'soft-remove') {
let chars = validateASCII(string, false);
if (chars === true)
return string;
else if (chars === null)
return null;
let convertor, result = string,
refAlt = {};
ascii_alternatives.split('\n').forEach(a => refAlt[a[0]] = a.slice(2));
mode = mode.toLowerCase();
if (mode === "hard-unicode")
convertor = (c) => `\\u${('000' + c.charCodeAt().toString(16)).slice(-4)}`;
else if (mode === "soft-unicode")
convertor = (c) => refAlt[c] || `\\u${('000' + c.charCodeAt().toString(16)).slice(-4)}`;
else if (mode === "hard-remove")
convertor = c => "";
else if (mode === "soft-remove")
convertor = c => refAlt[c] || "";
else
return null;
for (let c in chars)
result = result.replaceAll(c, convertor(c));
return result;
}
floCrypto.revertUnicode = function (string) {
return string.replace(/\\u[\dA-F]{4}/gi,
m => String.fromCharCode(parseInt(m.replace(/\\u/g, ''), 16)));
}
})('object' === typeof module ? module.exports : window.floCrypto = {});

193
scripts/floTokenAPI.js Normal file

File diff suppressed because one or more lines are too long

1
scripts/floTokenAPI.min.js vendored Normal file

File diff suppressed because one or more lines are too long

9975
scripts/lib.js Normal file

File diff suppressed because it is too large Load Diff