Compare commits

..
Author SHA1 Message Date
liangping 27d46e0b13 add wallet swith on menu 2022-04-04 22:51:32 +08:00
liangping 5217cb658d Merge branch 're-implement-operation-modal' of https://github.com/ping-pub/explorer into re-implement-operation-modal 2022-04-04 22:51:03 +08:00
donne 0e062df351 replace all operation modal 2022-04-04 20:22:59 +08:00
donne f61783e686 Merge branch 're-implement-operation-modal' of https://github.com/ping-pub/explorer into re-implement-operation-modal 2022-04-04 17:30:58 +08:00
liangping d37cf6fef0 add error counter 2022-04-04 17:30:06 +08:00
liangping 4864ccf37f update tx boxes 2022-04-04 16:59:23 +08:00
liangping 0993394e1c add timestamp 2022-04-04 16:59:02 +08:00
donne 20f787e1b8 add transaction result 2022-04-03 23:54:53 +08:00
donne c8435f964b Merge branch 're-implement-operation-modal' of https://github.com/donne1226/explorer into re-implement-operation-modal 2022-04-03 20:10:13 +08:00
donne1226 7c93f6f7c7 fix all 2022-04-01 23:28:42 +08:00
liangping ae9bf25abf select the default address 2022-03-31 23:39:47 +08:00
donne1226 d5c0f26666 fix 2022-03-31 23:01:58 +08:00
donne1226 3d44d1d9f9 fix 2022-03-30 23:11:24 +08:00
donne1226 f99f0093b9 fix redelegate 2022-03-30 21:50:49 +08:00
donne1226 a592e0ed16 fix 2022-03-29 23:25:32 +08:00
donne 34fccd91ba Merge branch 're-implement-operation-modal' of https://github.com/ping-pub/explorer into re-implement-operation-modal 2022-03-28 14:31:44 +08:00
liangping 3e6dccff77 Done delegate 2022-03-28 14:29:32 +08:00
donne1226 9628a37aa7 fix 2022-03-22 22:56:32 +08:00
donne1226 15e6b92ece redelegate 2022-03-21 23:10:30 +08:00
donne1226 b8678a9baa test 2022-03-20 22:57:04 +08:00
donne1226 fd132b9e14 fix staking changes 2022-03-20 15:44:58 +08:00
donne1226 38c728b7f5 change validator api 2022-03-20 14:28:57 +08:00
donne1226 9b70a55220 fix staking table changes 2022-03-20 11:12:52 +08:00
liangping 3327f3a27d Merge branch 'master' of https://github.com/ping-pub/explorer 2022-03-19 11:46:14 +08:00
liangping 732c6ee922 add filter 2022-03-19 11:39:17 +08:00
ping 8bbb3379c2 Merge pull request #88 from lightiv/skynet-vaildators-network-updates
SkyNet | Explorers' Network Updates
2022-03-19 07:58:17 +08:00
Paul Lovette 2c5b50549d SkyNet | Explorers' Network Updates
Here the networks I have added to my fork.  Mainnet and Testnet networks reside in the same location
2022-03-18 11:13:00 -07:00
liangping a8acd8e21f Improve UI of uptime 2022-03-18 15:35:28 +08:00
liangping c2afbe584e Merge branch 'testnet' 2022-03-18 15:11:10 +08:00
ping 9cdda905b4 Merge pull request #86 from donne1226/master
fix staking page style
2022-03-17 11:51:48 +08:00
donne1226 3981667455 fix staking style 2022-03-16 20:09:17 +08:00
liangping 299fcc703b add summelier 2022-03-16 17:49:22 +08:00
liangping 74abaa8860 rename certik to shentu 2022-03-16 16:11:16 +08:00
liangping 69accd8267 add sifchain api 2022-03-16 16:07:01 +08:00
liangping 89ca3d6a42 add fetchchain 2022-03-16 16:01:55 +08:00
liangping 83663b9c18 add agoric 2022-03-16 15:04:40 +08:00
liangping e15918151e change layout from 3 to 4 2022-03-16 11:41:49 +08:00
ping 67d3ab7871 Merge pull request #85 from donne1226/add-staking-table-filter
add staking table filter
2022-03-15 22:16:27 +08:00
donne1226 4630ce63b1 fix 2022-03-15 22:10:04 +08:00
ping d9ef5e1d98 Merge pull request #84 from donne1226/clean
clean project & add gzip
2022-03-15 17:18:20 +08:00
ping ed54846804 Merge pull request #83 from donne1226/#77
fix home page layout bug
2022-03-15 17:15:11 +08:00
donne 62dafec960 fix 2022-03-15 16:52:29 +08:00
donne 95e26f6072 fix 2022-03-15 16:18:57 +08:00
donne1226 d4e7e98be3 fix 2022-03-14 22:43:44 +08:00
donne1226 48b350fd87 fix home layout bug 2022-03-14 20:59:02 +08:00
liangping ca35ec4d23 Merge branch 'master' of https://github.com/ping-pub/explorer 2022-03-14 20:35:45 +08:00
liangping fa68f6c0df add ixo 2022-03-14 20:34:30 +08:00
ping ef2354a9e8 Merge pull request #82 from cerberus-zone/cerberus
Added Cerberus Zone chain
2022-03-14 08:04:59 +08:00
Hades Hounds 4f528bf31c added Cerberus Zone chain 2022-03-13 16:38:10 -05:00
liangping 3aa8c63fe4 fix overlap of legend. 2022-03-12 20:12:42 +08:00
liangping e5e296fe99 fix api issue on osmosis 2022-03-12 13:59:58 +08:00
liangping a26765ad4b change colors 2022-03-11 20:24:16 +08:00
49 changed files with 3208 additions and 599 deletions
+5 -3
View File
@@ -5,7 +5,8 @@
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
"lint": "vue-cli-service lint",
"analyz": "vue-cli-service build --report"
},
"dependencies": {
"@casl/ability": "4.1.6",
@@ -18,7 +19,6 @@
"@cosmjs/math": "^0.26.5",
"@cosmjs/proto-signing": "^0.26.5",
"@cosmjs/stargate": "0.26.5",
"@cosmostation/cosmosjs": "^0.10.6",
"@intlify/vue-i18n-loader": "^2.1.2",
"@ledgerhq/hw-app-cosmos": "^6.3.0",
"@ledgerhq/hw-transport-web-ble": "^6.3.0",
@@ -92,11 +92,13 @@
"@vue/eslint-config-airbnb": "^5.3.0",
"@vuepress/plugin-medium-zoom": "^1.7.1",
"babel-eslint": "^10.0.3",
"compression-webpack-plugin": "6.1.1",
"eslint": "6.8.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-vue": "6.2.2",
"sass": "1.32.*",
"sass-loader": "^10.1.0",
"vue-template-compiler": "2.x"
"vue-template-compiler": "2.x",
"webpack-bundle-analyzer": "^4.5.0"
}
}
+9
View File
@@ -20,4 +20,13 @@ server {
root /usr/share/nginx/html;
}
gzip on;
gzip_proxied any;
gzip_static on;
gzip_min_length 1024;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="BACKGROUND" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#00D2FF;}
</style>
<path d="M369.3,459.5H142.7c-49.6,0-90.2-40.6-90.2-90.2V142.7c0-49.6,40.6-90.2,90.2-90.2h226.5c49.6,0,90.2,40.6,90.2,90.2v226.5
C459.5,418.9,418.9,459.5,369.3,459.5z"/>
<g id="Symbols">
<g id="Header-Singed-In-Final" transform="translate(-27.000000, -14.000000)">
<g id="ixo-logo" transform="translate(27.000000, 14.000000)">
<path id="Fill-2" class="st0" d="M361.3,305.8c-12.4,0-22.5-10.1-22.5-22.5s10.1-22.5,22.5-22.5c12.4,0,22.5,10.1,22.5,22.5
S373.7,305.8,361.3,305.8 M361.3,219.6c-35.2,0-63.7,28.5-63.7,63.7c0,35.2,28.5,63.7,63.7,63.7s63.7-28.5,63.7-63.7
C425,248.1,396.5,219.6,361.3,219.6"/>
<polygon id="Fill-4" class="st0" points="111,219.6 111,347 156.5,347 156.5,219.6 156.4,219.6 "/>
<polygon id="Fill-6" class="st0" points="229.3,251.4 197.5,219.6 165.6,219.6 165.6,251.4 197.5,283.3 165.6,315.2 165.6,347
197.5,347 229.3,315.2 261.2,347 261.2,347 261.2,347 293,347 293,315.2 261.2,283.3 293,251.4 293,219.6 261.2,219.6 "/>
<path id="Fill-8" class="st0" d="M133.8,210.5c-12.6,0-22.8-10.2-22.8-22.8c0-12.6,10.2-22.8,22.8-22.8s22.8,10.2,22.8,22.8
C156.5,200.3,146.3,210.5,133.8,210.5"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

