Compare commits

..

158 Commits

Author SHA1 Message Date
sairaj mote
a78d329f9d Update index.html 2024-02-18 02:40:23 +05:30
Vivek Teega
983e959ac2
Merge branch 'ranchimall:master' into master 2023-11-22 15:10:43 +05:30
sairaj mote
8a262850e5 Bug fix 2023-11-13 19:47:57 +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
ad20b20ca2 Merge branch 'master' of https://github.com/ranchimall/floscout-testnet 2023-11-13 19:37:34 +05:30
sairaj mote
67d6d21a6d fixed contract participants not shown issue 2023-11-13 19:37:19 +05:30
Vivek Teega
b2812024bf Changing to testnet 2023-11-13 19:23:42 +05:30
sairaj mote
62e7f8b20a fixed off chain ttcs grouping 2023-11-13 19:21:32 +05:30
sairaj mote
9867e23ed4 Fixed grouping for off chain transactions 2023-11-13 19:21:07 +05:30
sairaj mote
2317e02472 Merge branch 'master' of https://github.com/ranchimall/floscout-testnet 2023-10-17 04:11:17 +05:30
Vivek Teega
ffbb2a844e
Update index.html 2023-10-16 02:23:04 +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
Vivek Teega
3e9b368d1b
Changed to testnet 2023-09-29 19:59:46 +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
Vivek Teega
75f0e7fde1 Fixed receiver address bug in token transaction rendering 2022-04-08 19:43:15 +05:30
sairaj mote
227c45c2c2 Fixed issue with fetching FLO ID balance 2022-01-23 15:21:21 +05:30
sairaj mote
21a8ac7f59 Error handling for unavailable transactions 2021-10-30 20:01:55 +05:30
sairajzero
32f2b61ba6 updated the floapiURL 2021-06-05 14:29:33 +05:30
Vivek Teega
56d7b9e296 Revert to flosight.duckdns.org 2021-06-05 12:56:54 +05:30
Vivek Teega
99cafd8e9b Change primary server to flosight1 2020-11-28 23:32:12 +05:30
Vivek Teega
82dc15c435 Temporary fix for Smart Contract Triggers 2020-08-22 20:16:59 +05:30
Vivek Teega
ad155686ea Fix transactionType undefined bug 2020-08-22 19:49:47 +05:30
25 changed files with 18306 additions and 33583 deletions

View File

@ -1,146 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
width="469.89999"
height="212.84599"
viewBox="0 0 469.89999 212.84599"
enable-background="new 0 0 512 512"
xml:space="preserve"
sodipodi:docname="FLO_horizontal_text.svg"
inkscape:version="0.92.4 (unknown)"><metadata
id="metadata4665"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4663" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="732"
id="namedview4661"
showgrid="false"
inkscape:zoom="1.3027344"
inkscape:cx="219.90846"
inkscape:cy="85.00108"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"
fit-margin-top="-0.1"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="337.43359"
y1="263.58591"
x2="394.418"
y2="263.58591"><stop
offset="0"
style="stop-color:#2583A6"
id="stop4615" /><stop
offset="0.5"
style="stop-color:#257EA3"
id="stop4617" /><stop
offset="1"
style="stop-color:#237AA0"
id="stop4619" /></linearGradient><polygon
points="394.418,304.29 337.434,304.29 337.434,222.882 351.623,222.882 351.623,291.387 394.418,291.387 "
id="polygon4622"
style="fill:url(#SVGID_1_)"
transform="translate(-21.05,-128.155)" /><linearGradient
id="SVGID_2_"
gradientUnits="userSpaceOnUse"
x1="405.81641"
y1="263.58591"
x2="490.94919"
y2="263.58591"
gradientTransform="translate(-21.05,-128.155)"><stop
offset="0"
style="stop-color:#2583A6"
id="stop4624" /><stop
offset="0.5"
style="stop-color:#257EA3"
id="stop4626" /><stop
offset="1"
style="stop-color:#237AA0"
id="stop4628" /></linearGradient><path
d="m 427.217,177.532 c -6.278,0 -12.015,-1.107 -17.215,-3.312 -5.189,-2.209 -9.647,-5.215 -13.372,-9.017 -3.723,-3.797 -6.629,-8.232 -8.72,-13.318 -2.098,-5.078 -3.144,-10.482 -3.144,-16.224 v -0.232 c 0,-5.744 1.046,-11.143 3.144,-16.226 2.091,-5.083 5.036,-9.53 8.834,-13.373 3.802,-3.836 8.299,-6.884 13.497,-9.134 5.192,-2.238 10.929,-3.367 17.211,-3.367 6.276,0 12.017,1.106 17.209,3.312 5.197,2.211 9.653,5.217 13.374,9.018 3.724,3.799 6.632,8.233 8.724,13.311 2.094,5.081 3.141,10.489 3.141,16.228 v 0.233 c 0,5.733 -1.047,11.143 -3.141,16.218 -2.093,5.082 -5.038,9.544 -8.838,13.382 -3.8,3.842 -8.295,6.882 -13.49,9.12 -5.195,2.255 -10.932,3.381 -17.214,3.381 m 0.235,-13.142 c 4.013,0 7.694,-0.757 11.065,-2.272 3.354,-1.506 6.222,-3.564 8.627,-6.162 2.383,-2.595 4.269,-5.641 5.603,-9.126 1.356,-3.491 2.036,-7.213 2.036,-11.168 v -0.232 c 0,-3.952 -0.68,-7.692 -2.036,-11.222 -1.333,-3.529 -3.237,-6.593 -5.663,-9.19 -2.44,-2.591 -5.352,-4.673 -8.743,-6.224 -3.406,-1.55 -7.107,-2.323 -11.124,-2.323 -4.013,0 -7.691,0.752 -11.063,2.269 -3.356,1.509 -6.226,3.563 -8.627,6.159 -2.388,2.601 -4.268,5.649 -5.602,9.141 -1.355,3.486 -2.036,7.206 -2.036,11.16 v 0.233 c 0,3.956 0.679,7.69 2.036,11.222 1.334,3.527 3.232,6.594 5.658,9.188 2.444,2.598 5.352,4.672 8.743,6.218 3.411,1.553 7.109,2.329 11.126,2.329 z"
id="path4631"
inkscape:connector-curvature="0"
style="fill:url(#SVGID_2_)" /><linearGradient
id="SVGID_3_"
gradientUnits="userSpaceOnUse"
x1="261.1416"
y1="281.26169"
x2="316.3848"
y2="281.26169"><stop
offset="0"
style="stop-color:#2583A6"
id="stop4633" /><stop
offset="0.5"
style="stop-color:#257EA3"
id="stop4635" /><stop
offset="1"
style="stop-color:#237AA0"
id="stop4637" /></linearGradient><polygon
points="261.142,258.232 261.142,304.29 275.331,304.29 275.331,271.142 316.385,271.142 316.385,258.232 275.331,258.232 "
id="polygon4640"
style="fill:url(#SVGID_3_)"
transform="translate(-21.05,-128.155)" /><linearGradient
id="SVGID_4_"
gradientUnits="userSpaceOnUse"
x1="291.3779"
y1="235.7881"
x2="291.3779"
y2="222.88181"><stop
offset="0"
style="stop-color:#2583A6"
id="stop4642" /><stop
offset="0.5"
style="stop-color:#257EA3"
id="stop4644" /><stop
offset="1"
style="stop-color:#237AA0"
id="stop4646" /></linearGradient><polygon
points="261.142,222.882 261.142,235.788 275.331,235.788 321.614,235.788 321.614,222.882 "
id="polygon4649"
style="fill:url(#SVGID_4_)"
transform="translate(-21.05,-128.155)" /><linearGradient
id="SVGID_5_"
gradientUnits="userSpaceOnUse"
x1="125.481"
y1="341.00101"
x2="125.4809"
y2="128.05569"
gradientTransform="translate(-21.05,-128.155)"><stop
offset="0"
style="stop-color:#2583A6"
id="stop4651" /><stop
offset="0.5"
style="stop-color:#257EA3"
id="stop4653" /><stop
offset="1"
style="stop-color:#237AA0"
id="stop4655" /></linearGradient><path
d="m 104.43,151.572 c -12.005,15.862 -12.005,31.461 0,46.797 12.01,-15.336 12.009,-30.935 0,-46.797 m 0,-129.492 c -27.559,34.767 -27.559,70.133 0,106.11 27.566,-35.977 27.564,-71.344 0,-106.11 z M 42.006,177.043 C 52.166,153.951 73.451,142.555 97.22,142.842 67.063,111.547 40.869,98.934 18.64,105.024 21.594,122.279 33.596,136.941 54.639,149.021 30.427,141.376 12.211,122.884 0,93.543 36.328,87.372 64.932,96.328 85.813,120.389 66.772,79.675 72.972,39.513 104.428,-0.1 c 31.459,39.613 37.663,79.774 18.622,120.489 20.883,-24.062 49.485,-33.018 85.812,-26.846 -12.211,29.341 -30.423,47.834 -54.637,55.478 21.044,-12.08 33.042,-26.742 35.999,-43.997 -22.23,-6.089 -48.425,6.524 -78.581,37.818 23.77,-0.287 45.053,11.11 55.215,34.201 -17.962,4.017 -32.733,1.268 -44.307,-8.254 12.642,6.396 23.558,7.348 32.737,2.861 -4.021,-12.157 -21.792,-20.554 -44.521,-25.198 12.966,22.459 10.855,44.594 -6.338,66.394 -17.188,-21.8 -19.298,-43.935 -6.334,-66.394 -22.727,4.645 -40.5,13.041 -44.519,25.198 9.179,4.485 20.091,3.535 32.737,-2.861 -11.575,9.522 -26.345,12.271 -44.307,8.254 z"
id="path4658"
inkscape:connector-curvature="0"
style="fill:url(#SVGID_5_)" /></svg>

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="59pt" height="27pt" viewBox="0 0 59 27" version="1.1">
<defs>
<linearGradient id="linear0" gradientUnits="userSpaceOnUse" x1="337.43359" y1="263.58591" x2="394.418" y2="263.58591" gradientTransform="matrix(0.125532,0,0,0.126761,-2.642447,-16.245)">
<stop offset="0" style="stop-color:rgb(14.509804%,51.372549%,65.098039%);stop-opacity:1;"/>
<stop offset="0.5" style="stop-color:rgb(14.509804%,49.411765%,63.921569%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(13.72549%,47.843137%,62.745098%);stop-opacity:1;"/>
</linearGradient>
<linearGradient id="linear1" gradientUnits="userSpaceOnUse" x1="405.81641" y1="263.58591" x2="490.94919" y2="263.58591" gradientTransform="matrix(0.125532,0,0,0.126761,-2.642447,-16.245)">
<stop offset="0" style="stop-color:rgb(14.509804%,51.372549%,65.098039%);stop-opacity:1;"/>
<stop offset="0.5" style="stop-color:rgb(14.509804%,49.411765%,63.921569%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(13.72549%,47.843137%,62.745098%);stop-opacity:1;"/>
</linearGradient>
<linearGradient id="linear2" gradientUnits="userSpaceOnUse" x1="261.1416" y1="281.26169" x2="316.3848" y2="281.26169" gradientTransform="matrix(0.125532,0,0,0.126761,-2.642447,-16.245)">
<stop offset="0" style="stop-color:rgb(14.509804%,51.372549%,65.098039%);stop-opacity:1;"/>
<stop offset="0.5" style="stop-color:rgb(14.509804%,49.411765%,63.921569%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(13.72549%,47.843137%,62.745098%);stop-opacity:1;"/>
</linearGradient>
<linearGradient id="linear3" gradientUnits="userSpaceOnUse" x1="291.3779" y1="235.7881" x2="291.3779" y2="222.88181" gradientTransform="matrix(0.125532,0,0,0.126761,-2.642447,-16.245)">
<stop offset="0" style="stop-color:rgb(14.509804%,51.372549%,65.098039%);stop-opacity:1;"/>
<stop offset="0.5" style="stop-color:rgb(14.509804%,49.411765%,63.921569%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(13.72549%,47.843137%,62.745098%);stop-opacity:1;"/>
</linearGradient>
<linearGradient id="linear4" gradientUnits="userSpaceOnUse" x1="125.481" y1="341.00101" x2="125.4809" y2="128.05569" gradientTransform="matrix(0.125532,0,0,0.126761,-2.642447,-16.245)">
<stop offset="0" style="stop-color:rgb(14.509804%,51.372549%,65.098039%);stop-opacity:1;"/>
<stop offset="0.5" style="stop-color:rgb(14.509804%,49.411765%,63.921569%);stop-opacity:1;"/>
<stop offset="1" style="stop-color:rgb(13.72549%,47.843137%,62.745098%);stop-opacity:1;"/>
</linearGradient>
</defs>
<g id="surface1">
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear0);" d="M 46.871094 22.328125 L 39.714844 22.328125 L 39.714844 12.007812 L 41.496094 12.007812 L 41.496094 20.691406 L 46.871094 20.691406 Z M 46.871094 22.328125 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear1);" d="M 53.628906 22.503906 C 52.839844 22.503906 52.121094 22.363281 51.46875 22.085938 C 50.816406 21.804688 50.257812 21.421875 49.789062 20.941406 C 49.324219 20.460938 48.957031 19.898438 48.695312 19.253906 C 48.433594 18.609375 48.300781 17.925781 48.300781 17.195312 L 48.300781 17.167969 C 48.300781 16.4375 48.433594 15.753906 48.695312 15.109375 C 48.957031 14.464844 49.328125 13.902344 49.804688 13.414062 C 50.28125 12.929688 50.847656 12.542969 51.5 12.257812 C 52.148438 11.972656 52.871094 11.832031 53.660156 11.832031 C 54.445312 11.832031 55.167969 11.96875 55.820312 12.25 C 56.472656 12.53125 57.03125 12.910156 57.496094 13.394531 C 57.964844 13.875 58.332031 14.4375 58.59375 15.082031 C 58.855469 15.726562 58.988281 16.410156 58.988281 17.136719 L 58.988281 17.167969 C 58.988281 17.894531 58.855469 18.578125 58.59375 19.222656 C 58.332031 19.867188 57.960938 20.433594 57.484375 20.917969 C 57.007812 21.40625 56.441406 21.792969 55.789062 22.074219 C 55.136719 22.359375 54.417969 22.503906 53.628906 22.503906 M 53.660156 20.839844 C 54.164062 20.839844 54.625 20.742188 55.046875 20.550781 C 55.46875 20.359375 55.828125 20.097656 56.128906 19.769531 C 56.429688 19.441406 56.667969 19.054688 56.835938 18.613281 C 57.003906 18.167969 57.089844 17.699219 57.089844 17.195312 L 57.089844 17.167969 C 57.089844 16.667969 57.003906 16.191406 56.835938 15.746094 C 56.667969 15.296875 56.429688 14.910156 56.125 14.578125 C 55.816406 14.25 55.453125 13.988281 55.027344 13.789062 C 54.597656 13.59375 54.132812 13.496094 53.628906 13.496094 C 53.125 13.496094 52.664062 13.589844 52.242188 13.785156 C 51.820312 13.976562 51.460938 14.234375 51.15625 14.566406 C 50.859375 14.894531 50.621094 15.28125 50.453125 15.722656 C 50.285156 16.164062 50.199219 16.636719 50.199219 17.136719 L 50.199219 17.167969 C 50.199219 17.667969 50.285156 18.140625 50.453125 18.589844 C 50.621094 19.039062 50.859375 19.425781 51.164062 19.753906 C 51.472656 20.085938 51.835938 20.347656 52.261719 20.542969 C 52.691406 20.738281 53.15625 20.839844 53.660156 20.839844 Z M 53.660156 20.839844 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear2);" d="M 30.140625 16.488281 L 30.140625 22.328125 L 31.921875 22.328125 L 31.921875 18.125 L 37.074219 18.125 L 37.074219 16.488281 Z M 30.140625 16.488281 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear3);" d="M 30.140625 12.007812 L 30.140625 13.644531 L 37.730469 13.644531 L 37.730469 12.007812 Z M 30.140625 12.007812 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:url(#linear4);" d="M 13.109375 19.214844 C 11.601562 21.222656 11.601562 23.203125 13.109375 25.144531 C 14.617188 23.203125 14.617188 21.222656 13.109375 19.214844 M 13.109375 2.800781 C 9.648438 7.207031 9.648438 11.6875 13.109375 16.25 C 16.570312 11.6875 16.570312 7.207031 13.109375 2.800781 Z M 5.273438 22.441406 C 6.546875 19.515625 9.21875 18.070312 12.203125 18.105469 C 8.417969 14.140625 5.128906 12.539062 2.339844 13.3125 C 2.710938 15.5 4.21875 17.359375 6.859375 18.890625 C 3.820312 17.921875 1.53125 15.578125 0 11.859375 C 4.558594 11.074219 8.152344 12.210938 10.773438 15.261719 C 8.382812 10.101562 9.160156 5.007812 13.109375 -0.0117188 C 17.058594 5.007812 17.835938 10.097656 15.445312 15.261719 C 18.066406 12.210938 21.660156 11.074219 26.21875 11.859375 C 24.6875 15.578125 22.398438 17.921875 19.359375 18.890625 C 22 17.359375 23.507812 15.5 23.878906 13.3125 C 21.089844 12.542969 17.800781 14.140625 14.015625 18.105469 C 17 18.070312 19.671875 19.515625 20.945312 22.441406 C 18.691406 22.953125 16.835938 22.601562 15.382812 21.394531 C 16.972656 22.207031 18.339844 22.328125 19.492188 21.757812 C 18.988281 20.21875 16.757812 19.152344 13.90625 18.5625 C 15.53125 21.410156 15.265625 24.21875 13.109375 26.980469 C 10.953125 24.21875 10.6875 21.410156 12.3125 18.5625 C 9.460938 19.152344 7.230469 20.21875 6.726562 21.757812 C 7.878906 22.328125 9.246094 22.207031 10.835938 21.394531 C 9.382812 22.601562 7.527344 22.953125 5.273438 22.441406 Z M 5.273438 22.441406 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

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 one or more lines are too long

3379
block.html

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1660
css/main.css Normal file

File diff suppressed because it is too large Load Diff

1
css/main.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1530
css/main.scss Normal file

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

6279
index.html

File diff suppressed because one or more lines are too long

Binary file not shown.

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));

1044
scripts/floBlockchainAPI.js Normal file

File diff suppressed because it is too large Load Diff

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 = {});

166
scripts/floTokenAPI.js Normal file
View File

@ -0,0 +1,166 @@
(function (EXPORTS) { //floTokenAPI v1.0.4a
/* 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))
});
}
function sendTokens_raw(privKey, receiverID, token, amount, utxo, vout, scriptPubKey) {
return new Promise((resolve, reject) => {
var trx = bitjs.transaction();
trx.addinput(utxo, vout, scriptPubKey)
trx.addoutput(receiverID, floBlockchainAPI.sendAmt);
trx.addflodata(`send ${amount} ${token}#`);
var signedTxHash = trx.sign(privKey, 1);
floBlockchainAPI.broadcastTx(signedTxHash)
.then(txid => resolve([receiverID, txid]))
.catch(error => reject([receiverID, error]))
})
}
//bulk transfer tokens
tokenAPI.bulkTransferTokens = function (sender, privKey, token, receivers) {
return new Promise((resolve, reject) => {
if (typeof receivers !== 'object')
return reject("receivers must be object in format {receiver1: amount1, receiver2:amount2...}")
let receiver_list = Object.keys(receivers), amount_list = Object.values(receivers);
let invalidReceivers = receiver_list.filter(id => !floCrypto.validateFloID(id));
let invalidAmount = amount_list.filter(val => typeof val !== 'number' || val <= 0);
if (invalidReceivers.length)
return reject(`Invalid receivers: ${invalidReceivers}`);
else if (invalidAmount.length)
return reject(`Invalid amounts: ${invalidAmount}`);
if (receiver_list.length == 0)
return reject("Receivers cannot be empty");
if (receiver_list.length == 1) {
let receiver = receiver_list[0], amount = amount_list[0];
floTokenAPI.sendToken(privKey, amount, receiver, "", token)
.then(txid => resolve({ success: { [receiver]: txid } }))
.catch(error => reject(error))
} else {
//check for token balance
floTokenAPI.getBalance(sender, token).then(token_balance => {
let total_token_amout = amount_list.reduce((a, e) => a + e, 0);
if (total_token_amout > token_balance)
return reject(`Insufficient ${token}# balance`);
//split utxos
floBlockchainAPI.splitUTXOs(sender, privKey, receiver_list.length).then(split_txid => {
//wait for the split utxo to get confirmation
floBlockchainAPI.waitForConfirmation(split_txid).then(split_tx => {
//send tokens using the split-utxo
var scriptPubKey = split_tx.vout[0].scriptPubKey.hex;
let promises = [];
for (let i in receiver_list)
promises.push(sendTokens_raw(privKey, receiver_list[i], token, amount_list[i], split_txid, i, scriptPubKey));
Promise.allSettled(promises).then(results => {
let success = Object.fromEntries(results.filter(r => r.status == 'fulfilled').map(r => r.value));
let failed = Object.fromEntries(results.filter(r => r.status == 'rejected').map(r => r.reason));
resolve({ success, failed });
})
}).catch(error => reject(error))
}).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 = {});

9975
scripts/lib.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

194
style.css
View File

@ -1,194 +0,0 @@
* {
box-sizing: border-box;
}
body {
background: #eceef1;
font-family: 'Slabo 27px', serif;
color: #333a45;
}
.wrapper {
margin: 5em auto;
max-width: 1000px;
background-color: #fff;
box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.06);
}
.header {
padding: 30px 30px 0;
text-align: center;
}
.header__title {
margin: 0;
text-transform: uppercase;
font-size: 2.5em;
font-weight: 500;
line-height: 1.1;
}
.header__subtitle {
margin: 0;
font-size: 1.5em;
color: #949fb0;
font-family: 'Yesteryear', cursive;
font-weight: 500;
line-height: 1.1;
}
.cards {
padding: 15px;
display: flex;
flex-flow: row wrap;
}
.cardcard {
margin: 15px;
width: calc((100% / 4) - 30px);
transition: all 0.2s ease-in-out;
}
@media screen and (max-width: 991px) {
.card {
width: calc((100% / 2) - 30px);
}
}
@media screen and (max-width: 767px) {
.card {
width: 100%;
}
}
.card:hover .card__inner {
background-color: #1abc9c;
-webkit-transform: scale(1.05);
transform: scale(1.05);
}
.card__inner {
width: 100%;
padding: 30px;
position: relative;
cursor: pointer;
background-color: #949fb0;
color: #eceef1;
font-size: 1.5em;
text-transform: uppercase;
text-align: center;
transition: all 0.2s ease-in-out;
}
.card__inner:after {
transition: all 0.3s ease-in-out;
}
.card__inner .fa {
width: 100%;
margin-top: .25em;
}
.card__expander {
transition: all 0.2s ease-in-out;
width: 100%;
position: relative;
border-style: solid;
border-width: thin;
text-align: left;
overflow:auto;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: center;
padding: 30px 15px 30px;
/*color: #5c34a2;
background-color: rgba(92, 52, 162, .1);*/
}
.card__expander .fa {
font-size: 0.75em;
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
}
.card__expander .fa:hover {
opacity: 0.9;
}
.card.is-collapsed .card__inner:after {
content: "";
opacity: 0;
}
.card.is-collapsed .card__expander {
max-height: 0;
min-height: 0;
overflow: hidden;
margin-top: 0;
opacity: 0;
}
.card.is-expanded .card__inner {
background-color: #1abc9c;
}
.card.is-expanded .card__inner:after {
content: "";
opacity: 1;
display: block;
height: 0;
width: 0;
position: absolute;
bottom: -30px;
left: calc(50% - 15px);
border-left: 15px solid transparent;
border-right: 15px solid transparent;
border-bottom: 15px solid #333a45;
}
.card.is-expanded .card__inner .fa:before {
content: "\f115";
}
.card.is-expanded .card__expander {
max-height: 1000px;
min-height: 200px;
overflow: visible;
margin-top: 30px;
opacity: 1;
}
.card.is-expanded:hover .card__inner {
-webkit-transform: scale(1);
transform: scale(1);
}
.card.is-inactive .card__inner {
pointer-events: none;
opacity: 0.5;
}
.card.is-inactive:hover .card__inner {
background-color: #949fb0;
-webkit-transform: scale(1);
transform: scale(1);
}
@media screen and (min-width: 992px) {
.card:nth-of-type(4n+2) .card__expander {
margin-left: calc(-100%);
}
.card:nth-of-type(4n+3) .card__expander {
margin-left: calc(-200%);
}
.card:nth-of-type(4n+4) .card__expander {
margin-left: calc(-300%);
}
.card:nth-of-type(4n+5) {
clear: left;
}
.card__expander {
width: calc(400%);
}
}
@media screen and (min-width: 768px) and (max-width: 991px) {
.card:nth-of-type(2n+2) .card__expander {
margin-left: calc(-100% - 30px);
}
.card:nth-of-type(2n+3) {
clear: left;
}
.card__expander {
width: calc(200% + 30px);
}
}

View File

@ -1,185 +0,0 @@
* {
box-sizing: border-box;
}
body {
background: #eceef1;
font-family: 'Slabo 27px', serif;
color: #333a45;
}
.wrapper {
margin: 5em auto;
max-width: 1000px;
background-color: #fff;
box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.06);
}
.header {
padding: 30px 30px 0;
text-align: center;
}
.header__title {
margin: 0;
text-transform: uppercase;
font-size: 2.5em;
font-weight: 500;
line-height: 1.1;
}
.header__subtitle {
margin: 0;
font-size: 1.5em;
color: #949fb0;
font-family: 'Yesteryear', cursive;
font-weight: 500;
line-height: 1.1;
}
.cards {
padding: 15px;
display: flex;
flex-flow: row wrap;
}
.card {
margin: 15px;
width: calc((100% / 3) - 30px);
transition: all 0.2s ease-in-out;
}
@media screen and (max-width: 991px) {
.card {
width: calc((100% / 2) - 30px);
}
}
@media screen and (max-width: 767px) {
.card {
width: 100%;
}
}
.card:hover .card__inner {
background-color: #1abc9c;
-webkit-transform: scale(1.05);
transform: scale(1.05);
}
.card__inner {
width: 100%;
padding: 30px;
position: relative;
cursor: pointer;
background-color: #949fb0;
color: #eceef1;
font-size: 1.5em;
text-transform: uppercase;
text-align: center;
transition: all 0.2s ease-in-out;
}
.card__inner:after {
transition: all 0.3s ease-in-out;
}
.card__inner .fa {
width: 100%;
margin-top: .25em;
}
.card__expander {
transition: all 0.2s ease-in-out;
background-color: #333a45;
width: 100%;
position: relative;
display: flex;
justify-content: center;
align-items: center;
text-transform: uppercase;
color: #eceef1;
font-size: 1.5em;
}
.card__expander .fa {
font-size: 0.75em;
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
}
.card__expander .fa:hover {
opacity: 0.9;
}
.card.is-collapsed .card__inner:after {
content: "";
opacity: 0;
}
.card.is-collapsed .card__expander {
max-height: 0;
min-height: 0;
overflow: hidden;
margin-top: 0;
opacity: 0;
}
.card.is-expanded .card__inner {
background-color: #1abc9c;
}
.card.is-expanded .card__inner:after {
content: "";
opacity: 1;
display: block;
height: 0;
width: 0;
position: absolute;
bottom: -30px;
left: calc(50% - 15px);
border-left: 15px solid transparent;
border-right: 15px solid transparent;
border-bottom: 15px solid #333a45;
}
.card.is-expanded .card__inner .fa:before {
content: "\f115";
}
.card.is-expanded .card__expander {
max-height: 1000px;
min-height: 200px;
overflow: visible;
margin-top: 30px;
opacity: 1;
}
.card.is-expanded:hover .card__inner {
-webkit-transform: scale(1);
transform: scale(1);
}
.card.is-inactive .card__inner {
pointer-events: none;
opacity: 0.5;
}
.card.is-inactive:hover .card__inner {
background-color: #949fb0;
-webkit-transform: scale(1);
transform: scale(1);
}
@media screen and (min-width: 992px) {
.card:nth-of-type(3n+2) .card__expander {
margin-left: calc(-100% - 30px);
}
.card:nth-of-type(3n+3) .card__expander {
margin-left: calc(-200% - 60px);
}
.card:nth-of-type(3n+4) {
clear: left;
}
.card__expander {
width: calc(300% + 60px);
}
}
@media screen and (min-width: 768px) and (max-width: 991px) {
.card:nth-of-type(2n+2) .card__expander {
margin-left: calc(-100% - 30px);
}
.card:nth-of-type(2n+3) {
clear: left;
}
.card__expander {
width: calc(200% + 30px);
}
}

2865
token.html

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long