增加wallet页面更新代币数量的功能

This commit is contained in:
cebgcontract 2022-03-18 11:04:33 +08:00
parent b68c00840f
commit 232c0f0f93
6 changed files with 100 additions and 49 deletions

View File

@ -121,18 +121,19 @@ export default class ChainManager {
}
public async getInstance(address: string, chainId: number) {
// 由于不同网络上的contract的address不会相同, 所以可以直接以address作为key来缓存
if (!this.instanceMap.has(address)) {
const key = `${chainId}_${address}`
if (!this.instanceMap.has(key)) {
const chain = new Chain(this.chainMap.get(chainId)!.rpc)
const coinInstance = await chain.getCoinInstance(address)
this.instanceMap.set(address, coinInstance)
this.instanceMap.set(key, coinInstance)
}
return this.instanceMap.get(address)
return this.instanceMap.get(key)
}
public async getBalance(address: string, chainId: number) {
const coinInstance = await this.getInstance(address, chainId)
const banlace = await coinInstance.methods.balanceOf(AppModule.accountId).call()
console.log('balance: ', banlace)
const balance = await coinInstance.methods.balanceOf(AppModule.accountId).call()
console.log('balance: ', balance)
return balance
}
}

View File

@ -3,9 +3,9 @@
<div class="content">
<div class="top">
<div class="topLeft">
<div class="name"><span>{{coinData.name}}({{coinData.symbol}})</span></div>
<div class="coin">{{coinData.amount}} {{coinData.symbol}}</div>
<div class="subCoin">{{coinData.price}} USD</div>
<div class="name"><span>{{coinData.name}}({{coinData.symbol.toUpperCase()}})</span></div>
<div class="coin">{{coinData.amount}} {{coinData.symbol.toUpperCase()}}</div>
<div class="subCoin" v-if="false">{{coinData.price}} USD</div>
</div>
<img draggable="false"
:src="coinData.icon"
@ -25,7 +25,7 @@ import { AppModule, DeviceType } from '@/store/modules/app'
export interface ICoinData{
name: string
symbol: string
amount: number
amount: number | string
icon: any
price: string|number
btnName: string

View File

@ -3,21 +3,22 @@
<div class="content">
<div class="name"><span>Other Currencies</span></div>
<template v-for="d in currencies">
<div class="coin" :key="d.name+'1'">{{d.amount}} {{d.name}}</div>
<div class="subCoin space" :key="d.name+'2'">{{d.price}} USD</div>
<div class="coin" :key="d.chain+'1'">{{d.amount}} {{d.name}}</div>
<div class="subCoin space" v-if="false" :key="d.chain+'2'">{{d.price}} USD</div>
</template>
<div class="wrongNetwork hide"><span>Wrong network</span></div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { Component, Prop, Vue } from 'vue-property-decorator'
import { AppModule, DeviceType } from '@/store/modules/app'
export interface ICurrentData{
name: string
amount: number
price: number
amount: number | string
price: number | string
chain: number
}
@Component({
@ -26,18 +27,7 @@ export interface ICurrentData{
}
})
export default class TotalBalance extends Vue {
private currencies: ICurrentData[] = [
{
name: 'WBNB',
amount: 1000,
price: 10000
},
{
name: 'WKCS',
amount: 1000,
price: 10000
}
]
@Prop() private currencies: ICurrentData[]
get mobile() {
return AppModule.device === DeviceType.Mobile

View File

@ -24,7 +24,7 @@
</div>
</div>
<div class="wallet">
<total-balance></total-balance>
<total-balance :currencies="currencies"></total-balance>
<coin-card v-for="d in coinList" :coin-data="d" :key="d.symbol"></coin-card>
</div>
<div class="header ingame"><span class="label">Ingame Currency</span>
@ -37,13 +37,15 @@
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import TotalBalance from '@/components/market/wallet/TotalBalance.vue'
import { Component, Vue, Watch } from 'vue-property-decorator'
import TotalBalance, { ICurrentData } from '@/components/market/wallet/TotalBalance.vue'
import CoinCard, { ICoinData } from '@/components/market/wallet/CoinCard.vue'
import GameCoinCard from '@/components/market/wallet/GameCoinCard.vue'
import { AppModule } from '@/store/modules/app'
import PlaceholderPanel from '@/components/market/wallet/PlaceholderPanel.vue'
import ChainManager from '@/chain/ChainManager'
import { CONTRACT_ADDRESS } from '@/configs/config_chain'
import { formatPrice } from '@/utils/chain.util'
@Component({
name: 'WalletPanel',
@ -55,7 +57,7 @@ import ChainManager from '@/chain/ChainManager'
}
})
export default class WalletPanel extends Vue {
private currentNet = this.nets[0].id
private currentNet: number = this.nets[0].id
chainManager = new ChainManager()
get nets() {
@ -66,22 +68,30 @@ export default class WalletPanel extends Vue {
return this.chainManager.isLogined
}
@Watch('logined')
private accountChange() {
this.updateBalanceSet()
this.updateCurrencies()
}
private currencies: ICurrentData[] = []
private coinList: ICoinData[] = [
{
name: 'CEBG Coin',
symbol: 'CEC',
amount: 100,
symbol: 'cec',
amount: '-',
icon: require('@/assets/market/cec.png'),
price: 100,
price: '-',
btnName: 'Deposit',
btnDisable: true
},
{
name: 'CEBG Gem',
symbol: 'CEG',
amount: 100,
symbol: 'ceg',
amount: '-',
icon: require('@/assets/market/ceg.png'),
price: 100,
price: '-',
btnName: 'Deposit',
btnDisable: true
}
@ -91,23 +101,40 @@ export default class WalletPanel extends Vue {
{
name: 'CEBG Coin',
symbol: 'gCEC',
amount: 100,
amount: '-',
icon: require('@/assets/market/cec.png'),
price: 100,
price: '-',
btnName: 'Claim',
btnDisable: true
},
{
name: 'CEBG Gem',
symbol: 'gCEG',
amount: 100,
amount: '-',
icon: require('@/assets/market/ceg.png'),
price: 100,
price: '-',
btnName: 'Claim',
btnDisable: true
}
]
created() {
for (const net of this.nets) {
this.currencies.push({
name: `W${net.symbol.toUpperCase()}`,
amount: '-',
price: '-',
chain: net.id
})
}
}
updateDefaultData(data: ICoinData) {
data.amount = '-'
data.price = '-'
data.btnDisable = true
}
get showAccount() {
return AppModule.accountShow
}
@ -134,6 +161,39 @@ export default class WalletPanel extends Vue {
changeNet(net: number) {
this.currentNet = net
for (let i = 0, l = this.coinList.length; i < l; i++) {
this.updateDefaultData(this.coinList[i])
this.$set(this.coinList, i, this.coinList[i])
}
this.updateBalanceSet()
}
async updateCurrencies() {
for (let i = 0, l = this.currencies.length; i < l; i++) {
const data = this.currencies[i]
const currentData = CONTRACT_ADDRESS[data.chain]
const eth = await this.chainManager.getBalance(currentData.eth, data.chain)
data.amount = eth
this.$set(this.currencies, i, data)
}
}
async updateBalanceSet() {
const currentData = CONTRACT_ADDRESS[this.currentNet]
if (currentData) {
const cec = await this.chainManager.getBalance(currentData.cec, this.currentNet)
const ceg = await this.chainManager.getBalance(currentData.ceg, this.currentNet)
console.log(formatPrice(cec, 18), formatPrice(ceg, 18))
const cecData = this.coinList[0]
cecData.amount = formatPrice(cec, 18)
cecData.btnDisable = cec === 0
this.$set(this.coinList, 0, cecData)
const cegData = this.coinList[1]
cegData.amount = formatPrice(ceg, 18)
cegData.btnDisable = ceg === 0
this.$set(this.coinList, 1, cegData)
}
}
}
</script>

View File

@ -72,7 +72,7 @@ export const AllChains = [
explorerurl: 'https://telos.net/'
},
{
name: 'Binance Smart Chain Mainnet RPC',
name: 'Binance Smart Chain',
type: 'Mainnet',
rpc: 'https://rpc.ankr.com/bsc',
logo: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI0LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMiAzMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzIgMzI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMDA5M0REO30KCS5zdDF7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KPGc+Cgk8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTEzLjUsMTZsNS4yLDUuM0wyMiwxOGMwLjYtMC42LDEuNS0wLjYsMiwwYzAsMCwwLDAsMCwwYzAuNiwwLjYsMC42LDEuNiwwLDIuMmwtNC4zLDQuNAoJCWMtMC42LDAuNi0xLjUsMC42LTIuMSwwYzAsMCwwLDAsMCwwbC02LjItNi40VjIyYzAsMC44LTAuNywxLjUtMS41LDEuNWMtMC44LDAtMS41LTAuNy0xLjUtMS41VjEwYzAtMC44LDAuNy0xLjUsMS41LTEuNQoJCWMwLjgsMCwxLjUsMC43LDEuNSwxLjV2My44bDYuMi02LjRjMC42LTAuNiwxLjUtMC42LDIuMSwwYzAsMCwwLDAsMCwwbDQuMyw0LjRjMC42LDAuNiwwLjYsMS42LDAsMi4yYy0wLjYsMC42LTEuNSwwLjYtMiwwCgkJYzAsMCwwLDAsMCwwbC0zLjMtMy40TDEzLjUsMTZ6IE0xOC43LDE0LjVjMC44LDAsMS41LDAuNywxLjUsMS41cy0wLjcsMS41LTEuNSwxLjVzLTEuNS0wLjctMS41LTEuNQoJCUMxNy4yLDE1LjIsMTcuOSwxNC41LDE4LjcsMTQuNXoiLz4KPC9nPgo8L3N2Zz4K',
@ -154,7 +154,7 @@ export const AllChains = [
explorerurl: 'https://testnet.hecoinfo.com/'
},
{
name: 'KCC Mainnet RPC',
name: 'KCC Mainnet',
type: 'Mainnet',
rpc: 'https://rpc-mainnet.kcc.network',
id: 321,
@ -163,7 +163,7 @@ export const AllChains = [
explorerurl: 'https://scan.kcc.network'
},
{
name: 'KCC Testnet RPC',
name: 'KCC Testnet',
type: 'Testnet',
logo: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI0LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMiAzMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzIgMzI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMDA5M0REO30KCS5zdDF7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KPGc+Cgk8Y2lyY2xlIGNsYXNzPSJzdDAiIGN4PSIxNiIgY3k9IjE2IiByPSIxNiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTEzLjUsMTZsNS4yLDUuM0wyMiwxOGMwLjYtMC42LDEuNS0wLjYsMiwwYzAsMCwwLDAsMCwwYzAuNiwwLjYsMC42LDEuNiwwLDIuMmwtNC4zLDQuNAoJCWMtMC42LDAuNi0xLjUsMC42LTIuMSwwYzAsMCwwLDAsMCwwbC02LjItNi40VjIyYzAsMC44LTAuNywxLjUtMS41LDEuNWMtMC44LDAtMS41LTAuNy0xLjUtMS41VjEwYzAtMC44LDAuNy0xLjUsMS41LTEuNQoJCWMwLjgsMCwxLjUsMC43LDEuNSwxLjV2My44bDYuMi02LjRjMC42LTAuNiwxLjUtMC42LDIuMSwwYzAsMCwwLDAsMCwwbDQuMyw0LjRjMC42LDAuNiwwLjYsMS42LDAsMi4yYy0wLjYsMC42LTEuNSwwLjYtMiwwCgkJYzAsMCwwLDAsMCwwbC0zLjMtMy40TDEzLjUsMTZ6IE0xOC43LDE0LjVjMC44LDAsMS41LDAuNywxLjUsMS41cy0wLjcsMS41LTEuNSwxLjVzLTEuNS0wLjctMS41LTEuNQoJCUMxNy4yLDE1LjIsMTcuOSwxNC41LDE4LjcsMTQuNXoiLz4KPC9nPgo8L3N2Zz4K',
rpc: 'https://rpc-testnet.kcc.network',

View File

@ -14,17 +14,17 @@ export const AVAILABLE_CHAINS = env === 'development' ? [322, 97] : [321, 32]
export const MALL_ADDRESS = '0xF278ff771F9E24968083B0bA54Cb42eb4B23C2d7'
export const CONTRACT_ADDRESS = {
export const CONTRACT_ADDRESS:{[key: number]: any} = {
322: {
cec: '0xfeFc3aab779863c1624eE008aba485c53805dCeb',
ceg: '0xE388e872e63aadF5a4F1521E4d96C10A28091457',
eth: '0xb296bab2ed122a85977423b602ddf3527582a3da',
mall: '0xF278ff771F9E24968083B0bA54Cb42eb4B23C2d7'
},
92: {
cec: '0xfeFc3aab779863c1624eE008aba485c53805dCeb',
ceg: '0xE388e872e63aadF5a4F1521E4d96C10A28091457',
eth: '0xb296bab2ed122a85977423b602ddf3527582a3da',
97: {
cec: '0xFAA03824c38Ed5102F9F901987FA7cd9d193449B',
ceg: '0xA70beE785B92d4F662F870Cf4f3EBE774234d795',
eth: '0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd',
mall: '0xF278ff771F9E24968083B0bA54Cb42eb4B23C2d7'
},
321: {