-5
View File
@@ -21,9 +21,6 @@
</b-input-group>
</b-col>
</b-row>
<operation-transfer-component
:recipient-address.sync="selectedAddress"
/>
</div>
</template>
@@ -36,7 +33,6 @@ import Ripple from 'vue-ripple-directive'
import {
addressEnCode, addressDecode,
} from '@/libs/utils'
import OperationTransferComponent from '@/views/OperationTransferComponent.vue'
export default {
name: 'AppFooter',
@@ -47,7 +43,6 @@ export default {
BFormInput,
BInputGroupPrepend,
BInputGroup,
OperationTransferComponent,
},
directives: {
Ripple,
+4 -6
View File
@@ -7,12 +7,10 @@
<component :is="layout">
<router-view />
</component>
</div>
</template>
<script>
// This will be populated in `beforeCreate` hook
import { $themeColors, $themeBreakpoints, $themeConfig } from '@themeConfig'
import { provideToast } from 'vue-toastification/composition'
@@ -29,19 +27,17 @@ const LayoutFull = () => import('@/layouts/full/LayoutFull.vue')
export default {
components: {
// Layouts
LayoutHorizontal,
LayoutVertical,
LayoutFull,
},
// ! We can move this computed: layout & contentLayoutType once we get to use Vue 3
// Currently, router.currentRoute is not reactive and doesn't trigger any change
computed: {
layout() {
if (this.$route.meta.layout === 'full') return 'layout-full'
if (!this.$route.name || this.$route.meta.layout === 'full') return 'layout-full'
return `layout-${this.contentLayoutType}`
},
contentLayoutType() {
@@ -62,7 +58,9 @@ export default {
// eslint-disable-next-line no-plusplus
for (let i = 0, len = breakpoints.length; i < len; i++) {
$themeBreakpoints[breakpoints[i]] = Number(useCssVar(`--breakpoint-${breakpoints[i]}`, document.documentElement).value.slice(0, -2))
$themeBreakpoints[breakpoints[i]] = Number(
useCssVar(`--breakpoint-${breakpoints[i]}`, document.documentElement).value.slice(0, -2),
)
}
// Set RTL
+22
View File
@@ -0,0 +1,22 @@
{
"chain_name": "agoric",
"api": ["https://api.agoric.sgtstake.com", "https://main.api.agoric.net"],
"sdk_version": "0.41.3",
"coin_type": "564",
"min_tx_fee": "8000",
"assets": [{
"base": "ubld",
"symbol": "BLD",
"exponent": "6",
"coingecko_id": "",
"logo": ""
},{
"base": "urun",
"symbol": "RUN",
"exponent": "6",
"coingecko_id": "",
"logo": ""
}],
"addr_prefix": "agoric",
"logo": "https://dl.airtable.com/.attachments/0628c47ad886794451954f517daf254e/adc8afff/Agoric-logo-color1.png"
}
+17
View File
@@ -0,0 +1,17 @@
{
"chain_name": "celestia",
"coingecko": "",
"api": "https://celestia-api.skynetvalidators.com",
"sdk_version": "0.44.0",
"coin_type": "118",
"min_tx_fee": "800",
"addr_prefix": "celestia",
"logo": "https://explorer-images.s3.filebase.com/celestia-logo.png",
"assets": [{
"base": "celes",
"symbol": "CELES",
"exponent": "0",
"coingecko_id": "",
"logo": "https://explorer-images.s3.filebase.com/celestia-logo.png"
}]
}
+19
View File
@@ -0,0 +1,19 @@
{
"chain_name": "cerberus",
"coingecko": "",
"api": ["https://api.cerberus.zone:1317"],
"sdk_version": "0.44.5",
"coin_type": "118",
"min_tx_fee": "5000",
"addr_prefix": "cerberus",
"logo": "https://cerberus-chain.s3.us-east-2.amazonaws.com/main/logo.png",
"assets": [
{
"base": "ucrbrus",
"symbol": "CRBRUS",
"exponent": "6",
"coingecko_id": "",
"logo": "https://cerberus-chain.s3.us-east-2.amazonaws.com/main/logo.png"
}
]
}
+23
View File
@@ -0,0 +1,23 @@
{
"chain_name": "chronic-token",
"coingecko": "",
"api": "https://chtd-api.skynetvalidators.com",
"sdk_version": "0.44.5",
"coin_type": "118",
"min_tx_fee": "800",
"addr_prefix": "chronic",
"logo": "https://explorer-images.s3.filebase.com/cht-logo.jpg",
"assets": [{
"base": "ucgas",
"symbol": "CGAS",
"exponent": "6",
"coingecko_id": "",
"logo": "https://explorer-images.s3.filebase.com/cht-logo.jpg"
},{
"base": "ucht",
"symbol": "CHT",
"exponent": "6",
"coingecko_id": "ion",
"logo": "https://explorer-images.s3.filebase.com/cht-logo.jpg"
}]
}
+16
View File
@@ -0,0 +1,16 @@
{
"chain_name": "cosmic-horizon",
"api": ["https://coho-api.skynetvalidators.com"],
"sdk_version": "0.44.5",
"coin_type": "118",
"min_tx_fee": "300",
"assets": [{
"base": "ucoho",
"symbol": "COHO",
"exponent": "6",
"coingecko_id": "",
"logo": "https://coho-images.s3.filebase.com/red_logo.png"
}],
"addr_prefix": "coho",
"logo": "https://coho-images.s3.filebase.com/red_logo.png"
}
+17
View File
@@ -0,0 +1,17 @@
{
"chain_name": "DWS",
"coingecko": "",
"api": "https://dws-api.skynetvalidators.com",
"sdk_version": "0.44.3",
"coin_type": "118",
"min_tx_fee": "200",
"addr_prefix": "deweb",
"logo": "https://dws-images.s3.filebase.com/logo.png",
"assets": [{
"base": "udws",
"symbol": "DWS",
"exponent": "6",
"coingecko_id": "",
"logo": "https://dws-images.s3.filebase.com/logo.png"
}]
}
+16
View File
@@ -0,0 +1,16 @@
{
"chain_name": "fetchhub",
"api": ["https://rest-fetchhub.fetch.ai"],
"sdk_version": "0.45.1",
"coin_type": "118",
"min_tx_fee": "3000000000000000",
"addr_prefix": "fetch",
"logo": "https://ping.pub/logos/fetchhub.png",
"assets": [{
"base": "afet",
"symbol": "fet",
"exponent": "18",
"coingecko_id": "",
"logo": "https://ping.pub/logos/fetchhub.png"
}]
}
+16
View File
@@ -0,0 +1,16 @@
{
"chain_name": "ixo",
"api": ["https://impacthub.ixo.world/rest", "https://proxies.sifchain.finance/api/impacthub-3/rest"],
"sdk_version": "0.42.6",
"coin_type": "118",
"min_tx_fee": "3000",
"addr_prefix": "ixo",
"logo": "https://ping.pub/logos/ixo.svg",
"assets": [{
"base": "uixo",
"symbol": "IXO",
"exponent": "6",
"coingecko_id": "ixo",
"logo": "https://ping.pub/logos/ixo.svg"
}]
}
+17
View File
@@ -0,0 +1,17 @@
{
"chain_name": "omniflix",
"coingecko": "",
"api": "https://omniflixhub-api.skynetvalidators.com",
"sdk_version": "0.45.1",
"coin_type": "118",
"min_tx_fee": "3000",
"addr_prefix": "omniflix",
"logo": "https://explorer-images.s3.filebase.com/omniflix-alpha-logo.png",
"assets": [{
"base": "uflix",
"symbol": "FLIX",
"exponent": "6",
"coingecko_id": "",
"logo": "https://explorer-images.s3.filebase.com/omniflix-alpha-logo.png"
}]
}
@@ -1,6 +1,6 @@
{
"chain_name": "certik",
"chain_name": "shentu",
"api":"https://azuredragon.noopsbycertik.com",
"sdk_version": "0.42.9",
"coin_type": "118",
+22
View File
@@ -0,0 +1,22 @@
{
"chain_name": "sommelier",
"api": ["https://lcd-sommelier.keplr.app"],
"sdk_version": "0.44.5",
"coin_type": "118",
"min_tx_fee": "8000",
"addr_prefix": "somm",
"logo": "https://dl.airtable.com/.attachments/0f37f3aa77836b2db0ed217560264ff1/6f51315b/St07WEsb_400x400.png",
"assets": [{
"base": "usomm",
"symbol": "somm",
"exponent": "6",
"coingecko_id": "",
"logo": "https://dl.airtable.com/.attachments/0f37f3aa77836b2db0ed217560264ff1/6f51315b/St07WEsb_400x400.png"
},{
"base": "msomm",
"symbol": "somm",
"exponent": "3",
"coingecko_id": "",
"logo": "https://dl.airtable.com/.attachments/0f37f3aa77836b2db0ed217560264ff1/6f51315b/St07WEsb_400x400.png"
}]
}
-19
View File
@@ -1,19 +0,0 @@
{
"chain_id":"origin_1170-1",
"chain_name": "Uptick Origin",
"api": "https://rest.origin.uptick.network",
"sdk_version": "v0.46.9",
"coin_type": "60",
"min_tx_fee": "40000",
"addr_prefix": "uptick",
"logo": "https://file.uptick.network/file/image/dNOLswid7dGe29CFhPp3Ow.png",
"assets": [
{
"base": "auoc",
"symbol": "UOC",
"exponent": "18",
"coingecko_id": "Uptick Origin",
"logo": "https://file.uptick.network/file/image/dNOLswid7dGe29CFhPp3Ow.png"
}
]
}
+35 -12
View File
@@ -107,15 +107,25 @@
</template>
<b-dropdown-item
:to="{ name: 'portfolio' }"
class="d-none"
v-for="(item,k) in accounts"
:key="k"
:disabled="!item.address"
@click="updateDefaultWallet(item.wallet)"
>
<feather-icon
icon="PieChartIcon"
size="16"
/>
<span class="align-middle ml-50">Portofolio</span>
<div class="d-flex flex-column">
<span class="font-weight-bolder">{{ item.wallet }}
<b-avatar
v-if="item.wallet===walletName"
variant="success"
size="sm"
>
<feather-icon icon="CheckIcon" />
</b-avatar>
</span>
<small>{{ item.address ? formatAddr(item.address.addr) : `Not available for ${selected_chain.chain_name}` }}</small>
</div>
</b-dropdown-item>
<b-dropdown-divider />
<b-dropdown-item :to="{ name: 'accounts' }">
<feather-icon
@@ -155,7 +165,7 @@
<script>
import {
BLink, BNavbarNav, BMedia, BMediaAside, BAvatar, BMediaBody, VBTooltip, BButton,
BDropdown, BDropdownItem,
BDropdown, BDropdownItem, BDropdownDivider,
} from 'bootstrap-vue'
import Ripple from 'vue-ripple-directive'
import DarkToggler from '@core/layouts/components/app-navbar/components/DarkToggler.vue'
@@ -176,6 +186,7 @@ export default {
BButton,
BDropdown,
BDropdownItem,
BDropdownDivider,
// Navbar Components
DarkToggler,
@@ -224,14 +235,26 @@ export default {
}
return [conf.api]
},
accounts() {
let accounts = getLocalAccounts() || {}
accounts = Object.entries(accounts).map(v => ({ wallet: v[0], address: v[1].address.find(x => x.chain === this.selected_chain.chain_name) }))
if (!this.$store.state.chains.defaultWallet && this.accounts.length > 0) {
this.updateDefaultWallet(this.accounts[0].wallet)
}
return accounts
},
},
mounted() {
const accounts = Object.keys(getLocalAccounts() || {})
if (!this.$store.state.chains.defaultWallet && accounts.length > 0) {
this.$store.commit('setDefaultWallet', accounts[0])
}
},
methods: {
formatAddr(v) {
return v.substring(0, 10).concat('...', v.substring(v.length - 10))
},
updateDefaultWallet(v) {
this.$store.commit('setDefaultWallet', v)
},
change(v) {
this.index = v
const conf = this.$store.state.chains.selected
+24 -3
View File
@@ -60,7 +60,7 @@ export default class ChainFetch {
if (conf.chain_name === 'injective') {
return ChainFetch.fetch('https://tm.injective.network', '/block').then(data => Block.create(commonProcess(data)))
}
return this.get('/blocks/latest', config).then(data => Block.create(data))
return this.get(`/blocks/latest?${new Date().getTime()}`, config).then(data => Block.create(data))
}
async getBlockByHeight(height, config = null) {
@@ -156,8 +156,16 @@ export default class ChainFetch {
})
}
async getValidatorListByHeight(height) {
return this.get(`/validatorsets/${height}`).then(data => commonProcess(data))
async getValidatorListByStatus(status) {
return this.get(`/cosmos/staking/v1beta1/validators?status=${status}&pagination.limit=500`).then(data => {
const result = commonProcess(data)
const vals = result.validators ? result.validators : result
return vals.map(i => new Validator().init(i))
})
}
async getValidatorListByHeight(height, offset) {
return this.get(`/cosmos/base/tendermint/v1beta1/validatorsets/${height}?pagination.limit=100&pagination.offset=${offset}`).then(data => commonProcess(data))
}
async getStakingValidator(address) {
@@ -378,6 +386,19 @@ export default class ChainFetch {
return ChainFetch.fetchCoinMarketCap(`/quote/${symbol}`)
}
// Simulate Execution of tx
async simulate(tx, config = null) {
return this.post('/cosmos/tx/v1beta1/simulate', tx, config).then(res => {
if (res.code && res.code !== 0) {
throw new Error(res.message)
}
if (res.tx_response && res.tx_response.code !== 0) {
throw new Error(res.tx_response.raw_log)
}
return res
})
}
// Tx Submit
async broadcastTx(bodyBytes, config = null) {
const txString = toBase64(TxRaw.encode(bodyBytes).finish())
+9 -1
View File
@@ -91,10 +91,18 @@ export default class OsmosAPI {
async get(url) {
const chains = getLocalChains()
this.host = chains.osmosis.api
const conf = chains.osmosis
const index = this.getApiIndex(conf)
this.host = Array.isArray(conf.api) ? conf.api[index] : conf.api
return fetch(`${this.host}${url}`).then(res => res.json())
}
getApiIndex(config = null) {
const conf = config || this.config
const index = Number(localStorage.getItem(`${conf.chain_name}-api-index`) || 0)
return index < conf.api.length ? index : 0
}
async getMarketData(from, to, days = 14) {
if (from && to) {
this.exe_time = ''
-42
View File
@@ -26,34 +26,6 @@ const router = new VueRouter({
],
},
},
{
path: '/wallet/setting',
name: 'setting',
component: () => import('@/views/WalletSetting.vue'),
meta: {
pageTitle: 'Setting',
breadcrumb: [
{
text: 'Setting',
active: true,
},
],
},
},
{
path: '/wallet/portfolio',
name: 'portfolio',
component: () => import('@/views/WalletPortfolio.vue'),
meta: {
pageTitle: 'Portfolio',
breadcrumb: [
{
text: 'Portfolio',
active: true,
},
],
},
},
{
path: '/coffee',
name: 'coffee',
@@ -97,20 +69,6 @@ const router = new VueRouter({
],
},
},
{
path: '/wallet/address',
name: 'addresses',
component: () => import('@/views/WalletAddressBook.vue'),
meta: {
pageTitle: 'Address Book',
breadcrumb: [
{
text: 'Address Book',
active: true,
},
],
},
},
{
path: '/wallet/delegations',
name: 'delegations',
+12 -15
View File
@@ -157,19 +157,19 @@
</router-link>
<b-button
v-if="p.status===1"
v-b-modal.deposit-window
v-b-modal.operation-modal
variant="primary"
class="btn float-right mg-2"
@click="selectProposal(p.id, p.title)"
@click="selectProposal('GovDeposit',p.id, p.title)"
>
{{ $t('btn_deposit') }}
</b-button>
<b-button
v-if="p.status===2"
v-b-modal.vote-window
v-b-modal.operation-modal
variant="primary"
class="btn float-right mg-2"
@click="selectProposal(p.id, p.title)"
@click="selectProposal('Vote',p.id, p.title)"
>
{{ $t('btn_vote') }}
</b-button>
@@ -177,13 +177,10 @@
</b-card>
</b-col>
</b-row>
<operation-vote-component
<operation-modal
:type="operationModalType"
:proposal-id="selectedProposalId"
:title="selectedTitle"
/>
<operation-gov-deposit-component
:proposal-id="selectedProposalId"
:title="selectedTitle"
:proposal-title="selectedTitle"
/>
</div>
</template>
@@ -196,8 +193,7 @@ import Ripple from 'vue-ripple-directive'
import { Proposal } from '@/libs/data'
import { percent, tokenFormatter } from '@/libs/utils'
import dayjs from 'dayjs'
import OperationVoteComponent from './OperationVoteComponent.vue'
import OperationGovDepositComponent from './OperationGovDepositComponent.vue'
import OperationModal from '@/views/components/OperationModal/index.vue'
export default {
components: {
@@ -212,8 +208,7 @@ export default {
BCardBody,
BRow,
BCol,
OperationVoteComponent,
OperationGovDepositComponent,
OperationModal,
},
directives: {
'b-modal': VBModal,
@@ -225,6 +220,7 @@ export default {
selectedTitle: '',
proposals: [new Proposal()],
max: 1,
operationModalType: '',
}
},
mounted() {
@@ -234,7 +230,8 @@ export default {
percent: v => percent(v),
formatDate: v => dayjs(v).format('YYYY-MM-DD'),
formatToken: v => tokenFormatter(v, {}),
selectProposal(pid, title) {
selectProposal(modal, pid, title) {
this.operationModalType = modal
this.selectedProposalId = Number(pid)
this.selectedTitle = title
},
+16 -13
View File
@@ -109,10 +109,11 @@
</b-button>
</router-link>
<b-button
v-b-modal.vote-window
v-b-modal.operation-modal
:disabled="proposal.status!=2"
variant="primary"
class="btn float-right mg-2"
@click="openModal('Vote')"
>
{{ $t('btn_vote') }}
</b-button>
@@ -232,30 +233,29 @@
</b-button>
</router-link>
<b-button
v-b-modal.deposit-window
v-b-modal.operation-modal
:disabled="proposal.status!=1"
variant="primary"
class="btn float-right mg-2"
@click="openModal('GovDeposit')"
>
{{ $t('btn_deposit') }}
</b-button>
<b-button
v-b-modal.vote-window
v-b-modal.operation-modal
:disabled="proposal.status!=2"
variant="primary"
class="btn float-right mg-2 mr-1"
@click="openModal('Vote')"
>
{{ $t('btn_vote') }}
</b-button>
</b-card-footer>
</b-card>
<operation-vote-component
<operation-modal
:type="operationModalType"
:proposal-id="Number(proposal.id)"
:title="proposal.title"
/>
<operation-gov-deposit-component
:proposal-id="Number(proposal.id)"
:title="proposal.title"
:proposal-title="proposal.title"
/>
</section>
</template>
@@ -273,9 +273,9 @@ import {
} from '@/libs/utils'
import { Proposal, Proposer } from '@/libs/data'
import dayjs from 'dayjs'
import OperationModal from '@/views/components/OperationModal/index.vue'
import ObjectFieldComponent from './ObjectFieldComponent.vue'
import OperationVoteComponent from './OperationVoteComponent.vue'
import OperationGovDepositComponent from './OperationGovDepositComponent.vue'
// import { formatToken } from '@/libs/data/data'
export default {
@@ -295,9 +295,8 @@ export default {
BTooltip,
BBadge,
ObjectFieldComponent,
OperationVoteComponent,
OperationGovDepositComponent,
FlipCountdown,
OperationModal,
},
data() {
return {
@@ -307,6 +306,7 @@ export default {
proposer: new Proposer(),
deposits: [],
votes: [],
operationModalType: '',
votes_fields: [
{
key: 'voter',
@@ -411,6 +411,9 @@ export default {
formatAddress(v) {
return getStakingValidatorByAccount(this.$http.config.chain_name, v)
},
openModal(type) {
this.operationModalType = type
},
},
}
</script>
+30 -28
View File
@@ -40,7 +40,7 @@
<b-col
v-for="(data,index) in chains"
:key="index"
md="4"
md="3"
sm="6"
>
<router-link :to="data.chain_name">
@@ -48,34 +48,36 @@
v-if="data"
class="earnings-card text-left"
>
<b-row>
<b-col cols="8">
<b-card-title class="mb-1 text-uppercase">
{{ data.chain_name }} <small class="font-small-2">{{ data.sdk_version }}</small>
</b-card-title>
<div class="font-small-2">
Height
<div>
<b-card-title class="mb-1 text-uppercase">
{{ data.chain_name }} <small class="font-small-2">{{ data.sdk_version }}</small>
</b-card-title>
<div class="d-flex justify-content-between">
<div>
<div class="font-small-2">
Height
</div>
<h5 class="mb-1">
{{ data.height || '0' }}
</h5>
</div>
<h5 class="mb-1">
{{ data.height || '0' }}
</h5>
<b-card-text class="text-muted font-small-2">
<span> Updated on </span><span class="font-weight-bolder">{{ data.time || '...' }}</span>
</b-card-text>
</b-col>
<b-col
cols="4"
>
<b-avatar
:src="data.logo"
class="mt-1 badge-minimal"
variant="light-primary"
rounded
size="82"
badge
:badge-variant="data.variant"
/></b-col>
</b-row>
<div>
<b-avatar
:src="data.logo"
class="badge-minimal"
variant="light-primary"
rounded
size="md"
badge
:badge-variant="data.variant"
/>
</div>
</div>
<b-card-text class="text-muted font-small-2">
<span> Updated on </span><span class="font-weight-bolder">{{ data.time || '...' }}</span>
</b-card-text>
</div>
</b-card>
</router-link>
</b-col>
+1 -5
View File
@@ -219,7 +219,6 @@ import {
extractAccountNumberAndSequence,
formatToken, formatTokenDenom, getLocalAccounts, getLocalChains, getUnitAmount, setLocalTxHistory, sign, timeIn,
} from '@/libs/utils'
import { Cosmos } from '@cosmostation/cosmosjs'
import ToastificationContent from '@core/components/toastification/ToastificationContent.vue'
import WalletInputVue from './components/WalletInput.vue'
@@ -371,10 +370,7 @@ export default {
format(v) {
return formatToken(v, this.IBCDenom)
},
async sendCosmos() {
const cosmos = new Cosmos(this.selectedChain.api, this.chainId)
cosmos.getAccounts()
},
async send() {
const txMsgs = [
{
+106 -87
View File
@@ -78,7 +78,7 @@
</template>
<template #cell(operation)="data">
<b-button
v-b-modal.delegate-window
v-b-modal.operation-modal
:name="data.item.operator_address"
variant="primary"
size="sm"
@@ -93,22 +93,24 @@
no-body
>
<b-card-header class="d-flex justify-content-between">
<small class="d-none d-md-block">
<b-badge variant="danger">
&nbsp;
</b-badge>
Top 33%
<b-badge variant="warning">
&nbsp;
</b-badge>
Top 67% of Voting Power
</small>
<b-card-title>
<b-form-group class="mb-0">
<b-form-radio-group
id="btn-radios-1"
v-model="selectedStatus"
button-variant="outline-primary"
:options="statusOptions"
buttons
name="radios-btn-default"
@change="getValidatorListByStatus"
/>
</b-form-group>
<b-card-title class="d-none d-sm-block">
<span>Validators {{ validators.length }}/{{ stakingParameters.max_validators }} </span>
</b-card-title>
</b-card-header>
<b-card-body class="pl-0 pr-0">
<b-card-body class="pl-0 pr-0 pb-0">
<b-table
class="mb-0"
:items="list"
:fields="validator_fields"
:sort-desc="true"
@@ -184,7 +186,7 @@
</template>
<template #cell(operation)="data">
<b-button
v-b-modal.delegate-window
v-b-modal.operation-modal
:name="data.item.operator_address"
variant="primary"
size="sm"
@@ -195,22 +197,37 @@
</template>
</b-table>
</b-card-body>
<template #footer>
<small class="d-none d-md-block">
<b-badge variant="danger">
&nbsp;
</b-badge>
Top 33%
<b-badge variant="warning">
&nbsp;
</b-badge>
Top 67% of Voting Power
</small>
</template>
</b-card>
<operation-delegate-component :validator-address="validator_address" />
<operation-modal
type="Delegate"
:validator-address="validator_address"
/>
</div>
</template>
<script>
import {
BTable, BMedia, BAvatar, BBadge, BCard, BCardHeader, BCardTitle, VBTooltip, BCardBody, BButton,
BTable, BMedia, BAvatar, BBadge, BCard, BCardHeader, BCardTitle, VBTooltip, BCardBody, BButton, BFormRadioGroup, BFormGroup,
} from 'bootstrap-vue'
import {
Validator, percent, StakingParameters, formatToken,
percent, StakingParameters, formatToken,
} from '@/libs/utils'
import { keybase } from '@/libs/fetch'
import OperationModal from '@/views/components/OperationModal/index.vue'
// import { toHex } from '@cosmjs/encoding'
// import fetch from 'node-fetch'
import OperationDelegateComponent from './OperationDelegateComponent.vue'
export default {
components: {
@@ -223,37 +240,22 @@ export default {
BCardTitle,
BCardBody,
BButton,
OperationDelegateComponent,
BFormRadioGroup,
BFormGroup,
OperationModal,
},
directives: {
'b-tooltip': VBTooltip,
},
data() {
return {
keys: [
'bitsongvaloper1jxv0u20scum4trha72c7ltfgfqef6nscl86wxa',
'akashvaloper1vgstlgtsx4w80gphwgre0fcvc04lcnaelukvll',
'certikvaloper1jxv0u20scum4trha72c7ltfgfqef6nsczkvcu7',
'cosmosvaloper1jxv0u20scum4trha72c7ltfgfqef6nsch7q6cu',
'iva16plp8cmfkjssp222taq6pv6mkm8c5pa9lcktta',
'junovaloper1jxv0u20scum4trha72c7ltfgfqef6nscm9pmg2',
'kavavaloper1xftqdxvq0xkv2mu8c5y0jrsc578tak4m9u0s44',
'kivaloper1jxv0u20scum4trha72c7ltfgfqef6nschqtan9',
'osmovaloper1jxv0u20scum4trha72c7ltfgfqef6nscqx0u46',
'persistencevaloper1jxv0u20scum4trha72c7ltfgfqef6nsc4zjpnj',
'starsvaloper1jxv0u20scum4trha72c7ltfgfqef6nscdghxyx',
'digvaloper1jxv0u20scum4trha72c7ltfgfqef6nsc4s577p',
'bcnavaloper1jxv0u20scum4trha72c7ltfgfqef6nsc384wxf',
'pbvaloper1jxv0u20scum4trha72c7ltfgfqef6nsc5nn6cf',
'rizonvaloper1jxv0u20scum4trha72c7ltfgfqef6nsczn2l68',
],
islive: true,
validator_address: null,
mintInflation: 0,
stakingPool: 1,
stakingParameters: new StakingParameters(),
validators: [new Validator()],
delegations: [new Validator()],
validators: [],
delegations: [],
changes: {},
validator_fields: [
{
@@ -288,16 +290,21 @@ export default {
thClass: 'text-right',
},
],
statusOptions: [
{ text: 'Active', value: ['BOND_STATUS_BONDED'] },
{ text: 'Inactive', value: ['BOND_STATUS_UNBONDED', 'BOND_STATUS_UNBONDING'] },
],
selectedStatus: ['BOND_STATUS_BONDED'],
}
},
computed: {
pingVals() {
return this.list.filter(x => this.keys.includes(x.operator_address))
return this.list.filter(x => x.description.identity === '6783E9F948541962')
},
list() {
return this.validators.map(x => {
const xh = x
const change = this.changes[x.consensus_pubkey.value]
const change = this.changes[x.consensus_pubkey.key]
if (change) {
xh.changes = change.latest - change.previous
}
@@ -306,61 +313,73 @@ export default {
},
},
created() {
this.$http.getValidatorListByHeight('latest').then(data => {
let height = Number(data.block_height)
if (height > 14400) {
height -= 14400
} else {
height = 1
}
const changes = []
data.validators.forEach(x => {
changes[x.pub_key.value] = { latest: Number(x.voting_power), previous: 0 }
})
this.$http.getValidatorListByHeight(height).then(previous => {
previous.validators.forEach(x => {
if (changes[x.pub_key.value]) {
changes[x.pub_key.value].previous = Number(x.voting_power)
} else {
changes[x.pub_key.value] = { latest: 0, previous: Number(x.voting_power) }
}
})
this.$set(this, 'changes', changes)
})
})
this.getValidatorListByHeight()
this.$http.getStakingParameters().then(res => {
this.stakingParameters = res
})
this.$http.getValidatorList().then(res => {
const identities = []
const temp = res
let total = 0
for (let i = 0; i < temp.length; i += 1) {
total += temp[i].tokens
const { identity } = temp[i].description
const url = this.$store.getters['chains/getAvatarById'](identity)
if (url) {
temp[i].avatar = url
} else if (identity && identity !== '') {
identities.push(identity)
}
}
this.stakingPool = total
this.validators = temp
// fetch avatar from keybase
let promise = Promise.resolve()
identities.forEach(item => {
promise = promise.then(() => new Promise(resolve => {
this.avatar(item, resolve)
}))
})
})
this.getValidatorListByStatus(this.selectedStatus)
},
beforeDestroy() {
this.islive = false
},
methods: {
getValidatorListByHeight(offset = 0) {
this.$http.getValidatorListByHeight('latest', offset).then(data => {
let height = Number(data.block_height)
if (height > 14400) {
height -= 14400
} else {
height = 1
}
const { changes } = this
data.validators.forEach(x => {
changes[x.pub_key.key] = { latest: Number(x.voting_power), previous: 0 }
})
this.$http.getValidatorListByHeight(height, offset).then(previous => {
previous.validators.forEach(x => {
if (changes[x.pub_key.key]) {
changes[x.pub_key.key].previous = Number(x.voting_power)
} else {
changes[x.pub_key.key] = { latest: 0, previous: Number(x.voting_power) }
}
})
this.$set(this, 'changes', changes)
})
})
},
getValidatorListByStatus(statusList) {
this.validators = []
statusList.forEach(status => {
this.$http.getValidatorListByStatus(status).then(res => {
const identities = []
const temp = res
let total = 0
for (let i = 0; i < temp.length; i += 1) {
total += temp[i].tokens
const { identity } = temp[i].description
const url = this.$store.getters['chains/getAvatarById'](identity)
if (url) {
temp[i].avatar = url
} else if (identity && identity !== '') {
identities.push(identity)
}
}
this.stakingPool = total
if (total > 100) {
this.getValidatorListByHeight(100)
}
this.validators.push(...temp)
// fetch avatar from keybase
let promise = Promise.resolve()
identities.forEach(item => {
promise = promise.then(() => new Promise(resolve => {
this.avatar(item, resolve)
}))
})
})
})
},
selectValidator(da) {
this.validator_address = da
},
+8 -6
View File
@@ -6,7 +6,7 @@
<b-card-header>
<b-card-title>Outstanding Rewards</b-card-title>
<feather-icon
v-b-modal.withdraw-commission-window
v-b-modal.WithdrawCommission
icon="MoreVerticalIcon"
size="18"
class="cursor-pointer"
@@ -76,7 +76,7 @@
</b-card-body>
<b-card-body class="pt-0">
<b-button
v-b-modal.withdraw-commission-window
v-b-modal.WithdrawCommission
block
size="sm"
variant="primary"
@@ -84,9 +84,11 @@
Withdraw Commission
</b-button>
</b-card-body>
<operation-withdraw-commission-component
:validator-address="validator"
<operation-modal
type="WithdrawCommission"
modal-id="WithdrawCommission"
:address="address"
:validator-address="validator"
/>
</b-card>
</template>
@@ -98,7 +100,7 @@ import {
import { sha256 } from '@cosmjs/crypto'
import { toHex } from '@cosmjs/encoding'
import { formatToken, numberWithCommas } from '@/libs/utils'
import OperationWithdrawCommissionComponent from './OperationWithdrawCommissionComponent.vue'
import OperationModal from '@/views/components/OperationModal/index.vue'
export default {
components: {
@@ -111,7 +113,7 @@ export default {
BMedia,
BMediaAside,
BAvatar,
OperationWithdrawCommissionComponent,
OperationModal,
},
props: {
data: {
+7 -4
View File
@@ -25,7 +25,7 @@
</div>
<div class="d-flex flex-wrap">
<b-button
v-b-modal.delegate-window
v-b-modal.operation-modal
variant="primary"
class="mr-25 mb-25"
>
@@ -268,7 +268,10 @@
</b-col>
</b-row>
</template>
<operation-delegate-component :validator-address="validator.operator_address" />
<operation-modal
type="Delegate"
:validator-address="validator.operator_address"
/>
</div>
</template>
@@ -281,10 +284,10 @@ import {
percent, formatToken, StakingParameters, Validator, operatorAddressToAccount, consensusPubkeyToHexAddress, toDay, abbrMessage, abbrAddress,
} from '@/libs/utils'
import { keybase } from '@/libs/fetch'
import OperationModal from '@/views/components/OperationModal/index.vue'
import StakingAddressComponent from './StakingAddressComponent.vue'
import StakingCommissionComponent from './StakingCommissionComponent.vue'
import StakingRewardComponent from './StakingRewardComponent.vue'
import OperationDelegateComponent from './OperationDelegateComponent.vue'
export default {
components: {
@@ -300,7 +303,7 @@ export default {
StakingAddressComponent,
StakingCommissionComponent,
StakingRewardComponent,
OperationDelegateComponent,
OperationModal,
},
directives: {
'b-modal': VBModal,
+42 -11
View File
@@ -19,10 +19,20 @@
>
Browse favorite only
</b-button>
<b-form-input
v-model="query"
placeholder="Keywords to filter validators"
/>
<b-input-group>
<b-input-group-prepend is-text>
<b-form-checkbox
v-model="missedFilter"
v-b-tooltip.hover
title="Only missed blocks"
name="viewMissed"
/>
</b-input-group-prepend>
<b-form-input
v-model="query"
placeholder="Keywords to filter validators"
/>
</b-input-group>
</b-card>
<b-row>
<b-col
@@ -41,12 +51,25 @@
><span class="d-inline-block text-truncate font-weight-bold align-bottom">{{ index+1 }} {{ x.validator.moniker }}</span>
</b-form-checkbox>
<span
v-if="missing[x.address] && missing[x.address].missed_blocks_counter > 0"
v-b-tooltip.hover.v-danger
:title="`missed blocks:${missing[x.address].missed_blocks_counter}`"
class="text-danger text-bolder"
v-if="missing[x.address]"
>
{{ missing[x.address].missed_blocks_counter }}
<b-badge
v-if="missing[x.address].missed_blocks_counter > 0"
v-b-tooltip.hover.v-danger
variant="light-danger"
:title="`${missing[x.address].missed_blocks_counter} missed blocks`"
class="text-danger text-bolder"
>
{{ missing[x.address].missed_blocks_counter }}
</b-badge>
<b-badge
v-else
v-b-tooltip.hover.v-success
variant="light-success"
title="Perfect! No missed blocks"
>
0
</b-badge>
</span>
</div>
<div class="d-flex justify-content-between align-self-stretch flex-wrap">
@@ -72,7 +95,7 @@
<script>
import {
BRow, BCol, VBTooltip, BFormInput, BCard, BAlert, BFormCheckbox, BButton,
BRow, BCol, VBTooltip, BFormInput, BCard, BAlert, BFormCheckbox, BButton, BBadge, BInputGroup, BInputGroupPrepend,
} from 'bootstrap-vue'
import {
@@ -88,7 +111,10 @@ export default {
BCard,
BAlert,
BButton,
BBadge,
BFormCheckbox,
BInputGroup,
BInputGroupPrepend,
},
directives: {
'b-tooltip': VBTooltip,
@@ -97,6 +123,7 @@ export default {
const { chain } = this.$route.params
const pinned = localStorage.getItem('pinned') ? localStorage.getItem('pinned').split(',') : ''
return {
missedFilter: false,
pinned,
chain,
query: '',
@@ -111,10 +138,14 @@ export default {
uptime() {
const vals = this.query ? this.validators.filter(x => String(x.description.moniker).indexOf(this.query) > -1) : this.validators
vals.sort((a, b) => b.delegator_shares - a.delegator_shares)
return vals.map(x => ({
const rets = vals.map(x => ({
validator: x.description,
address: consensusPubkeyToHexAddress(x.consensus_pubkey),
}))
if (this.missedFilter) {
return rets.filter(x => this.missing[x.address].missed_blocks_counter > 0)
}
return rets
},
},
created() {
+20 -6
View File
@@ -33,12 +33,25 @@
<span class="d-inline-block text-truncate font-weight-bold align-bottom"> {{ x.validator.moniker }} </span>
</b-form-checkbox>
<span
v-if="missing[x.address] && missing[x.address].missed_blocks_counter > 0"
v-b-tooltip.hover.v-danger
:title="`missed blocks:${missing[x.address].missed_blocks_counter}`"
class="text-danger text-bolder"
v-if="missing[x.address]"
>
{{ missing[x.address].missed_blocks_counter }}
<b-badge
v-if="missing[x.address].missed_blocks_counter > 0"
v-b-tooltip.hover.v-danger
variant="light-danger"
:title="`${missing[x.address].missed_blocks_counter} missed blocks`"
class="text-danger text-bolder"
>
{{ missing[x.address].missed_blocks_counter }}
</b-badge>
<b-badge
v-else
v-b-tooltip.hover.v-success
variant="light-success"
title="Perfect! No missed blocks"
>
0
</b-badge>
</span>
</div>
<div class="d-flex justify-content-between align-self-stretch flex-wrap">
@@ -64,7 +77,7 @@
<script>
import {
BRow, BCol, VBTooltip, BCard, BAlert, BCardTitle, BFormCheckbox,
BRow, BCol, VBTooltip, BCard, BAlert, BCardTitle, BFormCheckbox, BBadge,
} from 'bootstrap-vue'
import {
@@ -75,6 +88,7 @@ import { Bech32, toHex } from '@cosmjs/encoding'
export default {
name: 'Blocks',
components: {
BBadge,
BRow,
BCol,
BCard,
+2 -2
View File
@@ -24,8 +24,8 @@
Note
</div>
<div class="alert-body">
There are two ways to monitor your valdiators:
<li> Pin a validator on Uptime page.</li>
There are two ways to monitor your validators:
<li> Pin a validator on Uptime pages.</li>
<li> Specify parameters like following: <pre>https://ping.pub/cosmos/uptime/my?validators={"sifchain":["FBADE9A30473BB9ED6DFA16BFB3838E028F33650"],"chain_name":["hexAddress"]}</pre></li>
</div>
</b-alert>
+32 -43
View File
@@ -39,26 +39,28 @@
<b-card-title>Assets</b-card-title>
<div>
<b-button
v-b-modal.transfer-window
v-b-modal.operation-modal
variant="primary"
size="sm"
class="mr-25"
><feather-icon
icon="SendIcon"
class="d-md-none"
/>
<span class="d-none d-md-block">Transfer</span>
@click="setOperationModalType('Transfer')"
>
<feather-icon
icon="SendIcon"
class="d-md-none"
/><small class="d-none d-md-block">Transfer</small>
</b-button>
<b-button
v-b-modal.ibc-transfer-window
v-b-modal.operation-modal
variant="danger"
size="sm"
@click="setOperationModalType('IBCTransfer')"
><feather-icon
icon="SendIcon"
class="d-md-none"
/>
<span class="d-none d-md-block">IBC Transfer
</span></b-button>
<span class="d-none d-md-block">IBC Transfer</span>
</b-button>
</div>
</b-card-header>
<b-card-body class="pl-0 pr-0">
@@ -124,10 +126,11 @@
<b-card-title>Delegation</b-card-title>
<div>
<b-button
v-b-modal.delegate-window
v-b-modal.operation-modal
variant="primary"
size="sm"
class="mr-25"
@click="setOperationModalType('Delegate')"
>
<feather-icon
icon="LogInIcon"
@@ -136,9 +139,10 @@
</b-button>
<b-button
v-if="delegations"
v-b-modal.withdraw-window
v-b-modal.operation-modal
variant="primary"
size="sm"
@click="setOperationModalType('Withdraw')"
>
<feather-icon
icon="ShareIcon"
@@ -158,29 +162,29 @@
size="sm"
>
<b-button
v-b-modal.delegate-window
v-b-modal.operation-modal
v-ripple.400="'rgba(113, 102, 240, 0.15)'"
v-b-tooltip.hover.top="'Delegate'"
variant="outline-primary"
@click="selectValue(data.value)"
@click="selectValue(data.value,'Delegate')"
>
<feather-icon icon="LogInIcon" />
</b-button>
<b-button
v-b-modal.redelegate-window
v-b-modal.operation-modal
v-ripple.400="'rgba(113, 102, 240, 0.15)'"
v-b-tooltip.hover.top="'Redelegate'"
variant="outline-primary"
@click="selectValue(data.value)"
@click="selectValue(data.value,'Redelegate')"
>
<feather-icon icon="ShuffleIcon" />
</b-button>
<b-button
v-b-modal.unbond-window
v-b-modal.operation-modal
v-ripple.400="'rgba(113, 102, 240, 0.15)'"
v-b-tooltip.hover.top="'Unbond'"
variant="outline-primary"
@click="selectValue(data.value)"
@click="selectValue(data.value,'Unbond')"
>
<feather-icon icon="LogOutIcon" />
</b-button>
@@ -338,20 +342,10 @@
<vue-qr :text="address" />
</b-popover>
<operation-transfer-component :address="address" />
<operation-transfer-2-component :address="address" />
<operation-withdraw-component :address="address" />
<operation-unbond-component
<operation-modal
:type="operationModalType"
:address="address"
:validator-address.sync="selectedValidator"
/>
<operation-delegate-component
:address="address"
:validator-address.sync="selectedValidator"
/>
<operation-redelegate-component
:address="address"
:validator-address.sync="selectedValidator"
:validator-address="selectedValidator"
/>
</div>
</template>
@@ -373,13 +367,8 @@ import {
} from '@/libs/utils'
import { sha256 } from '@cosmjs/crypto'
import { toHex } from '@cosmjs/encoding'
import OperationModal from '@/views/components/OperationModal/index.vue'
import ObjectFieldComponent from './ObjectFieldComponent.vue'
import OperationTransferComponent from './OperationTransferComponent.vue'
import OperationWithdrawComponent from './OperationWithdrawComponent.vue'
import OperationUnbondComponent from './OperationUnbondComponent.vue'
import OperationDelegateComponent from './OperationDelegateComponent.vue'
import OperationRedelegateComponent from './OperationRedelegateComponent.vue'
import OperationTransfer2Component from './OperationTransfer2Component.vue'
import ChartComponentDoughnut from './ChartComponentDoughnut.vue'
export default {
@@ -405,13 +394,8 @@ export default {
// eslint-disable-next-line vue/no-unused-components
ToastificationContent,
ObjectFieldComponent,
OperationTransferComponent,
OperationWithdrawComponent,
OperationDelegateComponent,
OperationRedelegateComponent,
OperationUnbondComponent,
OperationTransfer2Component,
ChartComponentDoughnut,
OperationModal,
},
directives: {
'b-modal': VBModal,
@@ -434,6 +418,7 @@ export default {
unbonding: [],
quotes: {},
transactions: [],
operationModalType: '',
}
},
computed: {
@@ -620,8 +605,12 @@ export default {
this.transactions = res
})
},
selectValue(v) {
selectValue(v, type) {
this.selectedValidator = v
this.setOperationModalType(type)
},
setOperationModalType(type) {
this.operationModalType = type
},
formatHash: abbrAddress,
formatDenom(v) {
+12 -12
View File
@@ -153,15 +153,15 @@
/>
<b-dropdown-item
v-if="balances[acc.addr]"
v-b-modal.transfer-window
@click="transfer(acc.addr)"
v-b-modal.operation-modal
@click="transfer('Transfer',acc.addr)"
>
<feather-icon icon="SendIcon" /> Transfer
</b-dropdown-item>
<b-dropdown-item
v-if="balances[acc.addr]"
v-b-modal.ibc-transfer-window
@click="transfer(acc.addr)"
v-b-modal.operation-modal
@click="transfer('IBCTransfer',acc.addr)"
>
<feather-icon icon="SendIcon" /> IBC Transfer
</b-dropdown-item>
@@ -265,10 +265,10 @@
Connect Wallet
</b-card>
</router-link>
<operation-transfer-component
:address.sync="selectedAddress"
<operation-modal
:type="operationModalType"
:address="selectedAddress"
/>
<operation-transfer-2-component :address="selectedAddress" />
</div>
</template>
@@ -287,8 +287,7 @@ import {
import ToastificationContent from '@core/components/toastification/ToastificationContent.vue'
import AppCollapse from '@core/components/app-collapse/AppCollapse.vue'
import AppCollapseItem from '@core/components/app-collapse/AppCollapseItem.vue'
import OperationTransferComponent from './OperationTransferComponent.vue'
import OperationTransfer2Component from './OperationTransfer2Component.vue'
import OperationModal from '@/views/components/OperationModal/index.vue'
import ChartComponentDoughnut from './ChartComponentDoughnut.vue'
import EchartScatter from './components/charts/EchartScatter.vue'
@@ -309,14 +308,13 @@ export default {
// eslint-disable-next-line vue/no-unused-components
VBTooltip,
FeatherIcon,
OperationTransferComponent,
// eslint-disable-next-line vue/no-unused-components
ToastificationContent,
OperationTransfer2Component,
ChartComponentDoughnut,
AppCollapse,
AppCollapseItem,
EchartScatter,
OperationModal,
},
directives: {
'b-tooltip': VBTooltip,
@@ -335,6 +333,7 @@ export default {
delegations: {},
ibcDenom: {},
quotes: {},
operationModalType: '',
options: {
maintainAspectRatio: false,
legend: {
@@ -533,7 +532,8 @@ export default {
this.currency2 = c
this.currency = getUserCurrencySign()
},
transfer(addr) {
transfer(type, addr) {
this.operationModalType = type
this.selectedAddress = addr
},
completeAdd() {
+14 -28
View File
@@ -42,29 +42,29 @@
size="sm"
>
<b-button
v-b-modal.delegate-window
v-b-modal.operation-modal
v-ripple.400="'rgba(113, 102, 240, 0.15)'"
v-b-tooltip.hover.top="'Delegate'"
variant="outline-primary"
@click="selectValue(data.item)"
@click="selectValue('Delegate',data.item)"
>
<feather-icon icon="LogInIcon" />
</b-button>
<b-button
v-b-modal.redelegate-window
v-b-modal.operation-modal
v-ripple.400="'rgba(113, 102, 240, 0.15)'"
v-b-tooltip.hover.top="'Redelegate'"
variant="outline-primary"
@click="selectValue(data.item)"
@click="selectValue('Redelegate',data.item)"
>
<feather-icon icon="ShuffleIcon" />
</b-button>
<b-button
v-b-modal.unbond-window
v-b-modal.operation-modal
v-ripple.400="'rgba(113, 102, 240, 0.15)'"
v-b-tooltip.hover.top="'Unbond'"
variant="outline-primary"
@click="selectValue(data.item)"
@click="selectValue('Unbond',data.item)"
>
<feather-icon icon="LogOutIcon" />
</b-button>
@@ -74,18 +74,10 @@
</b-card>
<!--- not completed--->
<operation-withdraw-component :address="address" />
<operation-unbond-component
<operation-modal
:type="operationModalType"
:address="address"
:validator-address.sync="selectedValidator"
/>
<operation-delegate-component
:address="address"
:validator-address.sync="selectedValidator"
/>
<operation-redelegate-component
:address="address"
:validator-address.sync="selectedValidator"
:validator-address="selectedValidator"
/>
</div>
</template>
@@ -99,11 +91,7 @@ import {
formatToken, getCachedValidators, getLocalAccounts, getLocalChains, tokenFormatter,
} from '@/libs/utils'
import FeatherIcon from '@/@core/components/feather-icon/FeatherIcon.vue'
import OperationWithdrawComponent from './OperationWithdrawComponent.vue'
import OperationUnbondComponent from './OperationUnbondComponent.vue'
import OperationDelegateComponent from './OperationDelegateComponent.vue'
import OperationRedelegateComponent from './OperationRedelegateComponent.vue'
import OperationModal from '@/views/components/OperationModal/index.vue'
export default {
components: {
@@ -113,11 +101,7 @@ export default {
BTable,
BCard,
FeatherIcon,
OperationWithdrawComponent,
OperationDelegateComponent,
OperationRedelegateComponent,
OperationUnbondComponent,
OperationModal,
},
directives: {
'b-tooltip': VBTooltip,
@@ -153,6 +137,7 @@ export default {
accounts: [],
delegations: [],
rewards: {},
operationModalType: '',
}
},
computed: {
@@ -200,7 +185,8 @@ export default {
this.init()
},
methods: {
selectValue(v) {
selectValue(type, v) {
this.operationModalType = type
this.address = v.delegator_address
this.selectedValidator = v.validator.validator
return v
@@ -0,0 +1,214 @@
<template>
<div>
<div
v-if="false"
class="board "
>
<div class="data">
<div class="board-row">
<div class="key">
AMOUNT
</div>
<div class="value">
1,233,000 USDT
</div>
</div>
<div class="board-row">
<div class="key">
BRIDGE FEE
</div>
<div class="value">
3,000 USDT
</div>
</div>
</div>
<div class="sum">
<div class="key">
TRANSFER AMOUNT
</div>
<div class="value">
1,213,000 USDT
</div>
</div>
</div>
<p
v-if="succeed"
class="result-text mt-1 text-success"
>
Congratulations! Transfer completed successfully.
</p>
<p
v-else-if="error"
class="result-text mt-1 text-danger"
>
{{ error }}
</p>
<p
v-else
class="result-text mt-1 text-primary"
>
Processing...
</p>
<div class="status">
<!-- <b-progress
:value="100"
:variant="progressColor"
:animated="isLoading"
/> -->
<b-progress :animated="isLoading">
<b-progress-bar
variant="success"
:value="progresBar[0]"
/>
<b-progress-bar
variant="danger"
:value="progresBar[1]"
/>
<b-progress-bar
variant="info"
:value="progresBar[2]"
/>
</b-progress>
<div class="status-text">
<span v-if="hash">SUBMITED</span>
<span v-if="succeed">COMPLETED</span>
<span v-if="error">FAILED</span>
</div>
</div>
<div class="link">
<router-link
to="/"
>
View details
</router-link>
</div>
</div>
</template>
<script>
import { BProgress, BProgressBar } from 'bootstrap-vue'
export default {
components: {
BProgress,
BProgressBar,
},
props: {
hash: {
type: String,
default: null,
},
},
data() {
return {
isLoading: true,
succeed: false,
error: '',
checkTimes: 0,
}
},
computed: {
progresBar() {
// success: [100, 0, 0]
// fail: [50, 50, 0]
// pending: [0, 0, 100]
if (!this.hash) {
return [0, 0, 100]
}
if (this.succeed) {
return [100, 0, 0]
}
return [50, 0, 50]
},
},
mounted() {
this.timer = setInterval(this.trace, 6000)
},
beforeDestroy() {
clearInterval(this.timer)
},
methods: {
trace() {
if (this.hash) {
this.error = null
this.$http.getTxs(this.hash).then(res => {
if (res.code === 0) {
this.succeed = true
clearInterval(this.timer)
window.location.reload()
} else if (res.code !== 3) { // code 3 is tx unconfirmed(not founded).
this.error = res.raw_log
clearInterval(this.timer)
}
}, () => {
// error statement
this.checkTimes += 1
if (this.checkTimes > 5) {
clearInterval(this.timer)
this.error = 'Timeout'
}
}).catch(e => {
this.error = e
clearInterval(this.timer)
})
}
},
},
}
</script>
<style lang="scss" scoped>
.board {
background: #f8f8f8;
border-radius: 8px;
padding: 0 12px;
margin: 35px 0;
.data {
padding: 10px 0;
border-bottom: 1px solid #607d8b;
}
.board-row {
display: flex;
justify-content: space-between;
font-size: 16px;
line-height: 34px;
.key {
color: #666;
}
.value {
font-weight: bold;
}
}
.sum {
display: flex;
justify-content: space-between;
font-size: 18px;
font-weight: bold;
padding: 15px 0;
}
}
.result-text {
text-align: center;
font-size: 16px;
}
.status {
margin-top: 30px;
.status-text {
display: flex;
justify-content: space-between;
margin-top: 20px;
font-weight: 500;
}
}
.link {
margin-top: 20px;
text-align: center;
a {
text-decoration: underline;
color: var(--purple)
}
}
</style>
@@ -0,0 +1,240 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Delegator"
label-for="Delegator"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Delegator"
>
<b-form-input
v-model="selectedAddress"
readonly
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<validation-provider
#default="{ errors }"
rules="required"
name="Validator"
>
<b-form-group
label="Validator"
label-for="validator"
>
<v-select
v-model="selectedValidator"
:options="valOptions"
:reduce="val => val.value"
placeholder="Select a validator"
:readonly="validatorAddress"
:selectable="(v) => v.value"
/>
</b-form-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Available Token"
label-for="Token"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Token"
>
<b-form-select
v-model="token"
text-field="label"
>
<b-form-select-option
v-for="x in balanceOptions"
:key="x.denom"
:value="x.denom"
>
{{ format(x) }}
</b-form-select-option>
</b-form-select>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Amount"
label-for="Amount"
>
<validation-provider
v-slot="{ errors }"
rules="required|regex:^([0-9\.]+)$"
name="amount"
>
<b-input-group>
<b-form-input
id="Amount"
v-model="amount"
:state="errors.length > 0 ? false:null"
placeholder="Input a number"
type="number"
/>
<b-input-group-append is-text>
{{ printDenom() }}
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BInputGroup, BFormInput, BFormGroup, BFormSelect, BFormSelectOption,
BInputGroupAppend,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken, formatTokenDenom, getUnitAmount,
} from '@/libs/utils'
import vSelect from 'vue-select'
export default {
components: {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
BFormSelect,
BFormSelectOption,
vSelect,
BInputGroupAppend,
ValidationProvider,
},
props: {
validatorAddress: {
type: String,
default: null,
},
address: {
type: String,
default: null,
},
balance: {
type: Array,
default: () => [],
},
},
data() {
return {
selectedAddress: this.address,
availableAddress: [],
validators: [],
unbundValidators: [],
selectedValidator: this.validatorAddress,
token: '',
amount: null,
selectedChain: '',
IBCDenom: {},
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
valOptions() {
let options = []
const vals = this.validators.map(x => ({ value: x.operator_address, label: `${x.description.moniker} (${Number(x.commission.rate) * 100}%)` }))
if (vals.length > 0) {
options.push({ value: null, label: '=== ACTIVE VALIDATORS ===' })
options = options.concat(vals)
}
const unbunded = this.unbundValidators.map(x => ({ value: x.operator_address, label: `* ${x.description.moniker} (${Number(x.commission.rate) * 100}%)` }))
if (unbunded.length > 0) {
options.push({ value: null, label: '=== INACTIVE VALIDATORS ===', disabled: true })
options = options.concat(unbunded)
}
return options
},
balanceOptions() {
return this.setupBalance()
},
msg() {
return [{
typeUrl: '/cosmos.staking.v1beta1.MsgDelegate',
value: {
delegatorAddress: this.selectedAddress,
validatorAddress: this.selectedValidator,
amount: {
amount: getUnitAmount(this.amount, this.token),
denom: this.token,
},
},
}]
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Delegate Token',
historyName: 'delegate',
})
this.loadData()
},
methods: {
loadData() {
this.$http.getValidatorList().then(v => {
this.validators = v
})
this.$http.getValidatorUnbondedList().then(v => {
this.unbundValidators = v
})
},
setupBalance() {
if (this.balance && this.balance.length > 0) {
this.token = this.balance[0].denom
return this.balance
}
return []
},
printDenom() {
return formatTokenDenom(this.token)
},
format(v) {
return formatToken(v, this.IBCDenom, 6)
},
},
}
</script>
<style lang="scss" scoped>
</style>
@@ -0,0 +1,194 @@
<template>
<div>
<b-row>
<b-col>
<h4>{{ proposalId }}. {{ proposalTitle }}</h4>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Depositor"
label-for="Voter"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Voter"
>
<b-form-input
v-model="address"
readonly
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Available Token"
label-for="Token"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Token"
>
<b-form-select
v-model="token"
>
<b-form-select-option
v-for="item in balanceOptions"
:key="item.denom"
:value="item.denom"
>
{{ format(item) }}
</b-form-select-option>
</b-form-select>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Amount"
label-for="Amount"
>
<validation-provider
v-slot="{ errors }"
rules="required|regex:^([0-9\.]+)$"
name="amount"
>
<b-input-group class="mb-25">
<b-form-input
id="Amount"
v-model="amount"
:state="errors.length > 0 ? false:null"
placeholder="Input a number"
type="number"
/>
<b-input-group-append is-text>
{{ printDenom() }}
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BInputGroup, BFormInput, BFormGroup, BFormSelect,
BInputGroupAppend, BFormSelectOption,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken, formatTokenDenom, getUnitAmount,
} from '@/libs/utils'
export default {
name: 'DepositDialogue',
components: {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
BFormSelect,
BInputGroupAppend,
BFormSelectOption,
ValidationProvider,
},
props: {
proposalId: {
type: Number,
required: true,
},
proposalTitle: {
type: String,
required: true,
},
balance: {
type: Array,
default: () => [],
},
address: {
type: String,
default: null,
},
},
data() {
return {
token: null,
amount: '',
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
msg() {
return [{
typeUrl: '/cosmos.gov.v1beta1.MsgDeposit',
value: {
depositor: this.address,
proposalId: String(this.proposalId),
amount: [
{
amount: getUnitAmount(this.amount, this.token),
denom: this.token,
},
],
},
}]
},
balanceOptions() {
return this.setupBalance()
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Deposit',
historyName: 'deposit',
})
},
methods: {
printDenom() {
return formatTokenDenom(this.token)
},
format(v) {
return formatToken(v)
},
setupBalance() {
if (this.balance && this.balance.length > 0) {
this.token = this.balance[0].denom
return this.balance
}
return []
},
},
}
</script>
<style lang="scss">
@import '@core/scss/vue/libs/vue-select.scss';
</style>
@@ -0,0 +1,307 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Sender"
label-for="Account"
>
<b-input-group class="mb-25">
<b-form-input
:value="address"
readonly
/>
</b-input-group>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Available Token"
label-for="Token"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Token"
>
<b-form-select
v-model="token"
@change="tokenChange"
>
<template #first>
<b-form-select-option
value=""
>
-- Please select a token --
</b-form-select-option>
</template>
<b-form-select-option
v-for="item in balance"
:key="item.denom"
:value="item.denom"
>
{{ format(item) }}
</b-form-select-option>
</b-form-select>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Amount"
label-for="Amount"
>
<validation-provider
v-slot="{ errors }"
rules="required|regex:^([0-9\.]+)$"
name="amount"
>
<b-input-group class="mb-25">
<b-form-input
id="Amount"
v-model="amount"
:state="errors.length > 0 ? false:null"
placeholder="Input a number"
type="number"
/>
<b-input-group-append is-text>
{{ printDenom() }}
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
:label="`Destination: ${targetChainId}`"
label-for="destination"
>
<validation-provider
#default="{ errors }"
rules="required"
name="destination"
>
<v-select
v-model="destination"
name="destination"
:options="destinationOptions"
placeholder="Select a channel"
@input="onChannelChange()"
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Recipient"
label-for="Recipient"
>
<validation-provider
#default="{ errors }"
rules="required"
name="recipient"
>
<b-input-group class="mb-25">
<b-form-input
id="Recipient"
v-model="recipient"
:state="errors.length > 0 ? false:null"
placeholder="Input a destination address"
/>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BInputGroup, BInputGroupAppend, BFormInput, BFormGroup, BFormSelect, BFormSelectOption,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken, formatTokenDenom, getUnitAmount,
} from '@/libs/utils'
import vSelect from 'vue-select'
import { coin } from '@cosmjs/amino'
import dayjs from 'dayjs'
import { toHex } from '@cosmjs/encoding'
import { sha256 } from '@cosmjs/crypto'
export default {
name: 'TransforDialogue',
components: {
BRow,
BCol,
BInputGroup,
BInputGroupAppend,
BFormInput,
BFormGroup,
BFormSelect,
BFormSelectOption,
vSelect,
ValidationProvider,
},
props: {
address: {
type: String,
default: '',
},
balance: {
type: Array,
default: () => [],
},
},
data() {
return {
targetChainId: '',
token: '',
amount: null,
recipient: null,
IBCDenom: {},
paths: {},
destination: {},
channels: [],
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
destinationOptions() {
if (!this.token && this.token === '') return []
const options = this.channels.map(x => ({ port_id: x.port_id, channel_id: x.channel_id, label: `${x.chain_id ? x.chain_id : ''} ${x.port_id}/${x.channel_id}` }))
if (this.token.startsWith('ibc/')) {
const query = this.paths[this.token]
return query ? options.filter(x => x.channel_id === query.channel_id) : options
}
return options
},
msg() {
const timeout = dayjs().add(4, 'hour')
return [
{
typeUrl: '/ibc.applications.transfer.v1.MsgTransfer',
value: {
sourcePort: this.destination.port_id,
sourceChannel: this.destination.channel_id,
token: coin(Number(getUnitAmount(this.amount, this.token)), this.token),
sender: this.address,
receiver: this.recipient,
timeoutTimestamp: String(timeout.utc().valueOf() * 1000000),
},
},
]
},
balanceOptions() {
return this.setupBalance()
},
selectedChain() {
return this.$store.state.chains.selected
},
},
mounted() {
this.$emit('update', {
modalTitle: 'IBC Transfer Tokens',
historyName: 'transfer',
})
this.setActionName()
this.loadData()
},
methods: {
loadData() {
this.destination = null
this.channels = []
this.token = ''
this.targetChainId = ''
if (this.address) {
this.$http.getAllIBCDenoms(this.selectedChain).then(x => {
x.denom_traces.forEach(trace => {
const hash = toHex(sha256(new TextEncoder().encode(`${trace.path}/${trace.base_denom}`)))
const ibcDenom = `ibc/${hash.toUpperCase()}`
// add base_denom to cache
this.$set(this.IBCDenom, ibcDenom, trace.base_denom)
// store channel/part for ibc denoms
const path = trace.path.split('/')
if (path.length >= 2) {
this.paths[ibcDenom] = {
channel_id: path[path.length - 1],
port_id: path[path.length - 2],
}
}
})
})
this.$http.getIBCChannels(this.selectedChain, null).then(ret => {
const chans = ret.channels.filter(x => x.state === 'STATE_OPEN').map(x => ({ channel_id: x.channel_id, port_id: x.port_id }))
this.$set(this, 'channels', chans)
})
}
},
setupBalance() {
if (this.balance && this.balance.length > 0) {
this.token = this.balance[0].denom
return this.balance
}
return []
},
tokenChange() {
// eslint-disable-next-line prefer-destructuring
this.destination = this.destinationOptions[0]
this.recipient = null
this.setActionName()
this.onChannelChange()
},
setActionName() {
this.$emit('update', {
actionName: this.token.startsWith('ibc') ? 'Withdraw' : 'Deposit',
})
},
format(v) {
return formatToken(v, this.IBCDenom)
},
printDenom() {
return formatTokenDenom(this.IBCDenom[this.token] || this.token)
},
onChannelChange() {
this.$http.getIBCChannelClientState(this.destination.channel_id, this.destination.port_id, this.selectedChain).then(cs => {
this.targetChainId = cs.identified_client_state.client_state.chain_id
})
},
},
}
</script>
<style lang="scss">
@import '@core/scss/vue/libs/vue-select.scss';
</style>
@@ -0,0 +1,239 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Delegator"
label-for="Account"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Delegator"
>
<b-form-input
v-model="address"
readonly
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="From Validator"
label-for="validator"
>
<v-select
:value="validatorAddress"
:options="valOptions"
:reduce="val => val.value"
placeholder="Select a validator"
:disabled="true"
/>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Current Delegation"
label-for="Token"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Token"
>
<v-select
v-model="token"
:options="tokenOptions"
:reduce="token => token.value"
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="To Validator"
label-for="validator"
>
<v-select
v-model="toValidator"
:options="valOptions"
:reduce="val => val.value"
placeholder="Select a validator"
:selectable="(v) => v.value"
/>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Amount"
label-for="Amount"
>
<validation-provider
v-slot="{ errors }"
rules="required|regex:^([0-9\.]+)$"
name="amount"
>
<b-input-group>
<b-form-input
id="Amount"
v-model="amount"
:state="errors.length > 0 ? false:null"
placeholder="Input a number"
type="number"
/>
<b-input-group-append is-text>
{{ printDenom() }}
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BInputGroup, BFormInput, BFormGroup,
BInputGroupAppend,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken, formatTokenDenom, getUnitAmount,
} from '@/libs/utils'
import vSelect from 'vue-select'
export default {
name: 'Redelegate',
components: {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
vSelect,
BInputGroupAppend,
ValidationProvider,
},
props: {
validatorAddress: {
type: String,
default: null,
},
address: {
type: String,
default: null,
},
},
data() {
return {
selectedAddress: this.address,
unbundValidators: [],
validators: [],
toValidator: null,
token: '',
amount: null,
delegations: [],
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
valOptions() {
let options = []
const vals = this.validators.map(x => ({ value: x.operator_address, label: `${x.description.moniker} (${Number(x.commission.rate) * 100}%)` }))
if (vals.length > 0) {
options.push({ value: null, label: '=== ACTIVE VALIDATORS ===' })
options = options.concat(vals)
}
const unbunded = this.unbundValidators.map(x => ({ value: x.operator_address, label: `* ${x.description.moniker} (${Number(x.commission.rate) * 100}%)` }))
if (unbunded.length > 0) {
options.push({ value: null, label: '=== INACTIVE VALIDATORS ===', disabled: true })
options = options.concat(unbunded)
}
return options
},
tokenOptions() {
if (!this.delegations) return []
return this.delegations.filter(x => x.delegation.validator_address === this.validatorAddress).map(x => ({ value: x.balance.denom, label: formatToken(x.balance) }))
},
msg() {
return [{
typeUrl: '/cosmos.staking.v1beta1.MsgBeginRedelegate',
value: {
delegatorAddress: this.address,
validatorSrcAddress: this.validatorAddress,
validatorDstAddress: this.toValidator,
amount: {
amount: getUnitAmount(this.amount, this.token),
denom: this.token,
},
},
}]
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Redelegate Token',
historyName: 'redelegate',
})
this.loadData()
},
methods: {
loadData() {
this.$http.getValidatorList().then(v => {
this.validators = v
})
this.$http.getValidatorUnbondedList().then(v => {
this.unbundValidators = v
})
this.$http.getStakingDelegations(this.address).then(res => {
this.delegations = res.delegation_responses
this.delegations.forEach(x => {
if (x.delegation.validator_address === this.validatorAddress) {
this.token = x.balance.denom
this.$emit('update', {
feeDenom: x.balance.denom,
})
}
})
})
},
format(v) {
return formatToken(v)
},
printDenom() {
return formatTokenDenom(this.token)
},
},
}
</script>
<style lang="scss">
@import '@core/scss/vue/libs/vue-select.scss';
</style>
@@ -0,0 +1,204 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Sender"
label-for="sender"
>
<b-input-group class="mb-25">
<b-form-input
name="sender"
:value="address"
readonly
/>
</b-input-group>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Recipient"
label-for="Recipient"
>
<validation-provider
#default="{ errors }"
rules="required"
name="recipient"
>
<b-input-group class="mb-25">
<b-form-input
id="Recipient"
v-model="recipient"
:state="errors.length > 0 ? false:null"
/>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Available Token"
label-for="Token"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Token"
>
<b-form-select
v-model="token"
>
<b-form-select-option
v-for="item in balanceOptions"
:key="item.denom"
:value="item.denom"
>
{{ format(item) }}
</b-form-select-option>
</b-form-select>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Amount"
label-for="Amount"
>
<validation-provider
v-slot="{ errors }"
rules="required|regex:^([0-9\.]+)$"
name="amount"
>
<b-input-group class="mb-25">
<b-form-input
id="Amount"
v-model="amount"
:state="errors.length > 0 ? false:null"
placeholder="Input a number"
type="number"
/>
<b-input-group-append is-text>
{{ printDenom() }}
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BInputGroup, BInputGroupAppend, BFormInput, BFormGroup, BFormSelect, BFormSelectOption,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken, formatTokenDenom, getUnitAmount,
} from '@/libs/utils'
export default {
name: 'TransforDialogue',
components: {
BRow,
BCol,
BInputGroup,
BInputGroupAppend,
BFormInput,
BFormGroup,
BFormSelect,
BFormSelectOption,
ValidationProvider,
},
props: {
address: {
type: String,
default: '',
},
balance: {
type: Array,
default: () => [],
},
},
data() {
return {
token: '',
amount: null,
recipient: '',
IBCDenom: {},
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
msg() {
return [
{
typeUrl: '/cosmos.bank.v1beta1.MsgSend',
value: {
fromAddress: this.address,
toAddress: this.recipient,
amount: [
{
amount: getUnitAmount(this.amount, this.token),
denom: this.token,
},
],
},
},
]
},
balanceOptions() {
return this.setupBalance()
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Transfer Tokens',
historyName: 'send',
})
},
methods: {
setupBalance() {
if (this.balance && this.balance.length > 0) {
this.token = this.balance[0].denom
return this.balance
}
return []
},
format(v) {
return formatToken(v, this.IBCDenom)
},
printDenom() {
return formatTokenDenom(this.IBCDenom[this.token] || this.token)
},
},
}
</script>
@@ -0,0 +1,197 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Delegator"
label-for="Account"
>
<b-form-input
v-model="address"
readonly
/>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Validator"
label-for="validator"
>
<v-select
:value="validatorAddress"
:options="valOptions"
:reduce="val => val.value"
placeholder="Select a validator"
:disabled="true"
/>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Current Delegation"
label-for="Token"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Token"
>
<v-select
v-model="token"
:options="tokenOptions"
:reduce="token => token.value"
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Amount"
label-for="Amount"
>
<validation-provider
v-slot="{ errors }"
rules="required|regex:^([0-9\.]+)$"
name="amount"
>
<b-input-group>
<b-form-input
id="Amount"
v-model="amount"
:state="errors.length > 0 ? false:null"
placeholder="Input a number"
type="number"
/>
<b-input-group-append is-text>
{{ printDenom() }}
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BInputGroup, BFormInput, BFormGroup, BInputGroupAppend,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken, formatTokenDenom, getUnitAmount,
} from '@/libs/utils'
import vSelect from 'vue-select'
export default {
name: 'UnbondDialogue',
components: {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
vSelect,
BInputGroupAppend,
ValidationProvider,
},
props: {
validatorAddress: {
type: String,
default: null,
},
address: {
type: String,
default: null,
},
},
data() {
return {
validators: [],
token: '',
amount: null,
delegations: [],
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
valOptions() {
return this.validators.map(x => ({ value: x.operator_address, label: `${x.description.moniker} (${Number(x.commission.rate) * 100}%)` }))
},
tokenOptions() {
if (!this.delegations) return []
return this.delegations.filter(x => x.delegation.validator_address === this.validatorAddress).map(x => ({ value: x.balance.denom, label: formatToken(x.balance) }))
},
msg() {
return [{
typeUrl: '/cosmos.staking.v1beta1.MsgUndelegate',
value: {
delegatorAddress: this.address,
validatorAddress: this.validatorAddress,
amount: {
amount: getUnitAmount(this.amount, this.token),
denom: this.token,
},
},
}]
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Unbond Token',
historyName: 'unbond',
})
this.loadData()
},
methods: {
loadData() {
if (this.address) {
this.$http.getValidatorList().then(v => {
this.validators = v
})
}
this.$http.getStakingDelegations(this.address).then(res => {
this.delegations = res.delegation_responses
this.delegations.forEach(x => {
if (x.delegation.validator_address === this.validatorAddress) {
this.token = x.balance.denom
this.$emit('update', {
feeDenom: x.balance.denom,
})
}
})
})
},
printDenom() {
return formatTokenDenom(this.token)
},
},
}
</script>
<style lang="scss">
@import '@core/scss/vue/libs/vue-select.scss';
</style>
@@ -0,0 +1,166 @@
<template>
<div>
<b-row>
<b-col>
<h4>{{ proposalId }}. {{ proposalTitle }}</h4>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Voter"
label-for="Account"
>
<validation-provider
#default="{ errors }"
rules="required"
name="Voter"
>
<b-form-input
v-model="address"
readonly
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row>
<b-col>
<b-form-group
label="Option"
label-for="option"
>
<validation-provider
#default="{ errors }"
rules="required"
name="option"
>
<div class="demo-inline-spacing">
<b-form-radio
v-model="option"
name="option"
value="1"
class="custom-control-success"
>
Yes
</b-form-radio>
<b-form-radio
v-model="option"
name="option"
value="3"
class="custom-control-warning"
>
No
</b-form-radio>
<b-form-radio
v-model="option"
name="option"
value="4"
class="custom-control-danger"
>
No With Veto
</b-form-radio>
<b-form-radio
v-model="option"
name="option"
value="2"
class="custom-control-secondary"
>
Abstain
</b-form-radio>
</div>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import { ValidationProvider } from 'vee-validate'
import {
BRow, BCol, BFormGroup, BFormInput,
BFormRadio,
} from 'bootstrap-vue'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
formatToken,
} from '@/libs/utils'
export default {
name: 'VoteDialogue',
components: {
BRow,
BCol,
BFormGroup,
BFormRadio,
ValidationProvider,
BFormInput,
},
props: {
proposalId: {
type: Number,
required: true,
},
proposalTitle: {
type: String,
required: true,
},
address: {
type: String,
default: null,
},
},
data() {
return {
option: null,
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
msg() {
return [{
typeUrl: '/cosmos.gov.v1beta1.MsgVote',
value: {
voter: this.address,
proposalId: this.proposalId,
option: Number(this.option),
},
}]
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Vote',
historyName: 'vote',
})
},
methods: {
format(v) {
return formatToken(v)
},
},
}
</script>
<style lang="scss">
@import '@core/scss/vue/libs/vue-select.scss';
</style>
@@ -0,0 +1,80 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Sender"
label-for="Account"
>
<b-input-group class="mb-25">
<b-form-input
:value="address"
readonly
/>
</b-input-group>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import {
BRow, BCol, BInputGroup, BFormInput, BFormGroup,
} from 'bootstrap-vue'
export default {
name: 'WithdrawDialogue',
components: {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
},
props: {
address: {
type: String,
default: '',
},
},
data() {
return {
account: [],
balance: [],
delegations: [],
feeDenom: '',
}
},
computed: {
msg() {
const txMsgs = []
this.delegations.forEach(i => {
txMsgs.push({
typeUrl: '/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward',
value: {
delegatorAddress: this.address,
validatorAddress: i.delegation.validator_address,
},
})
})
return txMsgs
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Withdraw Rewards',
historyName: 'withdraw',
})
this.loadData()
},
methods: {
loadData() {
this.$http.getStakingDelegations(this.address).then(res => {
this.delegations = res.delegation_responses
})
},
},
}
</script>
@@ -0,0 +1,84 @@
<template>
<div>
<b-row>
<b-col>
<b-form-group
label="Sender"
label-for="Account"
>
<b-input-group class="mb-25">
<b-form-input
:value="address"
readonly
/>
</b-input-group>
</b-form-group>
</b-col>
</b-row>
</div>
</template>
<script>
import {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
} from 'bootstrap-vue'
export default {
name: 'WithdrawCommissionDialogue',
components: {
BRow,
BCol,
BInputGroup,
BFormInput,
BFormGroup,
},
props: {
address: {
type: String,
default: '',
},
validatorAddress: {
type: String,
default: '',
},
},
data() {
return {
}
},
computed: {
msg() {
return [
{
typeUrl: '/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward',
value: {
delegatorAddress: this.address,
validatorAddress: this.validatorAddress,
},
},
{
typeUrl: '/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission',
value: {
validatorAddress: this.validatorAddress,
},
},
]
},
},
mounted() {
this.$emit('update', {
modalTitle: 'Withdraw Validator Commission',
historyName: 'withdraw',
})
},
methods: {
},
}
</script>
@@ -0,0 +1,431 @@
<template>
<b-modal
:id="modalId"
centered
size="md"
:title="modalTitle"
:ok-title="actionName"
scrollable
:hide-header-close="!showResult"
:hide-footer="showResult"
modal-class="custom-transaction-modal"
:ok-disabled="isOwner"
@hidden="resetModal"
@ok="handleOk"
@show="initialize"
>
<b-overlay
:show="isOwner"
rounded="sm"
>
<template #overlay>
<div class="text-center">
<b-avatar
icon="stopwatch"
font-scale="3"
animation="cylon"
/>
<p id="cancel-label">
{{ blockingMsg }}
</p>
<b-button
v-ripple.400="'rgba(255, 255, 255, 0.15)'"
variant="outline-primary"
to="/wallet/import"
>
Connect Wallet
</b-button>
</div>
</template>
<validation-observer
v-if="!showResult"
ref="simpleRules"
>
<b-form>
<component
:is="type"
ref="component"
:address="selectedAddress"
:validator-address="validatorAddress"
:balance="balance"
:proposal-id="proposalId"
:proposal-title="proposalTitle"
@update="componentUpdate"
/>
<b-row>
<b-col cols="12">
<b-form-group>
<b-form-checkbox
v-model="advance"
name="advance"
value="true"
>
<small>Advanced</small>
</b-form-checkbox>
</b-form-group>
</b-col>
</b-row>
<b-row v-if="advance">
<b-col cols="12">
<b-form-group
label="Fee"
label-for="Fee"
>
<validation-provider
v-slot="{ errors }"
rules="required|integer"
name="fee"
>
<b-input-group>
<b-form-input v-model="fee" />
<b-input-group-append>
<b-form-select
v-model="feeDenom"
:options="feeDenoms"
value-field="denom"
text-field="denom"
/>
</b-input-group-append>
</b-input-group>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
<b-col cols="12">
<b-form-group
label="Gas"
label-for="gas"
>
<validation-provider
v-slot="{ errors }"
name="gas"
>
<b-form-input
id="gas"
v-model="gas"
type="number"
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
<b-col cols="12">
<b-form-group
label="Memo"
label-for="Memo"
>
<validation-provider
v-slot="{ errors }"
name="memo"
>
<b-form-input
id="Memo"
v-model="memo"
max="2"
/>
<small class="text-danger">{{ errors[0] }}</small>
</validation-provider>
</b-form-group>
</b-col>
</b-row>
<b-row v-if="advance">
<b-col>
<wallet-input-vue v-model="wallet" />
</b-col>
</b-row>
</b-form>
{{ error }}
</validation-observer>
<TransactionResult
v-else
:hash="txHash"
/>
</b-overlay>
</b-modal>
</template>
<script>
import { ValidationProvider, ValidationObserver } from 'vee-validate'
import {
BAvatar, BModal, BRow, BCol, BInputGroup, BFormInput, BFormGroup, BFormSelect, BFormSelectOption,
BForm, BButton, BInputGroupAppend, BFormCheckbox, BOverlay,
} from 'bootstrap-vue'
import Ripple from 'vue-ripple-directive'
import {
required, email, url, between, alpha, integer, password, min, digits, alphaDash, length,
} from '@validations'
import {
extractAccountNumberAndSequence, getLocalAccounts, setLocalTxHistory, sign, timeIn,
} from '@/libs/utils'
import vSelect from 'vue-select'
import ToastificationContent from '@core/components/toastification/ToastificationContent.vue'
import WalletInputVue from '../WalletInput.vue'
import Delegate from './components/Delegate.vue'
import Redelegate from './components/Redelegate.vue'
import Withdraw from './components/Withdraw.vue'
import Unbond from './components/Unbond.vue'
import Transfer from './components/Transfer.vue'
import IBCTransfer from './components/IBCTransfer.vue'
import Vote from './components/Vote.vue'
import WithdrawCommission from './components/WithdrawCommission.vue'
import GovDeposit from './components/GovDeposit.vue'
import TransactionResult from './TransactionResult.vue'
export default {
name: 'DelegateDialogue',
components: {
BAvatar,
BModal,
BRow,
BCol,
BForm,
BInputGroup,
BFormInput,
BFormGroup,
BFormSelect,
BFormSelectOption,
BFormCheckbox,
vSelect,
BButton,
BInputGroupAppend,
BOverlay,
WalletInputVue,
ValidationProvider,
ValidationObserver,
// eslint-disable-next-line vue/no-unused-components
ToastificationContent,
Delegate,
Redelegate,
Withdraw,
Unbond,
Transfer,
IBCTransfer,
Vote,
WithdrawCommission,
GovDeposit,
TransactionResult,
},
directives: {
Ripple,
},
props: {
type: {
type: String,
default: '',
},
modalId: {
type: String,
default: 'operation-modal',
},
validatorAddress: {
type: String,
default: null,
},
address: {
type: String,
default: null,
},
proposalId: {
type: Number,
default: null,
},
proposalTitle: {
type: String,
default: null,
},
},
data() {
return {
modalTitle: '',
historyName: '',
selectedValidator: null,
selectedChain: null,
token: '',
chainId: '',
balance: [],
IBCDenom: {},
error: null,
sequence: 1,
accountNumber: 0,
advance: false,
fee: '900',
feeDenom: '',
wallet: 'ledgerUSB',
gas: '250000',
memo: '',
blockingMsg: this.address ? 'You are not the owner' : 'No available account found.',
actionName: 'Send',
showResult: false,
txHash: '',
required,
password,
email,
min,
integer,
url,
alpha,
between,
digits,
length,
alphaDash,
}
},
computed: {
feeDenoms() {
if (!this.balance) return []
return this.balance.filter(item => !item.denom.startsWith('ibc'))
},
accounts() {
const accounts = getLocalAccounts()
const selectedWallet = this.$store.state.chains.defaultWallet
return accounts[selectedWallet]
},
isOwner() {
if (this.accounts) {
this.updateWallet(this.accounts.device)
if (this.accounts.address.findIndex(x => x.addr === this.selectedAddress) > -1) {
return false
}
}
return true
},
selectedAddress() {
if (this.address) {
return this.address
}
const chain = this.$store.state.chains.selected.chain_name
const selectedAddress = this.accounts.address.find(x => x.chain === chain)
return selectedAddress?.addr
},
},
methods: {
initialize() {
this.$http.getLatestBlock().then(ret => {
this.chainId = ret.block.header.chain_id
const notSynced = timeIn(ret.block.header.time, 10, 'm')
if (notSynced) {
this.error = 'Client is not synced or blockchain is halted'
} else {
this.error = null
}
})
this.$http.getAuthAccount(this.selectedAddress).then(ret => {
const account = extractAccountNumberAndSequence(ret)
this.accountNumber = account.accountNumber
this.sequence = account.sequence
})
this.$http.getBankBalances(this.selectedAddress).then(res => {
if (res && res.length > 0) {
this.balance = res.reverse()
const token = this.balance.find(i => !i.denom.startsWith('ibc'))
this.token = token.denom
if (token) this.feeDenom = token.denom
}
})
this.fee = this.$store.state.chains.selected?.min_tx_fee || '1000'
this.feeDenom = this.$store.state.chains.selected?.assets[0]?.base || ''
},
componentUpdate(obj) {
Object.keys(obj).forEach(key => {
this[key] = obj[key]
})
},
handleOk(bvModalEvt) {
bvModalEvt.preventDefault()
this.$refs.simpleRules.validate().then(ok => {
if (ok) {
this.sendTx().then(ret => {
console.log(ret)
this.error = ret
})
}
})
},
resetModal() {
this.feeDenom = ''
this.error = null
this.showResult = false
},
async sendTx() {
const txMsgs = this.$refs.component.msg
if (txMsgs.length === 0) {
this.error = 'No delegation found'
return ''
}
if (!this.accountNumber) {
this.error = 'Account number should not be empty!'
return ''
}
const txFee = {
amount: [
{
amount: this.fee,
denom: this.feeDenom,
},
],
gas: this.gas,
}
const signerData = {
accountNumber: this.accountNumber,
sequence: this.sequence,
chainId: this.chainId,
}
sign(
this.wallet,
this.chainId,
this.selectedAddress,
txMsgs,
txFee,
this.memo,
signerData,
).then(bodyBytes => {
this.showResult = true
this.$http.broadcastTx(bodyBytes, this.selectedChain).then(res => {
this.txHash = res.tx_response.txhash
setLocalTxHistory({
chain: this.$store.state.chains.selected,
op: this.historyName,
hash: res.tx_response.txhash,
time: new Date(),
})
}).catch(e => {
console.log(e)
this.error = e
})
}).catch(e => {
console.log(e)
this.error = e
})
return ''
},
updateWallet(v) {
console.log('device', v)
if (v && v !== 'address') {
this.wallet = v
}
this.wallet = 'keplr'
},
},
}
</script>
<style lang="scss">
@import '@core/scss/vue/libs/vue-select.scss';
.custom-transaction-modal {
.modal-header {
.modal-title {
font-size: 24px;
}
.close {
margin: 0;
}
}
}
</style>
+7 -42
View File
@@ -73,22 +73,19 @@ export default {
return {
title: {
text: '',
left: '5%',
top: '3%',
},
legend: {
right: '10%',
top: '3%',
scroll: 'scroll',
data: assets,
textStyle: {
color: '#aaa',
},
top: 'top',
},
grid: { top: `${assets.length > 30 ? 30 : assets.length + 20}%` }, // */
xAxis: {
name: 'Qty',
nameLocation: 'center',
splitLine: {
lineStyle: {
type: 'dashed',
},
},
axisLabel: {
show: false,
formatter(param) {
@@ -105,41 +102,9 @@ export default {
return formatNumber(param, true, 0)
},
},
splitLine: {
lineStyle: {
type: 'dashed',
},
},
scale: true,
},
series,
// series: [
// {
// name: '',
// data: this.items.filter(x => x[1] > 0),
// type: 'scatter',
// symbolSize(data) {
// const r = Math.log10(data[2])
// return r * 5
// },
// emphasis: {
// focus: 'series',
// label: {
// show: true,
// formatter(param) {
// return `${param.data[3]}, ${formatNumber(param.data[2], true, 0)}`
// },
// position: 'top',
// },
// },
// itemStyle: {
// shadowBlur: 10,
// shadowColor: 'rgba(120, 36, 50, 0.5)',
// shadowOffsetY: 5,
// color: '#28c76f',
// },
// },
// ],
}
},
},
@@ -148,7 +113,7 @@ export default {
<style scoped>
.chart {
height: 300px;
min-height: 300px;
width: 100%;
}
</style>
+15
View File
@@ -1,4 +1,8 @@
const path = require('path')
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const productionGzipExtensions = ['js', 'css']
module.exports = {
publicPath: '/',
@@ -21,6 +25,17 @@ module.exports = {
'@axios': path.resolve(__dirname, 'src/libs/axios'),
},
},
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: 'static',
openAnalyzer: false,
}),
new CompressionWebpackPlugin({
test: new RegExp(`\\.(${productionGzipExtensions.join('|')})$`),
threshold: 8192,
minRatio: 0.8,
}),
],
},
chainWebpack: config => {
config.module
+232 -205
View File
@@ -1068,22 +1068,10 @@
resolved "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.26.5.tgz"
integrity sha512-VB4Z7lEIXA36q0RON15KexzEosToUtdDyMv7UXSBHSl4mLG/fIZgBIpBEYsaPZ1kh43xyINeKQJiGCp2z5rI+g==
"@cosmostation/cosmosjs@^0.10.6":
version "0.10.8"
resolved "https://registry.npmjs.org/@cosmostation/cosmosjs/-/cosmosjs-0.10.8.tgz"
integrity sha512-cR8ns+vlyB3i2mvNe5Ur3BHb/zuO3bPDmM4TfgOHSTJT5NtYbBXYiCcgeYto5tPJxKALmjwXXVwTZUy0C/u/aA==
dependencies:
ansi-regex "^5.0.1"
bech32 "^1.1.3"
bip32 "^2.0.5"
bip39 "^2.5.0"
bitcoinjs-lib "^4.0.2"
google-protobuf "^3.14.0"
lodash "^4.17.21"
node-fetch "^2.6.1"
protobufjs "^6.10.2"
request "^2.88.2"
secp256k1 "^3.8.0"
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
"@hapi/address@2.x.x":
version "2.1.4"
@@ -1311,6 +1299,22 @@
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@npmcli/fs@^1.0.0":
version "1.1.1"
resolved "https://registry.npmmirror.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
dependencies:
"@gar/promisify" "^1.0.1"
semver "^7.3.5"
"@npmcli/move-file@^1.0.1":
version "1.1.2"
resolved "https://registry.npmmirror.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
dependencies:
mkdirp "^1.0.4"
rimraf "^3.0.2"
"@nuxt/opencollective@^0.3.2":
version "0.3.2"
resolved "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.2.tgz"
@@ -1320,6 +1324,11 @@
consola "^2.15.0"
node-fetch "^2.6.1"
"@polka/url@^1.0.0-next.20":
version "1.0.0-next.21"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz"
@@ -1475,11 +1484,6 @@
resolved "https://registry.npmjs.org/@types/node/-/node-16.3.3.tgz"
integrity sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ==
"@types/node@10.12.18":
version "10.12.18"
resolved "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz"
integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
"@types/node@11.11.6":
version "11.11.6"
resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz"
@@ -2060,6 +2064,11 @@ acorn-walk@^7.1.1:
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
acorn-walk@^8.0.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz"
@@ -2080,11 +2089,24 @@ acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.0.4:
version "8.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
address@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz"
integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
dependencies:
clean-stack "^2.0.0"
indent-string "^4.0.0"
ajv-errors@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz"
@@ -2152,11 +2174,6 @@ ansi-regex@^5.0.0:
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
@@ -2468,13 +2485,6 @@ balanced-match@^1.0.0:
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base-x@^3.0.2:
version "3.0.8"
resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz"
integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
dependencies:
safe-buffer "^5.0.1"
base64-js@^1.0.2, base64-js@^1.3.0:
version "1.5.1"
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
@@ -2505,7 +2515,7 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
bech32@^1.1.2, bech32@^1.1.3, bech32@^1.1.4:
bech32@^1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz"
integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
@@ -2540,7 +2550,7 @@ binary-extensions@^2.0.0:
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bindings@^1.3.0, bindings@^1.5.0:
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
@@ -2552,42 +2562,6 @@ bip32-path@^0.4.2:
resolved "https://registry.npmjs.org/bip32-path/-/bip32-path-0.4.2.tgz"
integrity sha1-XbBBataCJxLwd4NuJVe4aXwMfJk=
bip32@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz"
integrity sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==
dependencies:
bs58check "^2.1.1"
create-hash "^1.2.0"
create-hmac "^1.1.7"
tiny-secp256k1 "^1.0.0"
typeforce "^1.11.5"
wif "^2.0.6"
bip32@^2.0.5:
version "2.0.6"
resolved "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz"
integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==
dependencies:
"@types/node" "10.12.18"
bs58check "^2.1.1"
create-hash "^1.2.0"
create-hmac "^1.1.7"
tiny-secp256k1 "^1.1.3"
typeforce "^1.11.5"
wif "^2.0.6"
bip39@^2.5.0:
version "2.6.0"
resolved "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz"
integrity sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==
dependencies:
create-hash "^1.1.0"
pbkdf2 "^3.0.9"
randombytes "^2.0.1"
safe-buffer "^5.0.1"
unorm "^1.3.3"
bip39@^3.0.2:
version "3.0.4"
resolved "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz"
@@ -2598,39 +2572,6 @@ bip39@^3.0.2:
pbkdf2 "^3.0.9"
randombytes "^2.0.1"
bip66@^1.1.0, bip66@^1.1.5:
version "1.1.5"
resolved "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz"
integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=
dependencies:
safe-buffer "^5.0.1"
bitcoin-ops@^1.3.0, bitcoin-ops@^1.4.0:
version "1.4.1"
resolved "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz"
integrity sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==
bitcoinjs-lib@^4.0.2:
version "4.0.5"
resolved "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.5.tgz"
integrity sha512-gYs7K2hiY4Xb96J8AIF+Rx+hqbwjVlp5Zt6L6AnHOdzfe/2tODdmDxsEytnaxVCdhOUg0JnsGpl+KowBpGLxtA==
dependencies:
bech32 "^1.1.2"
bip32 "^1.0.4"
bip66 "^1.1.0"
bitcoin-ops "^1.4.0"
bs58check "^2.0.0"
create-hash "^1.1.0"
create-hmac "^1.1.3"
merkle-lib "^2.0.10"
pushdata-bitcoin "^1.0.1"
randombytes "^2.0.1"
safe-buffer "^5.1.1"
tiny-secp256k1 "^1.0.0"
typeforce "^1.11.3"
varuint-bitcoin "^1.0.4"
wif "^2.0.1"
bluebird@^3.1.1, bluebird@^3.5.5, bluebird@^3.7.2:
version "3.7.2"
resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
@@ -2731,7 +2672,7 @@ brorand@^1.0.1, brorand@^1.1.0:
resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"
integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
@@ -2803,22 +2744,6 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6:
escalade "^3.1.1"
node-releases "^1.1.71"
bs58@^4.0.0:
version "4.0.1"
resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz"
integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
dependencies:
base-x "^3.0.2"
bs58check@<3.0.0, bs58check@^2.0.0, bs58check@^2.1.1:
version "2.1.2"
resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz"
integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
dependencies:
bs58 "^4.0.0"
create-hash "^1.1.0"
safe-buffer "^5.1.2"
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
@@ -2884,6 +2809,30 @@ cacache@^12.0.2, cacache@^12.0.3:
unique-filename "^1.1.1"
y18n "^4.0.0"
cacache@^15.0.5:
version "15.3.0"
resolved "https://registry.npmmirror.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
dependencies:
"@npmcli/fs" "^1.0.0"
"@npmcli/move-file" "^1.0.1"
chownr "^2.0.0"
fs-minipass "^2.0.0"
glob "^7.1.4"
infer-owner "^1.0.4"
lru-cache "^6.0.0"
minipass "^3.1.1"
minipass-collect "^1.0.2"
minipass-flush "^1.0.5"
minipass-pipeline "^1.2.2"
mkdirp "^1.0.3"
p-map "^4.0.0"
promise-inflight "^1.0.1"
rimraf "^3.0.2"
ssri "^8.0.1"
tar "^6.0.2"
unique-filename "^1.1.1"
cache-base@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz"
@@ -3087,6 +3036,11 @@ chownr@^1.1.1:
resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
chrome-trace-event@^1.0.2:
version "1.0.3"
resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz"
@@ -3122,6 +3076,11 @@ clean-css@4.2.x:
dependencies:
source-map "~0.6.0"
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
cleave.js@^1.4.7:
version "1.6.0"
resolved "https://registry.npmjs.org/cleave.js/-/cleave.js-1.6.0.tgz"
@@ -3297,6 +3256,11 @@ commander@^2.18.0, commander@^2.20.0:
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
commander@~2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz"
@@ -3329,6 +3293,17 @@ compressible@~2.0.16:
dependencies:
mime-db ">= 1.43.0 < 2"
compression-webpack-plugin@6.1.1:
version "6.1.1"
resolved "https://registry.npmmirror.com/compression-webpack-plugin/-/compression-webpack-plugin-6.1.1.tgz#ae8e4b2ffdb7396bb776e66918d751a20d8ccf0e"
integrity sha512-BEHft9M6lwOqVIQFMS/YJGmeCYXVOakC5KzQk05TFpMBlODByh1qNsZCWjUBxCQhUP9x0WfGidxTbGkjbWO/TQ==
dependencies:
cacache "^15.0.5"
find-cache-dir "^3.3.1"
schema-utils "^3.0.0"
serialize-javascript "^5.0.1"
webpack-sources "^1.4.3"
compression@^1.7.4:
version "1.7.4"
resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz"
@@ -3513,7 +3488,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
ripemd160 "^2.0.1"
sha.js "^2.4.0"
create-hmac@^1.1.0, create-hmac@^1.1.3, create-hmac@^1.1.4, create-hmac@^1.1.7:
create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
version "1.1.7"
resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
@@ -4044,16 +4019,7 @@ dotenv@^8.2.0:
resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz"
integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
drbg.js@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz"
integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=
dependencies:
browserify-aes "^1.0.6"
create-hash "^1.1.2"
create-hmac "^1.1.4"
duplexer@^0.1.1:
duplexer@^0.1.1, duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
@@ -4104,7 +4070,7 @@ electron-to-chromium@^1.3.723:
resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz"
integrity sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==
elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3:
elliptic@^6.5.3:
version "6.5.4"
resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
@@ -4927,6 +4893,13 @@ fs-extra@^7.0.1:
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
dependencies:
minipass "^3.0.0"
fs-write-stream-atomic@^1.0.8:
version "1.0.10"
resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz"
@@ -5110,11 +5083,6 @@ good-listener@^1.2.2:
dependencies:
delegate "^3.1.2"
google-protobuf@^3.14.0:
version "3.18.1"
resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.18.1.tgz"
integrity sha512-cDqSamZ8rGs+pOzhIsBte7wpezUKg/sggeptDWN5odhnRY/eDLa5VWLeNeQvcfiqjS3yUwgM+6OePCJMB7aWZA==
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.2.6"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz"
@@ -5128,6 +5096,13 @@ gzip-size@^5.0.0:
duplexer "^0.1.1"
pify "^4.0.1"
gzip-size@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==
dependencies:
duplexer "^0.1.2"
hammerjs@^2.0.8:
version "2.0.8"
resolved "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz"
@@ -5514,12 +5489,17 @@ imurmurhash@^0.1.4:
resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz"
integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
infer-owner@^1.0.3:
infer-owner@^1.0.3, infer-owner@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz"
integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
@@ -6513,11 +6493,6 @@ merge2@^1.2.3:
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
merkle-lib@^2.0.10:
version "2.0.10"
resolved "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz"
integrity sha1-grjbrnXieneFOItz+ddyXQ9vMyY=
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
@@ -6622,6 +6597,34 @@ minimist@^1.2.0, minimist@^1.2.5:
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minipass-collect@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
dependencies:
minipass "^3.0.0"
minipass-flush@^1.0.5:
version "1.0.5"
resolved "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
dependencies:
minipass "^3.0.0"
minipass-pipeline@^1.2.2:
version "1.2.4"
resolved "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
dependencies:
minipass "^3.0.0"
minipass@^3.0.0:
version "3.1.6"
resolved "https://registry.npmmirror.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
dependencies:
yallist "^4.0.0"
minipass@^3.1.1:
version "3.1.3"
resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz"
@@ -6629,6 +6632,14 @@ minipass@^3.1.1:
dependencies:
yallist "^4.0.0"
minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
dependencies:
minipass "^3.0.0"
yallist "^4.0.0"
mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz"
@@ -6660,7 +6671,7 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1:
dependencies:
minimist "^1.2.5"
mkdirp@^1.0.4:
mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@@ -6682,6 +6693,11 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
mrmime@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b"
integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
@@ -6729,7 +6745,7 @@ mz@^2.4.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
nan@^2.12.1, nan@^2.13.2, nan@^2.14.0:
nan@^2.12.1:
version "2.14.2"
resolved "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
@@ -7051,7 +7067,7 @@ open@^6.3.0:
dependencies:
is-wsl "^1.1.0"
opener@^1.5.1:
opener@^1.5.1, opener@^1.5.2:
version "1.5.2"
resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
@@ -7154,6 +7170,13 @@ p-map@^2.0.0:
resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz"
integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
p-map@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
dependencies:
aggregate-error "^3.0.0"
p-retry@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz"
@@ -7865,7 +7888,7 @@ protobufjs-dbx@^7.0.0:
"@types/node" "^10.1.0"
long "^4.0.0"
protobufjs@^6.10.2, protobufjs@^6.8.8, protobufjs@~6.10.2:
protobufjs@^6.8.8, protobufjs@~6.10.2:
version "6.10.2"
resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz"
integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==
@@ -7978,13 +8001,6 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
pushdata-bitcoin@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz"
integrity sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=
dependencies:
bitcoin-ops "^1.3.0"
q@^1.1.2:
version "1.5.1"
resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz"
@@ -8356,6 +8372,13 @@ rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
dependencies:
glob "^7.1.3"
rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"
@@ -8466,20 +8489,6 @@ schema-utils@^3.0.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
secp256k1@^3.8.0:
version "3.8.0"
resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz"
integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==
dependencies:
bindings "^1.5.0"
bip66 "^1.1.5"
bn.js "^4.11.8"
create-hash "^1.2.0"
drbg.js "^1.0.1"
elliptic "^6.5.2"
nan "^2.14.0"
safe-buffer "^5.1.2"
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
@@ -8545,6 +8554,13 @@ serialize-javascript@^4.0.0:
dependencies:
randombytes "^2.1.0"
serialize-javascript@^5.0.1:
version "5.0.1"
resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
dependencies:
randombytes "^2.1.0"
serve-index@^1.9.1:
version "1.9.1"
resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz"
@@ -8652,6 +8668,15 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
sirv@^1.0.7:
version "1.0.19"
resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49"
integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==
dependencies:
"@polka/url" "^1.0.0-next.20"
mrmime "^1.0.0"
totalist "^1.0.0"
slash@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz"
@@ -9199,6 +9224,18 @@ tapable@^1.0.0, tapable@^1.1.3:
resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
tar@^6.0.2:
version "6.1.11"
resolved "https://registry.npmmirror.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
minipass "^3.0.0"
minizlib "^2.1.1"
mkdirp "^1.0.3"
yallist "^4.0.0"
terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4:
version "1.4.5"
resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz"
@@ -9286,17 +9323,6 @@ tiny-emitter@^2.0.0:
resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz"
integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
tiny-secp256k1@^1.0.0, tiny-secp256k1@^1.1.3:
version "1.1.6"
resolved "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz"
integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==
dependencies:
bindings "^1.3.0"
bn.js "^4.11.8"
create-hmac "^1.1.7"
elliptic "^6.4.0"
nan "^2.13.2"
tmp@0.0.31:
version "0.0.31"
resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz"
@@ -9363,6 +9389,11 @@ toposort@^1.0.0:
resolved "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz"
integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
totalist@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df"
integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
@@ -9470,11 +9501,6 @@ typedarray@^0.0.6:
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typeforce@^1.11.3, typeforce@^1.11.5:
version "1.18.0"
resolved "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz"
integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.6"
resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz"
@@ -9565,11 +9591,6 @@ universalify@^0.1.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
unorm@^1.3.3:
version "1.6.0"
resolved "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz"
integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
@@ -9710,13 +9731,6 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
varuint-bitcoin@^1.0.4:
version "1.1.2"
resolved "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz"
integrity sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==
dependencies:
safe-buffer "^5.1.1"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
@@ -10077,6 +10091,21 @@ webpack-bundle-analyzer@^3.8.0:
opener "^1.5.1"
ws "^6.0.0"
webpack-bundle-analyzer@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5"
integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==
dependencies:
acorn "^8.0.4"
acorn-walk "^8.0.0"
chalk "^4.1.0"
commander "^7.2.0"
gzip-size "^6.0.0"
lodash "^4.17.20"
opener "^1.5.2"
sirv "^1.0.7"
ws "^7.3.1"
webpack-chain@^6.4.0:
version "6.5.1"
resolved "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz"
@@ -10150,7 +10179,7 @@ webpack-merge@^4.2.2:
dependencies:
lodash "^4.17.15"
webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1:
webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
version "1.4.3"
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz"
integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
@@ -10239,13 +10268,6 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
wif@^2.0.1, wif@^2.0.6:
version "2.0.6"
resolved "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz"
integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=
dependencies:
bs58check "<3.0.0"
word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
@@ -10309,6 +10331,11 @@ ws@^7:
resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz"
integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
ws@^7.3.1:
version "7.5.7"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
xmlcreate@^2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz"