Compare commits

...

No commits in common. "master" and "v1" have entirely different histories.
master ... v1

481 changed files with 23139 additions and 23767 deletions

5
.github/FUNDING.yml vendored
View File

@ -1,5 +0,0 @@
# These are supported funding model platforms
github: ping-pub
issuehunt: ping-pub # Replace with a single IssueHunt username

View File

@ -1,21 +0,0 @@
name: Config Checker
on:
# push:
# branches: [ master ]
pull_request:
# branches: [ master ]
paths:
- 'chains/mainnet/**'
- 'chains/testnet/**'
jobs:
deploy:
name: Check Blockchain Config
runs-on: ubuntu-latest
steps:
- name: Git Checkout Latest
uses: actions/checkout@v3
- name: Check Chain Configs
uses: ping-pub/ping-dashboard-config-checker@v1.0

View File

@ -1,51 +0,0 @@
name: docker
on:
push:
branches:
- 'master-backup'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
# -
# name: Set up QEMU
# uses: docker/setup-qemu-action@v1
# -
# name: Set up Docker Buildx
# uses: docker/setup-buildx-action@v1
- name: Install
run: yarn install
- name: Build
run: yarn run vue-cli-service build
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v3
with:
# list of Docker images to use as base name for tags
images: |
yaoling/wallet
# generate Docker tags based on the following events/attributes
tags: |
type=sha
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

View File

@ -1,28 +0,0 @@
name: Deploy to ping.pub
on:
push:
branches: [ master2 ]
# pull_request:
# branches: [ master ]
jobs:
deploy:
name: Ping deploy
runs-on: mainnet
steps:
- name: Environment
run: export NODE_OPTIONS="--max_old_space_size=4096"
- name: Git Checkout Latest
uses: actions/checkout@v3
- name: Install
run: yarn install --ignore-engines
- name: Build
run: yarn build
- name: Deploy
run: cp -rf ./dist/* /var/www/html/

24
.github/workflows/node.js.yml vendored Normal file
View File

@ -0,0 +1,24 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Look CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
deploy:
name: Look deploy
runs-on: self-hosted
steps:
- name: Git Checkout master
uses: actions/checkout@master
- name: PM2 status
run: pm2 status
- name: deploy
run: cd server && npm i && npm run start

View File

@ -1,27 +0,0 @@
name: Testnet Deploy
on:
push:
branches: [ testnet ]
pull_request:
branches: [ testnet ]
jobs:
deploy:
name: Ping deploy
runs-on: testnet
steps:
- name: print
run: echo ${GITHUB_REF#refs/heads/}
- name: Git Checkout Latest
uses: actions/checkout@v2
- name: Install
run: yarn install
- name: Build
run: yarn run vue-cli-service build
- name: Deploy
run: cp -rf ./dist/* /var/www/html/

26
.gitignore vendored
View File

@ -1,5 +1,21 @@
node_modules/
**/.vscode
yarn-error.log
dist
.idea
.DS_Store
node_modules
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
package-lock.json

View File

@ -1,9 +0,0 @@
{
"tabWidth": 2,
"singleQuote": true,
"semi": true,
"endOfLine": "auto",
"bracketSpacing": true,
"TrailingCooma": true,
"arrowParens": "always"
}

339
LICENSE
View File

@ -1,339 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

104
README.md
View File

@ -1,56 +1,72 @@
<div align="center">
# LOOK Explorer
![Ping Wallet](./public/logo.svg)
Look is a light explorer for Cosmos-based Blockchains. https://look.ping.pub .
<h1>Ping Dashboard</h1>
## What is the difference between Look and other explorers?
**Ping Dashboard is not only an explorer but also a wallet and more ... 🛠**
Look is designed to explore blockchain data as real as possible, therefore there is no cache, no analysis. Look does not cache/save blockchain data on its server. Look only fetch data from Cosmos full node via LCD/RPC endpoints. We call it "Light Explorer".
[![version](https://img.shields.io/github/tag/ping-pub/explorer.svg)](https://github.com/ping-pub/explorer/releases/latest)
[![GitHub](https://img.shields.io/github/license/ping-pub/explorer.svg)](https://github.com/ping-pub/explorer/blob/master/LICENSE)
[![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/bukotsunikki.svg?style=social&label=Follow%20%40ping_pub)](https://twitter.com/ping_pub)
[![https://discord.gg/CmjYVSr6GW](https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat)](https://discord.gg/CmjYVSr6GW)
## Do you want Look to explore your blockchain?
If you want Look to explore your blockchain, pull a request [here](https://github.com/liangping/look/issues), We will explore your chains as soon as possibe. And the most important thing is that Look is free for all public cosmos-based blockchains.
</div>
`Ping Dashboard` is a light explorer for Cosmos-based Blockchains. https://ping.pub .
## What sets Ping Dashboard apart from other explorers?
**Ping Dashboard** stands out by providing a real-time exploration of blockchain data without relying on caching or pre-processing. It exclusively fetches data from the Cosmos full node via LCD/RPC endpoints, ensuring a truly authentic experience. This approach is referred to as the "Light Explorer."
## Are you interested in listing your blockchain on https://ping.pub?
To make this repository clean, please submit your request to https://github.com/ping-pub/ping.pub.git
## Why does Ping Dashboard rely on official/trusted third-party public LCD/RPC servers?
There are two primary reasons for this choice:
- Trust: In a decentralized system, it is crucial to avoid relying solely on a single entity. By utilizing official/trusted third-party public LCD/RPC servers, Ping Dashboard ensures that the data is sourced from a network of trusted participants.
- Limited Resources: As Ping Dashboard plans to list hundreds of Cosmos-based blockchains in the future, it is impractical for the Ping team to operate validators or full nodes for all of them. Leveraging trusted third-party servers allows for more efficient resource allocation.
## Donation
Your donation will help us make better products. Thanks in advance.
- Address for ERC20: USDC, USDT, ETH
```
0x88BFec573Dd3E4b7d2E6BfD4D0D6B11F843F8aa1
```
#### Donations from project
- Point Network: 1000USDC and $1000 worth of POINT
- Bitsong: 50k BTSG
- IRISnet: 100k IRIS
## Hire us
You can hire us by submitting an issue and fund the issue on [IssueHunter](https://issuehunt.io/r/ping-pub/explorer)
## Why LOOK explorer use official/trusted third party public LCD/rpc server?
We have two considerations: 1, Trust, In decentralize system, everything controled by one single team/orgnization could be risks. So we decided to co-build LOOK explorer with the community. 2. Look explorer will explose handreds and thousands cosmos-based blockchains in the future, it's impossible for our team to run validators or fullnodes for all of those chains.
## Contributors
Developers: @liangping @dingyiming
Data providers: [full list](https://github.com/ping-pub/look/blob/master/hosts.json)
* irisnet.org,
* nylira.net,
* 01node.com,
* kava.io
*If you don't want to provide data services for LOOK exporer, let us know.*
## Blockchains on LOOK explorer:
* https://cosmos.ping.pub
* https://iris.ping.pub
* https://kava.ping.pub
* https://sentinel.ping.pub
# LOOK 浏览器
Look是一个轻浏览器免费为所有的基于Cosmos-SDK开发的区块链提供浏览服务
## Look 和其他区块链浏览器有什么不同?
Look的设计理念是尽可能的保持数据的真实性所以他不会在服务器端缓存或者保存任何数据也不会增加任何分析处理。它仅仅通过LCD/RPC来获取他所需要的所有数据。因此我们叫它“轻浏览器”。
## 你希望Look来浏览你的区块链吗
如果你需要Look来浏览你的区块链请在[这里](https://github.com/liangping/look/issues) 提交申请,我们会尽快开通。而且是免费的。
## 为什么LOOK要使用官方或者可信赖的第三方的LCD/RPC服务器?
我们主要是基于以下两个考虑1可信在去中心化的系统里任何有一个由单个团队或者实体控制的事情都是有风险的所以我们选择和社区一起来共建LOOK浏览器。2LOOK浏览器计划在未来支持成百上千条区块链因此对我们团队来说不可能为所有这些链去提供一个验证人节点或者全节点。
## 项目贡献者
开发者: @liangping @dingyiming
数据服务方: [列表](https://github.com/ping-pub/look/blob/master/hosts.json)
* irisnet.org,
* nylira.net,
* 01node.com,
* kava.io
*如果你觉得我们滥用了你的服务器资源,请告知我们。*
## LOOK explorer 上的区块链:
* https://cosmos.ping.pub
* https://iris.ping.pub
* https://kava.ping.pub
* https://sentinel.ping.pub
# Contact Us
Email18786721#qq.com

606
auto-imports.d.ts vendored
View File

@ -1,606 +0,0 @@
// Generated by 'unplugin-auto-import'
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
const computed: typeof import('vue')['computed']
const computedAsync: typeof import('@vueuse/core')['computedAsync']
const computedEager: typeof import('@vueuse/core')['computedEager']
const computedInject: typeof import('@vueuse/core')['computedInject']
const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
const controlledRef: typeof import('@vueuse/core')['controlledRef']
const createApp: typeof import('vue')['createApp']
const createEventHook: typeof import('@vueuse/core')['createEventHook']
const createGenericProjection: typeof import('@vueuse/math')['createGenericProjection']
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
const createPinia: typeof import('pinia')['createPinia']
const createProjection: typeof import('@vueuse/math')['createProjection']
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
const customRef: typeof import('vue')['customRef']
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const defineStore: typeof import('pinia')['defineStore']
const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
const effectScope: typeof import('vue')['effectScope']
const extendRef: typeof import('@vueuse/core')['extendRef']
const getActivePinia: typeof import('pinia')['getActivePinia']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
const inject: typeof import('vue')['inject']
const isDefined: typeof import('@vueuse/core')['isDefined']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const logicAnd: typeof import('@vueuse/math')['logicAnd']
const logicNot: typeof import('@vueuse/math')['logicNot']
const logicOr: typeof import('@vueuse/math')['logicOr']
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
const mapActions: typeof import('pinia')['mapActions']
const mapGetters: typeof import('pinia')['mapGetters']
const mapState: typeof import('pinia')['mapState']
const mapStores: typeof import('pinia')['mapStores']
const mapWritableState: typeof import('pinia')['mapWritableState']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
const onLongPress: typeof import('@vueuse/core')['onLongPress']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
const provide: typeof import('vue')['provide']
const reactify: typeof import('@vueuse/core')['reactify']
const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
const reactive: typeof import('vue')['reactive']
const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
const reactivePick: typeof import('@vueuse/core')['reactivePick']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
const refDebounced: typeof import('@vueuse/core')['refDebounced']
const refDefault: typeof import('@vueuse/core')['refDefault']
const refThrottled: typeof import('@vueuse/core')['refThrottled']
const refWithControl: typeof import('@vueuse/core')['refWithControl']
const resolveComponent: typeof import('vue')['resolveComponent']
const resolveDirective: typeof import('vue')['resolveDirective']
const resolveRef: typeof import('@vueuse/core')['resolveRef']
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
const setActivePinia: typeof import('pinia')['setActivePinia']
const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const storeToRefs: typeof import('pinia')['storeToRefs']
const syncRef: typeof import('@vueuse/core')['syncRef']
const syncRefs: typeof import('@vueuse/core')['syncRefs']
const templateRef: typeof import('@vueuse/core')['templateRef']
const throttledRef: typeof import('@vueuse/core')['throttledRef']
const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
const toRaw: typeof import('vue')['toRaw']
const toReactive: typeof import('@vueuse/core')['toReactive']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const triggerRef: typeof import('vue')['triggerRef']
const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
const unref: typeof import('vue')['unref']
const unrefElement: typeof import('@vueuse/core')['unrefElement']
const until: typeof import('@vueuse/core')['until']
const useAbs: typeof import('@vueuse/math')['useAbs']
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
const useArraySome: typeof import('@vueuse/core')['useArraySome']
const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
const useAttrs: typeof import('vue')['useAttrs']
const useAverage: typeof import('@vueuse/math')['useAverage']
const useBase64: typeof import('@vueuse/core')['useBase64']
const useBattery: typeof import('@vueuse/core')['useBattery']
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
const useCached: typeof import('@vueuse/core')['useCached']
const useCeil: typeof import('@vueuse/math')['useCeil']
const useClamp: typeof import('@vueuse/math')['useClamp']
const useClipboard: typeof import('@vueuse/core')['useClipboard']
const useCloned: typeof import('@vueuse/core')['useCloned']
const useColorMode: typeof import('@vueuse/core')['useColorMode']
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
const useCounter: typeof import('@vueuse/core')['useCounter']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVar: typeof import('@vueuse/core')['useCssVar']
const useCssVars: typeof import('vue')['useCssVars']
const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
const useCycleList: typeof import('@vueuse/core')['useCycleList']
const useDark: typeof import('@vueuse/core')['useDark']
const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
const useDebounce: typeof import('@vueuse/core')['useDebounce']
const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
const useDraggable: typeof import('@vueuse/core')['useDraggable']
const useDropZone: typeof import('@vueuse/core')['useDropZone']
const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
const useElementHover: typeof import('@vueuse/core')['useElementHover']
const useElementSize: typeof import('@vueuse/core')['useElementSize']
const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
const useEventBus: typeof import('@vueuse/core')['useEventBus']
const useEventListener: typeof import('@vueuse/core')['useEventListener']
const useEventSource: typeof import('@vueuse/core')['useEventSource']
const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
const useFavicon: typeof import('@vueuse/core')['useFavicon']
const useFetch: typeof import('@vueuse/core')['useFetch']
const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
const useFloor: typeof import('@vueuse/math')['useFloor']
const useFocus: typeof import('@vueuse/core')['useFocus']
const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
const useFps: typeof import('@vueuse/core')['useFps']
const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
const useGamepad: typeof import('@vueuse/core')['useGamepad']
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
const useI18n: typeof import('vue-i18n')['useI18n']
const useIdle: typeof import('@vueuse/core')['useIdle']
const useImage: typeof import('@vueuse/core')['useImage']
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
const useInterval: typeof import('@vueuse/core')['useInterval']
const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
const useLink: typeof import('vue-router')['useLink']
const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
const useMath: typeof import('@vueuse/math')['useMath']
const useMax: typeof import('@vueuse/math')['useMax']
const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
const useMemoize: typeof import('@vueuse/core')['useMemoize']
const useMemory: typeof import('@vueuse/core')['useMemory']
const useMin: typeof import('@vueuse/math')['useMin']
const useMounted: typeof import('@vueuse/core')['useMounted']
const useMouse: typeof import('@vueuse/core')['useMouse']
const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
const useNetwork: typeof import('@vueuse/core')['useNetwork']
const useNow: typeof import('@vueuse/core')['useNow']
const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
const useOnline: typeof import('@vueuse/core')['useOnline']
const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
const useParallax: typeof import('@vueuse/core')['useParallax']
const usePermission: typeof import('@vueuse/core')['usePermission']
const usePointer: typeof import('@vueuse/core')['usePointer']
const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
const usePrecision: typeof import('@vueuse/math')['usePrecision']
const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
const usePrevious: typeof import('@vueuse/core')['usePrevious']
const useProjection: typeof import('@vueuse/math')['useProjection']
const useRafFn: typeof import('@vueuse/core')['useRafFn']
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
const useRound: typeof import('@vueuse/math')['useRound']
const useRoute: typeof import('vue-router')['useRoute']
const useRouter: typeof import('vue-router')['useRouter']
const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
const useScroll: typeof import('@vueuse/core')['useScroll']
const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
const useShare: typeof import('@vueuse/core')['useShare']
const useSlots: typeof import('vue')['useSlots']
const useSorted: typeof import('@vueuse/core')['useSorted']
const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
const useStepper: typeof import('@vueuse/core')['useStepper']
const useStorage: typeof import('@vueuse/core')['useStorage']
const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
const useSum: typeof import('@vueuse/math')['useSum']
const useSupported: typeof import('@vueuse/core')['useSupported']
const useSwipe: typeof import('@vueuse/core')['useSwipe']
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
const useThrottle: typeof import('@vueuse/core')['useThrottle']
const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
const useTimeout: typeof import('@vueuse/core')['useTimeout']
const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
const useTitle: typeof import('@vueuse/core')['useTitle']
const useToFixed: typeof import('@vueuse/math')['useToFixed']
const useToNumber: typeof import('@vueuse/core')['useToNumber']
const useToString: typeof import('@vueuse/core')['useToString']
const useToggle: typeof import('@vueuse/core')['useToggle']
const useTransition: typeof import('@vueuse/core')['useTransition']
const useTrunc: typeof import('@vueuse/math')['useTrunc']
const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
const useVModel: typeof import('@vueuse/core')['useVModel']
const useVModels: typeof import('@vueuse/core')['useVModels']
const useVibrate: typeof import('@vueuse/core')['useVibrate']
const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
const watch: typeof import('vue')['watch']
const watchArray: typeof import('@vueuse/core')['watchArray']
const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
const watchEffect: typeof import('vue')['watchEffect']
const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
const watchOnce: typeof import('@vueuse/core')['watchOnce']
const watchPausable: typeof import('@vueuse/core')['watchPausable']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
const whenever: typeof import('@vueuse/core')['whenever']
}
// for vue template auto import
import { UnwrapRef } from 'vue'
declare module 'vue' {
interface ComponentCustomProperties {
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
readonly computed: UnwrapRef<typeof import('vue')['computed']>
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
readonly computedInject: UnwrapRef<typeof import('@vueuse/core')['computedInject']>
readonly computedWithControl: UnwrapRef<typeof import('@vueuse/core')['computedWithControl']>
readonly controlledComputed: UnwrapRef<typeof import('@vueuse/core')['controlledComputed']>
readonly controlledRef: UnwrapRef<typeof import('@vueuse/core')['controlledRef']>
readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
readonly createEventHook: UnwrapRef<typeof import('@vueuse/core')['createEventHook']>
readonly createGenericProjection: UnwrapRef<typeof import('@vueuse/math')['createGenericProjection']>
readonly createGlobalState: UnwrapRef<typeof import('@vueuse/core')['createGlobalState']>
readonly createInjectionState: UnwrapRef<typeof import('@vueuse/core')['createInjectionState']>
readonly createPinia: UnwrapRef<typeof import('pinia')['createPinia']>
readonly createProjection: UnwrapRef<typeof import('@vueuse/math')['createProjection']>
readonly createReactiveFn: UnwrapRef<typeof import('@vueuse/core')['createReactiveFn']>
readonly createSharedComposable: UnwrapRef<typeof import('@vueuse/core')['createSharedComposable']>
readonly createUnrefFn: UnwrapRef<typeof import('@vueuse/core')['createUnrefFn']>
readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
readonly debouncedRef: UnwrapRef<typeof import('@vueuse/core')['debouncedRef']>
readonly debouncedWatch: UnwrapRef<typeof import('@vueuse/core')['debouncedWatch']>
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']>
readonly eagerComputed: UnwrapRef<typeof import('@vueuse/core')['eagerComputed']>
readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
readonly extendRef: UnwrapRef<typeof import('@vueuse/core')['extendRef']>
readonly getActivePinia: UnwrapRef<typeof import('pinia')['getActivePinia']>
readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
readonly h: UnwrapRef<typeof import('vue')['h']>
readonly ignorableWatch: UnwrapRef<typeof import('@vueuse/core')['ignorableWatch']>
readonly inject: UnwrapRef<typeof import('vue')['inject']>
readonly isDefined: UnwrapRef<typeof import('@vueuse/core')['isDefined']>
readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']>
readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
readonly logicAnd: UnwrapRef<typeof import('@vueuse/math')['logicAnd']>
readonly logicNot: UnwrapRef<typeof import('@vueuse/math')['logicNot']>
readonly logicOr: UnwrapRef<typeof import('@vueuse/math')['logicOr']>
readonly makeDestructurable: UnwrapRef<typeof import('@vueuse/core')['makeDestructurable']>
readonly mapActions: UnwrapRef<typeof import('pinia')['mapActions']>
readonly mapGetters: UnwrapRef<typeof import('pinia')['mapGetters']>
readonly mapState: UnwrapRef<typeof import('pinia')['mapState']>
readonly mapStores: UnwrapRef<typeof import('pinia')['mapStores']>
readonly mapWritableState: UnwrapRef<typeof import('pinia')['mapWritableState']>
readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']>
readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router')['onBeforeRouteLeave']>
readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router')['onBeforeRouteUpdate']>
readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']>
readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']>
readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']>
readonly onKeyStroke: UnwrapRef<typeof import('@vueuse/core')['onKeyStroke']>
readonly onLongPress: UnwrapRef<typeof import('@vueuse/core')['onLongPress']>
readonly onMounted: UnwrapRef<typeof import('vue')['onMounted']>
readonly onRenderTracked: UnwrapRef<typeof import('vue')['onRenderTracked']>
readonly onRenderTriggered: UnwrapRef<typeof import('vue')['onRenderTriggered']>
readonly onScopeDispose: UnwrapRef<typeof import('vue')['onScopeDispose']>
readonly onServerPrefetch: UnwrapRef<typeof import('vue')['onServerPrefetch']>
readonly onStartTyping: UnwrapRef<typeof import('@vueuse/core')['onStartTyping']>
readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']>
readonly provide: UnwrapRef<typeof import('vue')['provide']>
readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']>
readonly reactifyObject: UnwrapRef<typeof import('@vueuse/core')['reactifyObject']>
readonly reactive: UnwrapRef<typeof import('vue')['reactive']>
readonly reactiveComputed: UnwrapRef<typeof import('@vueuse/core')['reactiveComputed']>
readonly reactiveOmit: UnwrapRef<typeof import('@vueuse/core')['reactiveOmit']>
readonly reactivePick: UnwrapRef<typeof import('@vueuse/core')['reactivePick']>
readonly readonly: UnwrapRef<typeof import('vue')['readonly']>
readonly ref: UnwrapRef<typeof import('vue')['ref']>
readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']>
readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']>
readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
readonly resolveDirective: UnwrapRef<typeof import('vue')['resolveDirective']>
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
readonly setActivePinia: UnwrapRef<typeof import('pinia')['setActivePinia']>
readonly setMapStoreSuffix: UnwrapRef<typeof import('pinia')['setMapStoreSuffix']>
readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
readonly storeToRefs: UnwrapRef<typeof import('pinia')['storeToRefs']>
readonly syncRef: UnwrapRef<typeof import('@vueuse/core')['syncRef']>
readonly syncRefs: UnwrapRef<typeof import('@vueuse/core')['syncRefs']>
readonly templateRef: UnwrapRef<typeof import('@vueuse/core')['templateRef']>
readonly throttledRef: UnwrapRef<typeof import('@vueuse/core')['throttledRef']>
readonly throttledWatch: UnwrapRef<typeof import('@vueuse/core')['throttledWatch']>
readonly toRaw: UnwrapRef<typeof import('vue')['toRaw']>
readonly toReactive: UnwrapRef<typeof import('@vueuse/core')['toReactive']>
readonly toRef: UnwrapRef<typeof import('vue')['toRef']>
readonly toRefs: UnwrapRef<typeof import('vue')['toRefs']>
readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']>
readonly tryOnBeforeMount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeMount']>
readonly tryOnBeforeUnmount: UnwrapRef<typeof import('@vueuse/core')['tryOnBeforeUnmount']>
readonly tryOnMounted: UnwrapRef<typeof import('@vueuse/core')['tryOnMounted']>
readonly tryOnScopeDispose: UnwrapRef<typeof import('@vueuse/core')['tryOnScopeDispose']>
readonly tryOnUnmounted: UnwrapRef<typeof import('@vueuse/core')['tryOnUnmounted']>
readonly unref: UnwrapRef<typeof import('vue')['unref']>
readonly unrefElement: UnwrapRef<typeof import('@vueuse/core')['unrefElement']>
readonly until: UnwrapRef<typeof import('@vueuse/core')['until']>
readonly useAbs: UnwrapRef<typeof import('@vueuse/math')['useAbs']>
readonly useActiveElement: UnwrapRef<typeof import('@vueuse/core')['useActiveElement']>
readonly useArrayEvery: UnwrapRef<typeof import('@vueuse/core')['useArrayEvery']>
readonly useArrayFilter: UnwrapRef<typeof import('@vueuse/core')['useArrayFilter']>
readonly useArrayFind: UnwrapRef<typeof import('@vueuse/core')['useArrayFind']>
readonly useArrayFindIndex: UnwrapRef<typeof import('@vueuse/core')['useArrayFindIndex']>
readonly useArrayFindLast: UnwrapRef<typeof import('@vueuse/core')['useArrayFindLast']>
readonly useArrayJoin: UnwrapRef<typeof import('@vueuse/core')['useArrayJoin']>
readonly useArrayMap: UnwrapRef<typeof import('@vueuse/core')['useArrayMap']>
readonly useArrayReduce: UnwrapRef<typeof import('@vueuse/core')['useArrayReduce']>
readonly useArraySome: UnwrapRef<typeof import('@vueuse/core')['useArraySome']>
readonly useArrayUnique: UnwrapRef<typeof import('@vueuse/core')['useArrayUnique']>
readonly useAsyncQueue: UnwrapRef<typeof import('@vueuse/core')['useAsyncQueue']>
readonly useAsyncState: UnwrapRef<typeof import('@vueuse/core')['useAsyncState']>
readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']>
readonly useAverage: UnwrapRef<typeof import('@vueuse/math')['useAverage']>
readonly useBase64: UnwrapRef<typeof import('@vueuse/core')['useBase64']>
readonly useBattery: UnwrapRef<typeof import('@vueuse/core')['useBattery']>
readonly useBluetooth: UnwrapRef<typeof import('@vueuse/core')['useBluetooth']>
readonly useBreakpoints: UnwrapRef<typeof import('@vueuse/core')['useBreakpoints']>
readonly useBroadcastChannel: UnwrapRef<typeof import('@vueuse/core')['useBroadcastChannel']>
readonly useBrowserLocation: UnwrapRef<typeof import('@vueuse/core')['useBrowserLocation']>
readonly useCached: UnwrapRef<typeof import('@vueuse/core')['useCached']>
readonly useCeil: UnwrapRef<typeof import('@vueuse/math')['useCeil']>
readonly useClamp: UnwrapRef<typeof import('@vueuse/math')['useClamp']>
readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']>
readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']>
readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']>
readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']>
readonly useCounter: UnwrapRef<typeof import('@vueuse/core')['useCounter']>
readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
readonly useCssVar: UnwrapRef<typeof import('@vueuse/core')['useCssVar']>
readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
readonly useCurrentElement: UnwrapRef<typeof import('@vueuse/core')['useCurrentElement']>
readonly useCycleList: UnwrapRef<typeof import('@vueuse/core')['useCycleList']>
readonly useDark: UnwrapRef<typeof import('@vueuse/core')['useDark']>
readonly useDateFormat: UnwrapRef<typeof import('@vueuse/core')['useDateFormat']>
readonly useDebounce: UnwrapRef<typeof import('@vueuse/core')['useDebounce']>
readonly useDebounceFn: UnwrapRef<typeof import('@vueuse/core')['useDebounceFn']>
readonly useDebouncedRefHistory: UnwrapRef<typeof import('@vueuse/core')['useDebouncedRefHistory']>
readonly useDeviceMotion: UnwrapRef<typeof import('@vueuse/core')['useDeviceMotion']>
readonly useDeviceOrientation: UnwrapRef<typeof import('@vueuse/core')['useDeviceOrientation']>
readonly useDevicePixelRatio: UnwrapRef<typeof import('@vueuse/core')['useDevicePixelRatio']>
readonly useDevicesList: UnwrapRef<typeof import('@vueuse/core')['useDevicesList']>
readonly useDisplayMedia: UnwrapRef<typeof import('@vueuse/core')['useDisplayMedia']>
readonly useDocumentVisibility: UnwrapRef<typeof import('@vueuse/core')['useDocumentVisibility']>
readonly useDraggable: UnwrapRef<typeof import('@vueuse/core')['useDraggable']>
readonly useDropZone: UnwrapRef<typeof import('@vueuse/core')['useDropZone']>
readonly useElementBounding: UnwrapRef<typeof import('@vueuse/core')['useElementBounding']>
readonly useElementByPoint: UnwrapRef<typeof import('@vueuse/core')['useElementByPoint']>
readonly useElementHover: UnwrapRef<typeof import('@vueuse/core')['useElementHover']>
readonly useElementSize: UnwrapRef<typeof import('@vueuse/core')['useElementSize']>
readonly useElementVisibility: UnwrapRef<typeof import('@vueuse/core')['useElementVisibility']>
readonly useEventBus: UnwrapRef<typeof import('@vueuse/core')['useEventBus']>
readonly useEventListener: UnwrapRef<typeof import('@vueuse/core')['useEventListener']>
readonly useEventSource: UnwrapRef<typeof import('@vueuse/core')['useEventSource']>
readonly useEyeDropper: UnwrapRef<typeof import('@vueuse/core')['useEyeDropper']>
readonly useFavicon: UnwrapRef<typeof import('@vueuse/core')['useFavicon']>
readonly useFetch: UnwrapRef<typeof import('@vueuse/core')['useFetch']>
readonly useFileDialog: UnwrapRef<typeof import('@vueuse/core')['useFileDialog']>
readonly useFileSystemAccess: UnwrapRef<typeof import('@vueuse/core')['useFileSystemAccess']>
readonly useFloor: UnwrapRef<typeof import('@vueuse/math')['useFloor']>
readonly useFocus: UnwrapRef<typeof import('@vueuse/core')['useFocus']>
readonly useFocusWithin: UnwrapRef<typeof import('@vueuse/core')['useFocusWithin']>
readonly useFps: UnwrapRef<typeof import('@vueuse/core')['useFps']>
readonly useFullscreen: UnwrapRef<typeof import('@vueuse/core')['useFullscreen']>
readonly useGamepad: UnwrapRef<typeof import('@vueuse/core')['useGamepad']>
readonly useGeolocation: UnwrapRef<typeof import('@vueuse/core')['useGeolocation']>
readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']>
readonly useIdle: UnwrapRef<typeof import('@vueuse/core')['useIdle']>
readonly useImage: UnwrapRef<typeof import('@vueuse/core')['useImage']>
readonly useInfiniteScroll: UnwrapRef<typeof import('@vueuse/core')['useInfiniteScroll']>
readonly useIntersectionObserver: UnwrapRef<typeof import('@vueuse/core')['useIntersectionObserver']>
readonly useInterval: UnwrapRef<typeof import('@vueuse/core')['useInterval']>
readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
readonly useLink: UnwrapRef<typeof import('vue-router')['useLink']>
readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
readonly useMagicKeys: UnwrapRef<typeof import('@vueuse/core')['useMagicKeys']>
readonly useManualRefHistory: UnwrapRef<typeof import('@vueuse/core')['useManualRefHistory']>
readonly useMath: UnwrapRef<typeof import('@vueuse/math')['useMath']>
readonly useMax: UnwrapRef<typeof import('@vueuse/math')['useMax']>
readonly useMediaControls: UnwrapRef<typeof import('@vueuse/core')['useMediaControls']>
readonly useMediaQuery: UnwrapRef<typeof import('@vueuse/core')['useMediaQuery']>
readonly useMemoize: UnwrapRef<typeof import('@vueuse/core')['useMemoize']>
readonly useMemory: UnwrapRef<typeof import('@vueuse/core')['useMemory']>
readonly useMin: UnwrapRef<typeof import('@vueuse/math')['useMin']>
readonly useMounted: UnwrapRef<typeof import('@vueuse/core')['useMounted']>
readonly useMouse: UnwrapRef<typeof import('@vueuse/core')['useMouse']>
readonly useMouseInElement: UnwrapRef<typeof import('@vueuse/core')['useMouseInElement']>
readonly useMousePressed: UnwrapRef<typeof import('@vueuse/core')['useMousePressed']>
readonly useMutationObserver: UnwrapRef<typeof import('@vueuse/core')['useMutationObserver']>
readonly useNavigatorLanguage: UnwrapRef<typeof import('@vueuse/core')['useNavigatorLanguage']>
readonly useNetwork: UnwrapRef<typeof import('@vueuse/core')['useNetwork']>
readonly useNow: UnwrapRef<typeof import('@vueuse/core')['useNow']>
readonly useObjectUrl: UnwrapRef<typeof import('@vueuse/core')['useObjectUrl']>
readonly useOffsetPagination: UnwrapRef<typeof import('@vueuse/core')['useOffsetPagination']>
readonly useOnline: UnwrapRef<typeof import('@vueuse/core')['useOnline']>
readonly usePageLeave: UnwrapRef<typeof import('@vueuse/core')['usePageLeave']>
readonly useParallax: UnwrapRef<typeof import('@vueuse/core')['useParallax']>
readonly usePermission: UnwrapRef<typeof import('@vueuse/core')['usePermission']>
readonly usePointer: UnwrapRef<typeof import('@vueuse/core')['usePointer']>
readonly usePointerLock: UnwrapRef<typeof import('@vueuse/core')['usePointerLock']>
readonly usePointerSwipe: UnwrapRef<typeof import('@vueuse/core')['usePointerSwipe']>
readonly usePrecision: UnwrapRef<typeof import('@vueuse/math')['usePrecision']>
readonly usePreferredColorScheme: UnwrapRef<typeof import('@vueuse/core')['usePreferredColorScheme']>
readonly usePreferredContrast: UnwrapRef<typeof import('@vueuse/core')['usePreferredContrast']>
readonly usePreferredDark: UnwrapRef<typeof import('@vueuse/core')['usePreferredDark']>
readonly usePreferredLanguages: UnwrapRef<typeof import('@vueuse/core')['usePreferredLanguages']>
readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']>
readonly usePrevious: UnwrapRef<typeof import('@vueuse/core')['usePrevious']>
readonly useProjection: UnwrapRef<typeof import('@vueuse/math')['useProjection']>
readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']>
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
readonly useRound: UnwrapRef<typeof import('@vueuse/math')['useRound']>
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
readonly useScroll: UnwrapRef<typeof import('@vueuse/core')['useScroll']>
readonly useScrollLock: UnwrapRef<typeof import('@vueuse/core')['useScrollLock']>
readonly useSessionStorage: UnwrapRef<typeof import('@vueuse/core')['useSessionStorage']>
readonly useShare: UnwrapRef<typeof import('@vueuse/core')['useShare']>
readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
readonly useSorted: UnwrapRef<typeof import('@vueuse/core')['useSorted']>
readonly useSpeechRecognition: UnwrapRef<typeof import('@vueuse/core')['useSpeechRecognition']>
readonly useSpeechSynthesis: UnwrapRef<typeof import('@vueuse/core')['useSpeechSynthesis']>
readonly useStepper: UnwrapRef<typeof import('@vueuse/core')['useStepper']>
readonly useStorage: UnwrapRef<typeof import('@vueuse/core')['useStorage']>
readonly useStorageAsync: UnwrapRef<typeof import('@vueuse/core')['useStorageAsync']>
readonly useStyleTag: UnwrapRef<typeof import('@vueuse/core')['useStyleTag']>
readonly useSum: UnwrapRef<typeof import('@vueuse/math')['useSum']>
readonly useSupported: UnwrapRef<typeof import('@vueuse/core')['useSupported']>
readonly useSwipe: UnwrapRef<typeof import('@vueuse/core')['useSwipe']>
readonly useTemplateRefsList: UnwrapRef<typeof import('@vueuse/core')['useTemplateRefsList']>
readonly useTextDirection: UnwrapRef<typeof import('@vueuse/core')['useTextDirection']>
readonly useTextSelection: UnwrapRef<typeof import('@vueuse/core')['useTextSelection']>
readonly useTextareaAutosize: UnwrapRef<typeof import('@vueuse/core')['useTextareaAutosize']>
readonly useThrottle: UnwrapRef<typeof import('@vueuse/core')['useThrottle']>
readonly useThrottleFn: UnwrapRef<typeof import('@vueuse/core')['useThrottleFn']>
readonly useThrottledRefHistory: UnwrapRef<typeof import('@vueuse/core')['useThrottledRefHistory']>
readonly useTimeAgo: UnwrapRef<typeof import('@vueuse/core')['useTimeAgo']>
readonly useTimeout: UnwrapRef<typeof import('@vueuse/core')['useTimeout']>
readonly useTimeoutFn: UnwrapRef<typeof import('@vueuse/core')['useTimeoutFn']>
readonly useTimeoutPoll: UnwrapRef<typeof import('@vueuse/core')['useTimeoutPoll']>
readonly useTimestamp: UnwrapRef<typeof import('@vueuse/core')['useTimestamp']>
readonly useTitle: UnwrapRef<typeof import('@vueuse/core')['useTitle']>
readonly useToFixed: UnwrapRef<typeof import('@vueuse/math')['useToFixed']>
readonly useToNumber: UnwrapRef<typeof import('@vueuse/core')['useToNumber']>
readonly useToString: UnwrapRef<typeof import('@vueuse/core')['useToString']>
readonly useToggle: UnwrapRef<typeof import('@vueuse/core')['useToggle']>
readonly useTransition: UnwrapRef<typeof import('@vueuse/core')['useTransition']>
readonly useTrunc: UnwrapRef<typeof import('@vueuse/math')['useTrunc']>
readonly useUrlSearchParams: UnwrapRef<typeof import('@vueuse/core')['useUrlSearchParams']>
readonly useUserMedia: UnwrapRef<typeof import('@vueuse/core')['useUserMedia']>
readonly useVModel: UnwrapRef<typeof import('@vueuse/core')['useVModel']>
readonly useVModels: UnwrapRef<typeof import('@vueuse/core')['useVModels']>
readonly useVibrate: UnwrapRef<typeof import('@vueuse/core')['useVibrate']>
readonly useVirtualList: UnwrapRef<typeof import('@vueuse/core')['useVirtualList']>
readonly useWakeLock: UnwrapRef<typeof import('@vueuse/core')['useWakeLock']>
readonly useWebNotification: UnwrapRef<typeof import('@vueuse/core')['useWebNotification']>
readonly useWebSocket: UnwrapRef<typeof import('@vueuse/core')['useWebSocket']>
readonly useWebWorker: UnwrapRef<typeof import('@vueuse/core')['useWebWorker']>
readonly useWebWorkerFn: UnwrapRef<typeof import('@vueuse/core')['useWebWorkerFn']>
readonly useWindowFocus: UnwrapRef<typeof import('@vueuse/core')['useWindowFocus']>
readonly useWindowScroll: UnwrapRef<typeof import('@vueuse/core')['useWindowScroll']>
readonly useWindowSize: UnwrapRef<typeof import('@vueuse/core')['useWindowSize']>
readonly watch: UnwrapRef<typeof import('vue')['watch']>
readonly watchArray: UnwrapRef<typeof import('@vueuse/core')['watchArray']>
readonly watchAtMost: UnwrapRef<typeof import('@vueuse/core')['watchAtMost']>
readonly watchDebounced: UnwrapRef<typeof import('@vueuse/core')['watchDebounced']>
readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']>
readonly watchIgnorable: UnwrapRef<typeof import('@vueuse/core')['watchIgnorable']>
readonly watchOnce: UnwrapRef<typeof import('@vueuse/core')['watchOnce']>
readonly watchPausable: UnwrapRef<typeof import('@vueuse/core')['watchPausable']>
readonly watchPostEffect: UnwrapRef<typeof import('vue')['watchPostEffect']>
readonly watchSyncEffect: UnwrapRef<typeof import('vue')['watchSyncEffect']>
readonly watchThrottled: UnwrapRef<typeof import('@vueuse/core')['watchThrottled']>
readonly watchTriggerable: UnwrapRef<typeof import('@vueuse/core')['watchTriggerable']>
readonly watchWithFilter: UnwrapRef<typeof import('@vueuse/core')['watchWithFilter']>
readonly whenever: UnwrapRef<typeof import('@vueuse/core')['whenever']>
}
}

5
babel.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

View File

@ -1,108 +0,0 @@
# Directory Layout
Note: the host name used in the user's browser (displayed in the address bar) to load the explorer app determines which of the chain configuration directories is used.
If the host name contains the substring "testnet" (for example: "https://mytestnetwork.example.com") then chain configuration files in the `testnet` directory (only) are loaded. Conversely if the host name does not contain that substring then chain configuration files in the `mainnet` directory (only) are loaded.
Remember to bear this behavior in mind when selecting a DNS host name for self hosting the explorer.
** if you want to list your blockchain on ping.pub, please submit your configuration on https://github.com/ping-pub/ping.pub.git **
- Submit configs for mainnet, go to https://github.com/ping-pub/explorer/tree/master/chains/mainnet
- Submit configs for testnet, go to https://github.com/ping-pub/explorer/tree/master/chains/testnet, these configs will be enabled when you visit the domain that starts with `testnet.*`, for example `https://testnet.ping.pub`
# Sample of Config
```json
{
"chain_name": "cosmos",
"api": [
{
"address": "https://cosmos.api.ping.pub",
"provider": "Ping"
}
],
"rpc": [
{
"address": "https://cosmos.api.ping.pub",
"provider": "Ping"
}
],
"sdk_version": "0.42.6",
"coin_type": "118",
"min_tx_fee": "800",
"assets": [{
"base": "uatom",
"symbol": "ATOM",
"exponent": "6",
"coingecko_id": "cosmos",
"logo": "https://dl.airtable.com/.attachments/e54f814bba8c0f9af8a3056020210de0/2d1155fb/cosmos-hub.svg"
}],
"addr_prefix": "cosmos",
"theme_color": "#ce4747",
"logo": "https://dl.airtable.com/.attachments/e54f814bba8c0f9af8a3056020210de0/2d1155fb/cosmos-hub.svg"
}
```
- **chain_name** the name to identify the chain on ping.pub, would be better to use the same one as registry
- **api** the rest api endpoint.(make sure that CORS is enabled: `Allow-Control-Allow-Origin: *`)
- **rpc** the rpc endpoint, make sure that the port is added. rpc endpoint is only used for state sync. it's optional.
- **assets** Native Assets on blockchain.
Endpoint providers will be listed in the "Popular" tab of the staking.
# Token Unit conversion
We have two methods to load token metadata for token unit conversion:
## Loading from a REST endpoint (recommended).
you can define the metadata in the `bank` -> `metadata` section of the blockchain's genesis file. if you don't define, the `[]` will return.
```json
{
"name": "atom",
"description": "The native staking token of the Cosmos Hub.",
"denom_units": [
{
"denom": "uatom",
"exponent": 0,
"aliases": [
"microatom"
],
},
{
"denom": "matom",
"exponent": 3,
"aliases": [
"milliatom"
]
},
{
"denom": "atom",
"exponent": 6,
}
],
"base": "uatom",
"display": "atom",
}
```
you can see more details here:
https://github.com/cosmos/cosmos-sdk/blob/main/docs/architecture/adr-024-coin-metadata.md
## Loading from Cosmos Registry:
https://github.com/cosmos/chain-registry
# Test
please add these check points in comments with your PR, and adding your test result by clicking the checkbox of each line
```
Test Result:
- [ ] Connect wallet, check if address is correct?
- [ ] Transfer
- [ ] Delegate
- [ ] Redelegate
- [ ] Unbond
- [ ] withdraw Validator's Commission
- [ ] withdraw Rewards
```
Test is very important for us and our users.

View File

@ -1,74 +0,0 @@
{
"chain_name": "axelar",
"api": [
"https://rest.axelar.lava.build/lava-referer-97409c72-1a82-4861-8651-119c15151cbe"
],
"rpc": [
"https://tm.axelar.lava.build/lava-referer-97409c72-1a82-4861-8651-119c15151cbe"
],
"snapshot_provider": "",
"sdk_version": "0.45.6",
"coin_type": "118",
"min_tx_fee": "800",
"addr_prefix": "axelar",
"logo": "/logos/axelar.svg",
"theme_color": "#161723",
"assets": [
{
"base": "uaxl",
"symbol": "AXL",
"exponent": "6",
"coingecko_id": "axelar",
"logo": "/logos/axelar.svg"
},
{
"base": "uusdc",
"symbol": "axlUSDC",
"exponent": "6",
"coingecko_id": "usd-coin",
"logo": "/logos/usdc.svg"
},
{
"base": "uusdt",
"symbol": "axlUSDT",
"exponent": "6",
"coingecko_id": "tether",
"logo": "/logos/usdt.svg"
},
{
"base": "dai-wei",
"symbol": "axlDAI",
"exponent": "18",
"coingecko_id": "dai",
"logo": "/logos/dai.svg"
},
{
"base": "weth-wei",
"symbol": "axlWETH",
"exponent": "18",
"coingecko_id": "ethereum",
"logo": "/logos/weth.svg"
},
{
"base": "wmatic-wei",
"symbol": "axlWMATIC",
"exponent": "18",
"coingecko_id": "matic-network",
"logo": "/logos/wmatic.svg"
},
{
"base": "wavax-wei",
"symbol": "axlWAVAX",
"exponent": "18",
"coingecko_id": "avalanche-2",
"logo": "/logos/wavax.svg"
},
{
"base": "dot-planck",
"symbol": "axlDOT",
"exponent": "10",
"coingecko_id": "polkadot",
"logo": "/logos/dot.svg"
}
]
}

View File

@ -1,31 +0,0 @@
{
"chain_name": "cosmos",
"registry_name": "cosmoshub",
"api": [
{"provider": "notional", "address": "https://api-cosmoshub-ia.cosmosia.notional.ventures"},
{"provider": "blockapsis", "address": "https://lcd-cosmoshub.blockapsis.com:443"},
{"provider": "WhisperNode🤐", "address": "https://lcd-cosmoshub.whispernode.com:443"},
{"provider": "pupmos", "address": "https://api-cosmoshub.pupmos.network"},
{"provider": "publicnode", "address": "https://cosmos-rest.publicnode.com"},
{"provider": "staketab", "address": "https://cosmos-rest.staketab.org"},
{"provider": "nodestake", "address": "https://api.cosmos.nodestake.top"},
{"provider": "Golden Ratio Staking", "address": "https://rest-cosmoshub.goldenratiostaking.net"}
],
"rpc": [
{"provider": "icycro", "address": "https://cosmos-rpc.icycro.org"},
{"provider": "dragonstake", "address": "https://rpc.cosmos.dragonstake.io"},
{"provider": "Golden Ratio Staking", "address": "https://rpc-cosmoshub.goldenratiostaking.net"}
],
"sdk_version": "0.45.1",
"coin_type": "118",
"min_tx_fee": "800",
"addr_prefix": "cosmos",
"logo": "/logos/cosmos.svg",
"assets": [{
"base": "uatom",
"symbol": "ATOM",
"exponent": "6",
"coingecko_id": "cosmos",
"logo": "/logos/cosmos.svg"
}]
}

View File

@ -1,30 +0,0 @@
{
"chain_name": "neutron",
"api": [
{"provider": "Polkachu", "address": "https://neutron-api.polkachu.com"},
{"provider": "NodeStake", "address": "https://api.neutron.nodestake.top"},
{"provider": "Allnodes", "address": "https://neutron-rest.publicnode.com"}
],
"rpc": [
{"provider": "Polkachu", "address": "https://neutron-rpc.polkachu.com"},
{"provider": "NodeStake", "address": "https://rpc.neutron.nodestake.top"},
{"provider": "Allnodes", "address": "https://neutron-rpc.publicnode.com:443"}
],
"provider_chain": {
"api": ["https://api-cosmoshub-ia.cosmosia.notional.ventures"]
},
"features": ["dashboard", "blocks", "ibc", "cosmwasm", "uptime", "parameters", "state-sync", "consensus", "supply", "widget"],
"sdk_version": "0.45.1",
"coin_type": "118",
"min_tx_fee": "8000",
"assets": [{
"base": "untrn",
"symbol": "NTRN",
"exponent": "6",
"coingecko_id": "neutron",
"logo": "/logos/neutron.svg"
}],
"addr_prefix": "neutron",
"theme_color": "#161723",
"logo": "/logos/neutron.svg"
}

View File

@ -1,27 +0,0 @@
{
"chain_name": "nolus",
"coingecko": "nolus",
"api": [
{"provider": "Nolus", "address": "https://pirin-cl.nolus.network:1317"},
{"provider": "LavenderFive", "address": "https://nolus-api.lavenderfive.com:443"},
{"provider": "Allnodes", "address": "https://nolus-rest.publicnode.com"}
],
"rpc": [
{"provider": "Nolus", "address": "https://pirin-cl.nolus.network:26657"},
{"provider": "LavenderFive", "address": "https://nolus-rpc.lavenderfive.com:443"},
{"provider": "Allnodes", "address": "https://nolus-rpc.publicnode.com:443"}
],
"snapshot_provider": "",
"sdk_version": "v0.47.6",
"coin_type": "118",
"min_tx_fee": "0",
"addr_prefix": "nolus",
"logo": "/logos/nolus.svg",
"assets": [{
"base": "unls",
"symbol": "NLS",
"exponent": "6",
"coingecko_id": "nolus",
"logo": "/logos/nolus.svg"
}]
}

View File

@ -1,32 +0,0 @@
{
"chain_name": "osmosis",
"coingecko": "osmosis",
"api": ["https://lcd.osmosis.zone","https://api-osmosis-ia.cosmosia.notional.ventures", "https://osmosis-api.polkachu.com", "https://lcd-osmosis.blockapsis.com"],
"rpc": ["https://rpc.osmosis.zone", "https://rpc-osmosis-ia.cosmosia.notional.ventures:443", "https://osmosis-rpc.polkachu.com:443", "https://osmosis.validator.network:443", "https://rpc-osmosis.blockapsis.com:443"],
"snapshot_provider": "",
"sdk_version": "0.46.1",
"coin_type": "118",
"min_tx_fee": "800",
"addr_prefix": "osmo",
"logo": "/logos/osmosis.jpg",
"theme_color": "#812cd6",
"assets": [{
"base": "uosmo",
"symbol": "OSMO",
"exponent": "6",
"coingecko_id": "osmosis",
"logo": "/logos/osmosis.jpg"
},{
"base": "uion",
"symbol": "ION",
"exponent": "6",
"coingecko_id": "ion",
"logo": "/logos/osmosis.jpg"
},{
"base": "usomm",
"symbol": "SOMM",
"exponent": "6",
"coingecko_id": "somm",
"logo": ""
}]
}

View File

@ -1,11 +0,0 @@
{
"chain_name": "crossfi-testnet-1",
"api": ["https://crossfi-testnet-api.forpeaky.xyz"],
"rpc": ["https://crossfi-testnet-rpc.forpeaky.xyz"],
"coingecko": "",
"snapshot_provider": "",
"sdk_version": "0.47.1",
"coin_type": "118",
"min_tx_fee": "500",
"addr_prefix": "crossfi"
}

13
components.d.ts vendored
View File

@ -1,13 +0,0 @@
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core';
export {};
declare module '@vue/runtime-core' {
export interface GlobalComponents {
RouterLink: typeof import('vue-router')['RouterLink'];
RouterView: typeof import('vue-router')['RouterView'];
}
}

3
env.d.ts vendored
View File

@ -1,3 +0,0 @@
/// <reference types="vite/client" />
declare module '@personaxyz/ad-sdk';

View File

@ -1,44 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laconic Blockchain Explorer And Web Wallet</title>
<meta name="description" content="Laconic Explorer is a block explorer/web wallet for blockchains built on Cosmos SDK, Cosmoshub, Osmosis, Juno, Evmos, Injective, Canto and 70+ blockchains listed on ping.pub" />
<link rel="stylesheet" type="text/css" href="/loader.css" />
</head>
<body>
<div id="app">
<div id="loading-bg">
<div class="loading-logo">
<img src="/logo.svg" alt="Logo" />
</div>
<div class="pre-loading">
<div class="effect-1 effects"></div>
<div class="effect-2 effects"></div>
<div class="effect-3 effects"></div>
</div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-SSBKVF3GMX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
// Set default consent to 'denied' as a placeholder
// Determine actual values based on your own requirements
gtag('consent', 'default', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'analytics_storage': 'denied'
});
gtag('config', 'G-SSBKVF3GMX');
</script>
<script type="module" src="https://cdn.jsdelivr.net/npm/ping-widget@v0.3.8/dist/ping-widget.min.js"></script>
</body>
</html>

View File

@ -1,82 +0,0 @@
# Prerequisites
1. Node and Yarn - Acquired using Node Version Manager (https://github.com/nvm-sh/nvm)
# Quick Install for Prerequisites
1. Install Node Version Manager
```sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash
```
2. Install the latest version of NodeJS
```sh
nvm install node # "node" is an alias for the latest version
```
3. Install the latest version of NPM for Node
```sh
nvm install-latest-npm # get the latest supported npm version on the current node version
```
4. Install Yarn
```sh
npm install --global yarn
```
# Installation:
1. Running with yarn
```sh
yarn --ignore-engines && yarn serve
```
2. Building for web servers, like nginx, apache
```sh
yarn --ignore-engines && yarn build
cp -r ./dist/* <ROOT_OF_WEB_SERVER>
```
3. Running with docker
```sh
./docker.sh
docker run -d -p 8088:80 ping.pub/dashboard
```
# Enable LCD for Ping.pub (do this on the config for your chain)
1. Set `enable = true` in `./config/app.toml`
```
###############################################################################
### API Configuration ###
###############################################################################
[api]
# Enable defines if the API server should be enabled.
enable = true
# Swagger defines if swagger documentation should automatically be registered.
swagger = false
# Address defines the API server to listen on.
address = "tcp://0.0.0.0:1317"
# MaxOpenConnections defines the number of maximum open connections.
max-open-connections = 1000
```
2. add proxy server and enable CORS. NOTE: You must enable https as well.
```
server {
server_name juno.api.ping.pub;
listen 443;
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Max-Age 3600;
add_header Access-Control-Expose-Headers Content-Length;
proxy_pass http://<HOST>:1317;
}
}
```
3. config your blockchain in [./src/chains]()

View File

@ -1,79 +1,43 @@
{
"name": "ping.pub",
"version": "3.0.0",
"name": "look",
"version": "0.1.0",
"private": true,
"target": "",
"scripts": {
"dev": "vite",
"serve": "vite",
"build": "run-p type-check build-only",
"preview": "vite preview",
"build-only": "vite build",
"type-check": "vue-tsc --noEmit"
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"start": "pm2 delete all && git pull origin dev && cd server && npm run start"
},
"dependencies": {
"@chenfengyuan/vue-countdown": "2",
"@cosmjs/crypto": "^0.32.3",
"@cosmjs/amino": "^0.32.3",
"@cosmjs/encoding": "^0.32.3",
"@cosmjs/stargate": "^0.32.3",
"@iconify/vue": "^4.1.0",
"@intlify/unplugin-vue-i18n": "^0.8.2",
"@leapwallet/cosmos-snap-provider": "^0.1.20",
"@leapwallet/name-matcha": "^1.1.0",
"@osmonauts/lcd": "^0.8.0",
"@personaxyz/ad-sdk": "0.0.25",
"@ping-pub/chain-registry-client": "^0.0.25",
"@vitejs/plugin-vue-jsx": "^3.0.0",
"@vueuse/core": "^9.12.0",
"@vueuse/integrations": "^10.1.2",
"@vueuse/math": "^9.12.0",
"apexcharts": "^3.37.1",
"autoprefixer": "^10.4.14",
"axios": "^1.3.2",
"buffer": "^6.0.3",
"build": "^0.1.4",
"cross-fetch": "^3.1.5",
"daisyui": "^3.1.0",
"dayjs": "^1.11.7",
"lazy-load-vue3": "^1.3.0",
"long": "^5.2.1",
"md-editor-v3": "^2.8.1",
"numeral": "^2.0.6",
"osmojs": "^14.0.0-rc.0",
"pinia": "^2.0.28",
"postcss": "^8.4.23",
"qrcode": "^1.5.3",
"tailwindcss": "^3.3.1",
"theme-change": "^2.5.0",
"vite-plugin-vue-layouts": "^0.7.0",
"vue": "^3.2.45",
"vue-i18n": "^9.2.2",
"vue-prism-component": "^2.0.0",
"vue-router": "^4.1.6",
"vue3-apexcharts": "^1.4.1",
"vue3-json-viewer": "^2.2.2",
"vue3-perfect-scrollbar": "^1.6.1"
"@cosmostation/cosmosjs": "^0.5.2",
"@lunie/cosmos-api": "^0.2.5",
"@lunie/cosmos-ledger": "^0.1.7",
"bignumber.js": "^9.0.0",
"core-js": "^3.6.4",
"cosmos-lib": "^1.1.0",
"dayjs": "^1.8.21",
"element-ui": "^2.13.0",
"fingerprintjs2": "^2.1.0",
"hash.js": "^1.1.7",
"js-base64": "^3.6.0",
"localforage": "^1.7.3",
"vant": "^2.6.1",
"vue": "^2.6.11",
"vue-i18n": "^8.15.1",
"vue-router": "^3.1.5",
"vue-worker": "^1.2.1",
"vuex": "^3.1.2"
},
"devDependencies": {
"@osmonauts/telescope": "^0.88.2",
"@types/marked": "^4.0.8",
"@types/node": "^18.11.12",
"@types/numeral": "^2.0.2",
"@types/semver": "7.5.0",
"@vitejs/plugin-vue": "^4.0.0",
"@vue/tsconfig": "^0.1.3",
"npm-run-all": "^4.1.5",
"prettier": "^2.7.1",
"sass": "^1.58.0",
"shiki": "^1.0.0-beta.0",
"typescript": "~4.9.5",
"unplugin-auto-import": "^0.13.0",
"unplugin-vue-components": "^0.23.0",
"unplugin-vue-define-options": "1.1.4",
"vite": "^4.4.9",
"vite-plugin-pages": "^0.28.0",
"vue-json-viewer": "3",
"vue-tsc": "^1.0.12"
}
"@vue/cli-plugin-babel": "~4.2.0",
"@vue/cli-plugin-router": "~4.2.0",
"@vue/cli-plugin-vuex": "~4.2.0",
"@vue/cli-service": "~4.2.0",
"sass": "^1.25.0",
"sass-loader": "^8.0.2",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
"> 1%",
"last 2 versions"
]
}

View File

@ -1,6 +0,0 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

38
public/index.html Normal file
View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<title>
LOOK Explorer - A light explorer for Cosmos based blockchains, Powered by
ping.pub.
</title>
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<link rel="stylesheet" href="/static/css/font_1354695_lrb2z8iklqe.css" />
<script src="/static/cdn/vue@2.6.11.min.js"></script>
<script src="/static/cdn/element-ui@2.13.0.js"></script>
</head>
<body>
<noscript>
<strong
>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
properly without JavaScript enabled. Please enable it to
continue.</strong
>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?612cb1567ca1cb640c7e9ee55b748c8c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</body>
</html>

View File

@ -1,70 +0,0 @@
#loading-bg {
background: var(--initial-loader-bg, #fff);
}
.loading-logo {
position: absolute;
inset-block-start: 40%;
inset-inline-start: calc(50% - 75px);
}
.pre-loading {
position: absolute;
box-sizing: border-box;
border: 3px solid transparent;
block-size: 55px;
border-radius: 50%;
inline-size: 55px;
inset-block-start: calc(40% + 35px);
inset-inline-start: calc(50% - 27.5px);
}
.pre-loading .effect-1,
.pre-loading .effect-2,
.pre-loading .effect-3 {
position: absolute;
box-sizing: border-box;
border: 3px solid transparent;
block-size: 100%;
border-inline-start: 3px solid var(--initial-loader-color, #eee);
border-radius: 50%;
inline-size: 100%;
}
.pre-loading .effect-1 {
animation: rotate 1s ease infinite;
}
.pre-loading .effect-2 {
animation: rotate-opacity 1s ease infinite 0.1s;
}
.pre-loading .effect-3 {
animation: rotate-opacity 1s ease infinite 0.2s;
}
.pre-loading .effects {
transition: all 0.3s ease;
}
@keyframes rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(1turn);
}
}
@keyframes rotate-opacity {
0% {
opacity: 0.1;
transform: rotate(0deg);
}
100% {
opacity: 1;
transform: rotate(1turn);
}
}

View File

@ -1,82 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="150px" height="132px" viewBox="0 0 150 132" enable-background="new 0 0 150 132" xml:space="preserve"> <image id="image0" width="150" height="132" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACECAMAAABFwSJAAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACuFBMVEVmbP////9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9m
bP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP9mbP+Znf+Xm/+Wmv+UmP+T
l/+Rlv+QlP+Ok/+Mkf+LkP+Jjv+Ijf/a2//////S1P+ztv+mqf+coP/l5v/d3v+7vv+ytf+hpP/2
9v/v8P+qrf+prP+nqv+kp/+bn//g4f/u7//Hyf+2uf/9/f++wf+Gi//y8//c3f+sr/+eov/R0/+w
s//U1f/Jy//p6v/6+v/BxP/P0f/Ex/+fo//8/P+5vP/3+P/s7f/m5//09f/o6f+Fiv/f4P/j5P/X
2P+1uP/Dxf/5+f+vsv/i4//Mzv/GyP+tsP+8v//KzP/O0P+ipv/x8v+/wv/r7P+4u//Z2v/V1/+N
hj37AAAAl3RSTlMAAIXd6u7y4Qgo+nu08xhGnQTU/TFrvxDrUY7bByZzsu8VRZUD0/sraLhJjNYl
+Wyw7EPRZg5Ci9Ak+GSu50GGz/cgquj+PInLASFerOQKP4ACzvUcY6I1xFbfPXnM8WGbDOb8L4S9
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" />
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

3
public/static/cdn/axios@0.19.2.min.js vendored Normal file

File diff suppressed because one or more lines are too long

10
public/static/cdn/core@2.6.11.min.js vendored Normal file

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

6
public/static/cdn/vue@2.6.11.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6
public/static/cdn/vuex@3.1.3.min.js vendored Normal file

File diff suppressed because one or more lines are too long

BIN
public/static/cdp/risk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 319.97 320">
<defs>
<style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:url(#linear-gradient-2);}.cls-3{fill:url(#linear-gradient-3);}.cls-4{fill:url(#linear-gradient-4);}.cls-5{fill:url(#linear-gradient-5);}.cls-6{fill:url(#linear-gradient-6);}.cls-7{fill:url(#linear-gradient-7);}</style>
<linearGradient id="linear-gradient" x1="36.16" y1="24.77" x2="285.75" y2="274.37" gradientTransform="matrix(1, 0, 0, -1, -5.41, 313.57)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#189dd8"/>
<stop offset="0.5" stop-color="#694ea0"/>
<stop offset="1" stop-color="#ed3855"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="63.4" y1="-2.47" x2="312.99" y2="247.13" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-3" x1="134.61" y1="-73.68" x2="384.2" y2="175.91" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-4" x1="109.22" y1="-48.29" x2="358.82" y2="201.3" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-5" x1="-36.5" y1="97.43" x2="213.1" y2="347.02" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-6" x1="-61.81" y1="122.74" x2="187.78" y2="372.33" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-7" x1="9.4" y1="51.53" x2="258.99" y2="301.12" xlink:href="#linear-gradient"/>
</defs>
<title>Asset 1</title>
<g id="Layer_2">
<g id="Layer_1-2">
<path class="cls-1" d="M97.11,231.9l-73.39,8.26,43.09-99.45L22.68,80.5,130,68.3l29.16-67L223,88.1l73.41-8.26-42.9,99,43.81,59.74L190.59,250.72l-29.6,68Zm30.48-6.6a51.53,51.53,0,0,1-8.91,3.38l-2.8.78,41.39,56.26L172,251.94l-2.65-.34a52.91,52.91,0,0,1-36.1-21.36l-4.12-5.68Zm-14.39-51,33.39,46.2a36.31,36.31,0,0,0,29.33,15,35.61,35.61,0,0,0,4-.22L267,225.36l-34.69-47.31a35.77,35.77,0,0,0-5.91-6.32l-2-1.7-24.82,56-43.19-57.2Zm1.46-56.25A36.28,36.28,0,0,0,85.29,139.7l-35,80.74,58.12-6.53a35.22,35.22,0,0,0,8.4-2l2.48-.92L83.37,161.34l70.92-9,16.85-40.28Zm54.86,40.74,26.29,34.81,16-36.2,7.09-15.9a36.52,36.52,0,0,0-4-36.37L162.83,34.28,139.41,88.11a36,36,0,0,0-2.49,8.31L136.47,99l60.76-6.43Zm63.84-55.14,1,2.47a53.49,53.49,0,0,1-.39,42.1l-2.83,6.42,1.39.94a51,51,0,0,1,7.37,6.07l2.08,2,27.8-64.15ZM53,93.8,75.11,124l1.62-2.1a53,53,0,0,1,36.2-20.39l7-.73.12-1.69a52,52,0,0,1,1.75-10.37l.79-2.87Z"/>
<path class="cls-2" d="M144.51,320A158.79,158.79,0,0,1,29.93,253.61l18.54-2.11c3.08,3.77,6.34,7.39,9.71,10.77a142.87,142.87,0,0,0,72.93,39.48Z"/>
<path class="cls-3" d="M183.17,302.82a142.36,142.36,0,0,0,78.65-40.52c1.93-1.94,3.89-4,5.82-6.2l22.51-2.6A158.89,158.89,0,0,1,175.7,320Z"/>
<path class="cls-4" d="M294.72,211.3a146.54,146.54,0,0,0,2-96.94l9-20.8a161.83,161.83,0,0,1,0,132.8Z"/>
<path class="cls-5" d="M14.33,226.58a161.85,161.85,0,0,1,.16-133.51l11,15a146.46,146.46,0,0,0-2.17,97.7Z"/>
<path class="cls-6" d="M30.59,65.5A159,159,0,0,1,144.42,0L137,17.16A142.34,142.34,0,0,0,58.18,57.7c-1.63,1.63-3.28,3.38-4.92,5.19Z"/>
<path class="cls-7" d="M271.59,68.5c-3.08-3.78-6.34-7.4-9.72-10.79a142.81,142.81,0,0,0-72.8-39.45L175.59,0A158.89,158.89,0,0,1,290.08,66.4Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 193.63 213">
<defs>
<style>.cls-1{opacity:0.2;}.cls-2{fill:#ff564f;}</style>
</defs>
<title>Kava Logo</title>
<g id="Layer_2">
<g id="Layer_1-2">
<g class="cls-1">
<polygon class="cls-2" points="30 213 111.63 106.85 30 0 20.25 38.34 72.81 106.85 22.66 171.3 30 213"/>
</g>
<polygon class="cls-2" points="154.34 213 72.21 106.85 154.13 0 193 0 111.03 106.85 193.63 213 154.34 213"/>
<rect class="cls-2" width="30" height="213"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
public/static/ping.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
public/static/ping.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

325
public/static/ping.svg Normal file
View File

@ -0,0 +1,325 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve"> <image id="image0" width="500" height="500" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAQAAABh3xcBAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAAAmJLR0QA/4ePzL8AAAAJcEhZ
cwAAFxIAABcSAWef0lIAAAAHdElNRQflBwEGCCh5IMWkAABE50lEQVR42u2deZxcVZm/n7vW0ks6
HRICCLQxhIiArLK7jY6CCo4yuKIy4oyMKCKo4zCjMq4jbrgMOvobFRUccBkVEBdQQBAUBQQxQIAm
hBCy9lrbXc7vj3uqunpJqjq1ds771EdMUt3nnrt87znnPe9iKQRB2N2xO90BQRBajwhdEAxAhC4I
BiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETo
gmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxA
hC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXB
AETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhd
EAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI
0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAY
gAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKEL
ggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAAR
uiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQD
EKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRB
MAARuiAYgAhdEAxAhC4IBiBCFwQDEKELggGI0AXBAETogmAAInRBMAARuiAYgAhdEAxAhC4IBiBC
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
AYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAidEEwABG6
IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggGIEIXBAMQ
oQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAidEEw
ABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggGIEIX
BAMQoQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAi
dEEwABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggG
IEIXBAMQoQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiC
YAAidEEwABG6IBiACF0QDECELggGIEIXBAMQoQuCAYjQBcEAROiCYAAidEEwABG6IBiACF0QDECE
LggG8P8BBAfkKeePPJoAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDYtMzBUMjI6MDg6NDArMDg6
MDAG6UWiAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTA2LTMwVDIyOjA4OjQwKzA4OjAwd7T9HgAA
ACB0RVh0c29mdHdhcmUAaHR0cHM6Ly9pbWFnZW1hZ2ljay5vcme8zx2dAAAAGHRFWHRUaHVtYjo6
RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAA1MDB4mAPs
AAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADUwMOtpU7EAAAAZdEVYdFRodW1iOjpNaW1ldHlw
ZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTYyNTA2MjEyMASvYicAAAATdEVY
dFRodW1iOjpTaXplADQ1NTc2QkJGVhGEAAAARnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vYXBwL3Rt
cC9pbWFnZWxjL2ltZ3ZpZXcyXzlfMTYyMzkxMjA5NjY2MzgyODRfMjNfWzBdC9JDCQAAAABJRU5E
rkJggg==" ></image>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
public/static/wallet/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 KiB

View File

@ -1,17 +0,0 @@
<html>
<head>
<title>Widget Test</title>
<script src="https://unpkg.com/ping-widget@latest/dist/ping-widget.js" type="module" ></script>
</head>
<body>
<div class="p-5">
<div>
<ping-connect-wallet chain-id="kava_2222-10" hd-path="m/44'/118/0'/0/0"/>
</div>
<div>
<label for="PingTokenConvert" class="btn">Buy Kava</label>
<ping-token-convert chain-name="kava" endpoint="https://api.data.kava.io" hd-path="m/44'/118/0'/0/0"/>
</div>
</div>
</body>
</html>

13
server/.env Normal file
View File

@ -0,0 +1,13 @@
PORT=8888
# local
# Mongodb_url=127.0.0.1:27017/look
# Mongodb_user=
# Mongodb_pwd=
# look
Mongodb_url=127.0.0.1:37777/look
Mongodb_user=look_20200415
Mongodb_pwd=@@look@@dingyi
# MONGODB_URL=mongodb://127.0.0.1:27017/look

BIN
server/dist/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Binary file not shown.

7
server/dist/index.html vendored Normal file
View File

@ -0,0 +1,7 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>LOOK Explorer - A light explorer for Cosmos based blockchains, Powered by ping.pub.</title><link rel=icon href=/favicon.ico><link rel=stylesheet href=/static/css/font_1354695_lrb2z8iklqe.css><script src=/static/cdn/vue@2.6.11.min.js></script><script src=/static/cdn/element-ui@2.13.0.js></script><link href=/js/chunk-f717d484.926f7da8.js rel=prefetch><link href=/js/pc.cfb7cec1.js rel=prefetch><link href=/js/index.eccef632.js rel=preload as=script></head><body><noscript><strong>We're sorry but look doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script>var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?612cb1567ca1cb640c7e9ee55b748c8c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();</script><script src=/js/index.eccef632.js></script></body></html>

File diff suppressed because one or more lines are too long

1
server/dist/js/h5.d98324a2.js vendored Normal file

File diff suppressed because one or more lines are too long

21
server/dist/js/index.eccef632.js vendored Normal file

File diff suppressed because one or more lines are too long

21
server/dist/js/m.3d7ab8ab.js vendored Normal file

File diff suppressed because one or more lines are too long

8
server/dist/js/pc.cfb7cec1.js vendored Normal file

File diff suppressed because one or more lines are too long

7
server/dist/m.html vendored Normal file
View File

@ -0,0 +1,7 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=apple-mobile-web-app-status-bar-style content=black><meta name=format-detection content="telephone=no"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=/favicon.ico><link rel=stylesheet href=/static/css/font_1354695_lrb2z8iklqe.css><script src=https://unpkg.com/vue@2.6.11/dist/vue.min.js></script><script src=https://unpkg.com/element-ui@2.13.0/lib/index.js></script><title>LOOK Explorer - A light explorer for Cosmos based blockchains, Powered by ping.pub.</title><link href=/js/h5.d98324a2.js rel=prefetch><link href=/js/m.3d7ab8ab.js rel=preload as=script></head><body><noscript><strong>We're sorry but look doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script>var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?612cb1567ca1cb640c7e9ee55b748c8c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();</script><script src=/js/m.3d7ab8ab.js></script></body></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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
server/dist/static/cdp/risk.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

109
server/dist/static/chains/cosmoshub.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 161 KiB

BIN
server/dist/static/chains/default.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

29
server/dist/static/chains/irishub.svg vendored Normal file
View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 319.97 320">
<defs>
<style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:url(#linear-gradient-2);}.cls-3{fill:url(#linear-gradient-3);}.cls-4{fill:url(#linear-gradient-4);}.cls-5{fill:url(#linear-gradient-5);}.cls-6{fill:url(#linear-gradient-6);}.cls-7{fill:url(#linear-gradient-7);}</style>
<linearGradient id="linear-gradient" x1="36.16" y1="24.77" x2="285.75" y2="274.37" gradientTransform="matrix(1, 0, 0, -1, -5.41, 313.57)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#189dd8"/>
<stop offset="0.5" stop-color="#694ea0"/>
<stop offset="1" stop-color="#ed3855"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="63.4" y1="-2.47" x2="312.99" y2="247.13" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-3" x1="134.61" y1="-73.68" x2="384.2" y2="175.91" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-4" x1="109.22" y1="-48.29" x2="358.82" y2="201.3" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-5" x1="-36.5" y1="97.43" x2="213.1" y2="347.02" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-6" x1="-61.81" y1="122.74" x2="187.78" y2="372.33" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-7" x1="9.4" y1="51.53" x2="258.99" y2="301.12" xlink:href="#linear-gradient"/>
</defs>
<title>Asset 1</title>
<g id="Layer_2">
<g id="Layer_1-2">
<path class="cls-1" d="M97.11,231.9l-73.39,8.26,43.09-99.45L22.68,80.5,130,68.3l29.16-67L223,88.1l73.41-8.26-42.9,99,43.81,59.74L190.59,250.72l-29.6,68Zm30.48-6.6a51.53,51.53,0,0,1-8.91,3.38l-2.8.78,41.39,56.26L172,251.94l-2.65-.34a52.91,52.91,0,0,1-36.1-21.36l-4.12-5.68Zm-14.39-51,33.39,46.2a36.31,36.31,0,0,0,29.33,15,35.61,35.61,0,0,0,4-.22L267,225.36l-34.69-47.31a35.77,35.77,0,0,0-5.91-6.32l-2-1.7-24.82,56-43.19-57.2Zm1.46-56.25A36.28,36.28,0,0,0,85.29,139.7l-35,80.74,58.12-6.53a35.22,35.22,0,0,0,8.4-2l2.48-.92L83.37,161.34l70.92-9,16.85-40.28Zm54.86,40.74,26.29,34.81,16-36.2,7.09-15.9a36.52,36.52,0,0,0-4-36.37L162.83,34.28,139.41,88.11a36,36,0,0,0-2.49,8.31L136.47,99l60.76-6.43Zm63.84-55.14,1,2.47a53.49,53.49,0,0,1-.39,42.1l-2.83,6.42,1.39.94a51,51,0,0,1,7.37,6.07l2.08,2,27.8-64.15ZM53,93.8,75.11,124l1.62-2.1a53,53,0,0,1,36.2-20.39l7-.73.12-1.69a52,52,0,0,1,1.75-10.37l.79-2.87Z"/>
<path class="cls-2" d="M144.51,320A158.79,158.79,0,0,1,29.93,253.61l18.54-2.11c3.08,3.77,6.34,7.39,9.71,10.77a142.87,142.87,0,0,0,72.93,39.48Z"/>
<path class="cls-3" d="M183.17,302.82a142.36,142.36,0,0,0,78.65-40.52c1.93-1.94,3.89-4,5.82-6.2l22.51-2.6A158.89,158.89,0,0,1,175.7,320Z"/>
<path class="cls-4" d="M294.72,211.3a146.54,146.54,0,0,0,2-96.94l9-20.8a161.83,161.83,0,0,1,0,132.8Z"/>
<path class="cls-5" d="M14.33,226.58a161.85,161.85,0,0,1,.16-133.51l11,15a146.46,146.46,0,0,0-2.17,97.7Z"/>
<path class="cls-6" d="M30.59,65.5A159,159,0,0,1,144.42,0L137,17.16A142.34,142.34,0,0,0,58.18,57.7c-1.63,1.63-3.28,3.38-4.92,5.19Z"/>
<path class="cls-7" d="M271.59,68.5c-3.08-3.78-6.34-7.4-9.72-10.79a142.81,142.81,0,0,0-72.8-39.45L175.59,0A158.89,158.89,0,0,1,290.08,66.4Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

16
server/dist/static/chains/kava.svg vendored Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 193.63 213">
<defs>
<style>.cls-1{opacity:0.2;}.cls-2{fill:#ff564f;}</style>
</defs>
<title>Kava Logo</title>
<g id="Layer_2">
<g id="Layer_1-2">
<g class="cls-1">
<polygon class="cls-2" points="30 213 111.63 106.85 30 0 20.25 38.34 72.81 106.85 22.66 171.3 30 213"/>
</g>
<polygon class="cls-2" points="154.34 213 72.21 106.85 154.13 0 193 0 111.03 106.85 193.63 213 154.34 213"/>
<rect class="cls-2" width="30" height="213"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
server/dist/static/icon/empty.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
server/dist/static/icon/empty2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
server/dist/static/icon/empty3.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

BIN
server/dist/static/wallet/asset1.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
server/dist/static/wallet/asset2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
server/dist/static/wallet/asset3.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
server/dist/static/wallet/bg.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
server/dist/static/wallet/bg2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
server/dist/static/wallet/link.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
server/dist/static/wallet/usb.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
server/dist/static/wallet/wafe.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 KiB

28
server/package.json Normal file
View File

@ -0,0 +1,28 @@
{
"name": "look",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "pm2 start pm2.json",
"dev": "nodemon src/main.js",
"test": "node app.js"
},
"keywords": [],
"author": "dingyiming",
"license": "ISC",
"dependencies": {
"compression": "^1.7.4",
"dayjs": "^1.8.23",
"dotenv": "^8.2.0",
"express": "^4.16.3",
"express-useragent": "^1.0.13",
"express-validator": "^6.4.0",
"http-proxy-middleware": "^0.19.0",
"mongoose": "^5.9.7",
"nunjucks": "^3.1.3"
},
"devDependencies": {
"nodemon": "^2.0.3"
}
}

10
server/pm2.json Normal file
View File

@ -0,0 +1,10 @@
{
"apps": [{
"name": "look",
"script": "./src/main.js",
"out_fil": "~/look.log",
"watch": true,
"instances" : "1",
"exec_mode" : "cluster"
}]
}

View File

@ -0,0 +1,12 @@
const mongoose = require("mongoose");
mongoose.set("useCreateIndex", true);
mongoose.connect(`mongodb://${process.env.Mongodb_url}?authSource=admin`, {
useNewUrlParser: true,
useUnifiedTopology: true,
user: process.env.Mongodb_user,
pass: process.env.Mongodb_pwd,
});
const db = mongoose.connection;
db.once("open", () => {
console.log("[dingyi]小芒果连上了~~");
});

15
server/src/base/router.js Normal file
View File

@ -0,0 +1,15 @@
/*
* @Description:
* @Autor: dingyi
* @Date: 2020-04-10 12:40:50
* @LastEditors: dingyi
* @LastEditTime: 2020-04-13 11:39:02
* @FilePath: /look-web/server/src/base/router.js
*/
const api = require('../routes/index.js')
module.exports = (app) => {
app.use('/look', api)
app.use('/look', (req, res) => { res.send('look.ping.pub') })
}

57
server/src/base/utils.js Normal file
View File

@ -0,0 +1,57 @@
/*
* @Description:
* @Autor: dingyi
* @Date: 2020-04-13 11:21:32
* @LastEditors: dingyi
* @LastEditTime: 2020-04-13 14:50:25
* @FilePath: /look-web/server/src/base/utils.js
*/
const { validationResult } = require("express-validator");
exports.ok = ok
function ok(res, data, other) {
let obj = {
code: 1,
msg: "ok",
data,
};
if (other) {
obj = {
...obj,
...other,
};
}
res.json(obj);
}
function routerGet(router, uri, valid, logic) {
router.get(uri, valid(), (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty())
return ok(res, null, {
code: 2,
msg: errors.array()[0].msg,
data: errors.array(),
});
logic(req, res);
});
}
function routerPost(router, uri, valid, logic) {
router.post(uri, valid(), (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty())
return ok(res, null, {
code: 2,
msg: errors.array()[0].msg,
data: errors.array(),
});
logic(req, res);
});
}
exports.routerRun = {
get: routerGet,
post: routerPost
}

123
server/src/initChains.js Normal file
View File

@ -0,0 +1,123 @@
/*
* @Description:
* @Autor: dingyi
* @Date: 2020-04-13 23:03:22
* @LastEditors: dingyi
* @LastEditTime: 2020-04-13 23:53:51
* @FilePath: \look-web\server\src\initChains.js
*/
module.exports = {
Mainnet: [
{
"chainId": "cosmoshub-3",
"lcd": "https://lcd.nylira.net",
"logo": "/static/chains/cosmoshub.svg",
"name": "Cosmos Hub",
"rpc": "https://rpc.nylira.net",
"version": "0.32.7",
"api": 'V1',
"unit": 'ATOM',
"prefix": 'cosmos',
"host": 'cosmos.ping.pub',
},
{
"chainId": "kava-2",
"lcd": "https://kava-relay.01node.com",
"logo": "/static/chains/kava.svg",
"name": "Kava",
"rpc": "http://13.125.71.131:26657",
"version": "0.32.7",
"api": 'V1',
"unit": 'KAVA',
"prefix": 'kava',
"host": 'kava.ping.pub'
},
{
"chainId": "irishub",
"lcd": "https://rpc.irisnet.org",
"logo": "/static/chains/irishub.svg",
"name": "IRISnet",
"rpc": "http://seed-1.mainnet.irisnet.org:26657",
"version": "0.32.1",
"api": 'V2',
"unit": 'IRIS',
"prefix": 'iaa',
"host": 'iris.ping.pub'
},
{
"chainId": "e-money",
"lcd": "http://emoney.validator.network/light",
"logo": "/static/chains/cosmoshub.svg",
"name": "e-money",
"rpc": "https://emoney.validator.network",
"version": "0.32.7",
"api": 'V1',
"unit": '',
"prefix": '', // 地址前缀
"host": 'e-money.ping.pub'
}
],
Testnet: [
{
"chainId": "sentinelhub-test",
"lcd": "https://lcd.turing.sentinel.co",
"logo": "/static/chains/cosmoshub.svg",
"name": "Sentinel Network",
"rpc": "https://rpc.turing.sentinel.co",
"version": "0.32.7",
"api": 'V1',
"prefix": '',
"unit": '',
"host": 'sentinel-test.ping.pub'
},
{
"chainId": "cell-test-01",
"lcd": "http://sz1.icell.one:1317",
"logo": "/static/chains/cosmoshub.svg",
"name": "Cell Network",
"rpc": "http://sz1.icell.one:26657",
"version": "0.32.7",
"prefix": 'cosmos',
"api": 'V1',
"unit": '',
"host": 'cell-test.ping.pub'
},
{
"chainId": "cyber-test",
"lcd": "https://titan.cybernode.ai/lcd",
"logo": "/static/chains/cosmoshub.svg",
"name": "cyber",
"rpc": "https://titan.cybernode.ai/api",
"version": "0.32.7",
"api": 'V1',
"prefix": '',
"unit": '',
"host": 'cyber-test.ping.pub'
},
{
"chainId": "e-money-test",
"lcd": "https://lilmermaid.validator.network/light",
"logo": "/static/chains/cosmoshub.svg",
"name": "e-money",
"rpc": "https://lilmermaid.validator.network",
"version": "0.32.7",
"api": 'V1',
"unit": '',
"prefix": '', // 地址前缀
"host": 'e-money-test.ping.pub'
},
// {
// "chainId": "new-test",
// "lcd": "https://lcd.nylira.net",
// "logo": "/static/chains/cosmoshub.svg",
// "name": "Genesis Test",
// "rpc": "https://rpc.nylira.net",
// "version": "0.32.7",
// "api": 'V1',
// "unit": 'ATOM',
// "prefix": 'cosmos',
// "host": '',
// "genesis_time": '2020-05-01'
// },
]
}

92
server/src/main.js Normal file
View File

@ -0,0 +1,92 @@
/*
* @Description:
* @Autor: dingyi
* @Date: 2020-03-27 11:41:45
* @LastEditors: Please set LastEditors
* @LastEditTime: 2020-04-16 00:20:19
* @FilePath: \look-web\server\src\main.js
*/
// 环境配置
require('dotenv').config()
// 数据库
require('./base/mongodb.js')
var express = require('express');
var app = express();
app.use(express.json());
var router = express.Router();
// gzip
const compression = require('compression')
app.use(compression())
// ua
var useragent = require('express-useragent');
app.use(useragent.express());
// proxy
var proxy = require('http-proxy-middleware');
// 根据请求转发
app.use('/api*', proxy({
target: 'https://lcd.nylira.net',
changeOrigin: true,
pathRewrite: {
['^/api']: ''
},
router: function (req) {
return req.headers.server || 'https://lcd.nylira.net';
}
}))
router.get('/', function (req, res, next) {
var isMobile = req.useragent.isMobile
console.log('移动端', isMobile)
let render = isMobile ? 'm.html' : 'index.html'
res.render(render);
});
router.get('/validator', function (req, res, next) {
res.redirect('/#/validator');
});
router.get('/uptime', function (req, res, next) {
res.redirect('/#/uptime');
});
router.get('/block', function (req, res, next) {
res.redirect('/#/block');
});
router.get('/proposal', function (req, res, next) {
res.redirect('/#/governance');
});
router.get('/parameter', function (req, res, next) {
res.redirect('/#/parameter');
});
app.use('/', router);
// 路由
require('./base/router.js')(app)
var nunjucks = require('nunjucks')
nunjucks.configure('dist', {
autoescape: true,
express: app
});
// static cache
var path = require('path');
app.use(express.static(path.join(__dirname, '../dist'), {
maxAge: '1y',
expires: '1y',
Etag: false,
lastModified: false
}));
var server = app.listen(process.env.PORT, function () {
var host = server.address().address;
var port = server.address().port;
console.log('app listening at http://%s:%s', host, port);
});

View File

@ -0,0 +1,60 @@
/*
* @Description:
{
"chainId": "cosmoshub-3",
"lcd": "https://lcd.nylira.net",
"logo": "/static/chains/cosmoshub.svg",
"name": "Cosmos Hub",
"rpc": "https://rpc.nylira.net",
"version": "0.32.7",
"api": 'V1',
"unit": 'ATOM',
"prefix": 'cosmos',
"host": isDev ? '' : 'cosmos.ping.pub'
},
* @Autor: dingyi
* @Date: 2020-04-13 11:13:34
* @LastEditors: dingyi
* @LastEditTime: 2020-04-13 23:16:37
* @FilePath: \look-web\server\src\models\chain.js
*/
var mongoose = require('mongoose');
const dayjs = require('dayjs')
var Schema = mongoose.Schema;
const tableSchema = new Schema({
// 分类 Mainnet Testnet GOZ
type: {
type: String, index: true
},
// 显示名称
name: String,
logo: String,
chainId: String,
desc: String,
lcd: String,
rpc: String,
version: String,
// 接口版本 V1 类 cosmoshub V2 类 irishub
api: String,
unit: String,
prefix: String,
host: String,
genesis_time: Date,
// 创建时间
created: { type: Date, default: Date.now },
// 更新时间
updated: { type: Date, default: Date.now }
})
tableSchema.methods.toJSONObject = function () {
return {
name: this.name,
logo: this.logo,
code: this.code,
created: dayjs(this.created).format('YYY MM DD HH:MM:ss'),
updated: dayjs(this.updated).format('YYY MM DD HH:MM:ss')
}
}
module.exports = mongoose.model("look_chain", tableSchema);

Some files were not shown because too many files have changed in this diff Show More